Python函數(shù)的參數(shù)類型主要包括必選參數(shù)、可選參數(shù)、可變參數(shù)、位置參數(shù)和關鍵字參數(shù),本文介紹一下他們的定義以及可變數(shù)據(jù)類型參數(shù)傳遞需要注意的地方。
為下城等地區(qū)用戶提供了全套網頁設計制作服務,及下城網站建設行業(yè)解決方案。主營業(yè)務為網站設計制作、成都網站制作、下城網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
必選參數(shù)(Required arguments)是必須輸入的參數(shù),比如下面的代碼,必須輸入2個參數(shù),否則就會報錯:
其實上面例子中的參數(shù) num1和num2也屬于關鍵字參數(shù),比如可以通過如下方式調用:
執(zhí)行結果:
可選參數(shù)(Optional arguments)可以不用傳入函數(shù),有一個默認值,如果沒有傳入會使用默認值,不會報錯。
位置參數(shù)(positional arguments)根據(jù)其在函數(shù)定義中的位置調用,下面是pow()函數(shù)的幫助信息:
x,y,z三個參數(shù)的的順序是固定的,并且不能使用關鍵字:
輸出:
在上面的pow()函數(shù)幫助信息中可以看到位置參數(shù)后面加了一個反斜杠 / ,這是python內置函數(shù)的語法定義,Python開發(fā)人員不能在python3.8版本之前的代碼中使用此語法。但python3.0到3.7版本可以使用如下方式定義位置參數(shù):
星號前面的參數(shù)為位置參數(shù)或者關鍵字參數(shù),星號后面是強制關鍵字參數(shù),具體介紹見強制關鍵字參數(shù)。
python3.8版本引入了強制位置參數(shù)(Positional-Only Parameters),也就是我們可以使用反斜杠 / 語法來定義位置參數(shù)了,可以寫成如下形式:
來看下面的例子:
python3.8運行:
不能使用關鍵字參數(shù)形式賦值了。
可變參數(shù) (varargs argument) 就是傳入的參數(shù)個數(shù)是可變的,可以是0-n個,使用星號( * )將輸入?yún)?shù)自動組裝為一個元組(tuple):
執(zhí)行結果:
關鍵字參數(shù)(keyword argument)允許將任意個含參數(shù)名的參數(shù)導入到python函數(shù)中,使用雙星號( ** ),在函數(shù)內部自動組裝為一個字典。
執(zhí)行結果:
上面介紹的參數(shù)可以混合使用:
結果:
注意:由于傳入的參數(shù)個數(shù)不定,所以當與普通參數(shù)一同使用時,必須把帶星號的參數(shù)放在最后。
強制關鍵字參數(shù)(Keyword-Only Arguments)是python3引入的特性,可參考:。 使用一個星號隔開:
在位置參數(shù)一節(jié)介紹過星號前面的參數(shù)可以是位置參數(shù)和關鍵字參數(shù)。星號后面的參數(shù)都是強制關鍵字參數(shù),必須以指定參數(shù)名的方式傳參,如果強制關鍵字參數(shù)沒有設置默認參數(shù),調用函數(shù)時必須傳參。
執(zhí)行結果:
也可以在可變參數(shù)后面命名關鍵字參數(shù),這樣就不需要星號分隔符了:
執(zhí)行結果:
在Python對象及內存管理機制中介紹了python中的參數(shù)傳遞屬于對象的 引用傳遞 (pass by object reference),在編寫函數(shù)的時候需要特別注意。
先來看個例子:
執(zhí)行結果:
l1 和 l2指向相同的地址,由于列表可變,l1改變時,l2也跟著變了。
接著看下面的例子:
結果:
l1沒有變化!為什么不是[1, 2, 3, 4]呢?
l = l + [4]表示創(chuàng)建一個“末尾加入元素 4“的新列表,并讓 l 指向這個新的對象,l1沒有進行任何操作,因此 l1 的值不變。如果要改變l1的值,需要加一個返回值:
結果:
下面的代碼執(zhí)行結果又是什么呢?
執(zhí)行結果:
和第一個例子一樣,l1 和 l2指向相同的地址,所以會一起改變。這個問題怎么解決呢?
可以使用下面的方式:
也可以使用淺拷貝或者深度拷貝,具體使用方法可參考Python對象及內存管理機制。這個問題在Python編程時需要特別注意。
本文主要介紹了python函數(shù)的幾種參數(shù)類型:必選參數(shù)、可選參數(shù)、可變參數(shù)、位置參數(shù)、強制位置參數(shù)、關鍵字參數(shù)、強制關鍵字參數(shù),注意他們不是完全獨立的,比如必選參數(shù)、可選參數(shù)也可以是關鍵字參數(shù),位置參數(shù)可以是必選參數(shù)或者可選參數(shù)。
另外,python中的參數(shù)傳遞屬于對象的 引用傳遞 ,在對可變數(shù)據(jù)類型進行參數(shù)傳遞時需要特別注意,如有必要,使用python的拷貝方法。
參考文檔:
--THE END--
在調用函數(shù)時,通常會傳遞參數(shù),函數(shù)內部的代碼保持不變,針對 不同的參數(shù)處理不同的數(shù)據(jù)。
有位置傳參、關鍵字傳參、默認值參數(shù)、多值參數(shù)等。
1、參數(shù)傳遞
形參和實參:
形參:定義 函數(shù)時的 參數(shù)變量
實參:調用 函數(shù)時,使用的參數(shù)變量
參數(shù)傳遞的過程,就是 把實參的引用 傳遞給 形參 ,使用實參的值來執(zhí)行函數(shù)體的過程。
在 Python 中,函數(shù)的 實參/返回值 都是是靠 引用 來傳遞來的
2、位置實參
按照參數(shù)位置,依次傳遞參數(shù),這是最普通的方式。
?
上一期我們學習參數(shù)傳遞怎么傳遞,也了解了參數(shù)的幾種類型。
首先,我們再來回顧一下,形參和實參:
形參是在定義函數(shù)時定義的,放在函數(shù)名后面的圓括號里,可為空
實參是調用函數(shù)時為形參傳入具體的參數(shù)值
簡單總結一下,誰調用函數(shù),誰就負責傳入?yún)?shù)。
好吶,本期我們來詳細學習函數(shù)幾種參數(shù)類型,大綱如下:
python函數(shù)的參數(shù)名是無意義的,Python允許在調用函數(shù)時通過通過名字來傳入?yún)?shù)值。
位置參數(shù):按照形參位置傳入的參數(shù)
調用函數(shù)時,實參默認按位置順序傳遞的。同時實參個數(shù)也要和形參匹配
舉一個小栗子
如果實參的個數(shù)與形參不匹配時,調用函數(shù)運行就會報錯
Python中,形參與調用函數(shù)緊密聯(lián)系在一起的。
關鍵字參數(shù):調用函數(shù)時,使形參名稱來傳遞參數(shù),形式為“形參名=實參”
關鍵字參數(shù),又叫命名參數(shù),傳遞時無需考慮參數(shù)位置和順序
舉一個小栗子
默認參數(shù):定義函數(shù)時,我們可以為形參提前設置具體的值。
在定義函數(shù)時,默認參數(shù)要放到位置等其他參數(shù)后面
在調用函數(shù)時,默認參數(shù)是可選的。如果傳入新值,則會覆蓋默認值
舉一個小栗子
注意,默認值不能位于位置參數(shù)前面,否則程序會報錯誤
不定長參數(shù)又名可變參數(shù)。
不定長參數(shù)指的是可變數(shù)量的參數(shù),分兩種情況:
如果不定長參數(shù)后面,可以新增參數(shù)嗎?
我們通過例子來看,會發(fā)生什么?
運行上面的程序,Python解釋器會報錯
原因是,形參a已經是不定長參數(shù),我們調用的test(2,3,4)傳入的三個實參,系統(tǒng)自動把它們屬于形參a的值,形參b 和形參c就等于沒有值傳入,這時候系統(tǒng)就認為,調用函數(shù)的對象,參數(shù)沒有傳夠。
為了解決這一報錯,python引入了 強制命名參數(shù)
規(guī)定,調用不定參數(shù)后面有跟位置參數(shù)的函數(shù)時,傳入給位置參數(shù)時,必須要強制命名參進行傳參。
逆向參數(shù)收集針對的對象傳入函數(shù)的實參
調用函數(shù)時,如果實參是元組,列表或者字典,通過在實參前面加入星號,可以自動把元素進行隔開,然后再轉入給函數(shù)進行處理
舉一個小栗子
本期,我們詳細學習了參數(shù)幾種類型,為后面我們學習函數(shù),打好基礎。
實踐是檢驗真理的過程,大家多動手練習練習,會有不一樣的奇妙旅程~
好吶,以上是本期內容,歡迎大佬們評論區(qū)指正~
parameter 是函數(shù)定義的參數(shù)形式
argument 是函數(shù)調用時傳入的參數(shù)實體。
對于函數(shù)調用的傳參模式,一般有兩種:
此外,
也是關鍵字傳參
python的函數(shù)參數(shù)定義一般來說有五種: 位置和關鍵字參數(shù)混合 , 僅位置參數(shù) , 僅關鍵字參數(shù) , 可變位置參數(shù) , 可變關鍵字參數(shù) 。其中僅位置參數(shù)的方式僅僅是一個概念,python語法中暫時沒有這樣的設計。
通常我們見到的函數(shù)是位置和關鍵字混合的方式。
既可以用關鍵字又可以用位置調用
或
這種方式的定義只能使用關鍵字傳參的模式
f(*some_list) 與 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等價的
網絡模塊request的request方法的設計
多數(shù)的可選參數(shù)被設計成可變關鍵字參數(shù)
有多種方法能夠為函數(shù)定義輸出:
非常晦澀
如果使用可變對象作為函數(shù)的默認參數(shù),會導致默認參數(shù)在所有的函數(shù)調用中被共享。
例子1:
addItem方法的data設計了一個默認參數(shù),使用不當會造成默認參數(shù)被共享。
python里面,函數(shù)的默認參數(shù)被存在__default__屬性中,這是一個元組類型
例子2:
在例子1中,默認參數(shù)是一個列表,它是mutable的數(shù)據(jù)類型,當它寫進 __defauts__屬性中時,函數(shù)addItem的操作并不會改變它的id,相當于 __defauts__只是保存了data的引用,對于它的內存數(shù)據(jù)并不關心,每次調用addItem,都可以修改 addItem.__defauts__中的數(shù)據(jù),它是一個共享數(shù)據(jù)。
如果默認參數(shù)是一個imutable類型,情況將會不一樣,你無法改變默認參數(shù)第一次存入的值。
例子1中,連續(xù)調用addItem('world') 的結果會是
而不是期望的
在開發(fā)中我們可以借助于相關插件或使用Python內置函數(shù)"help()”來查看某個函數(shù)的參數(shù)說明,以查看內置函數(shù)sorted()為例:
函數(shù)參數(shù)包括:必選參數(shù)、默認參數(shù)、可選參數(shù)、關鍵字參數(shù)。
1、默認參數(shù):放在必選參數(shù)之后,計算x平方的函數(shù):
這樣的話每次計算不同冪函數(shù)都要重寫函數(shù),非常麻煩,可使用以下代碼計算:
默認參數(shù)最大好處就是降低調用函數(shù)的難度。
2、可變參數(shù):就是傳入的參數(shù)個數(shù)是可變的,可以是1個、2個到任意個,還可以是0個,在參數(shù)前面加上*就是可變參數(shù)。在函數(shù)內部,參數(shù)numbers接收得到的是一個tuple,調用該函數(shù)時,可以傳入任意個參數(shù),包括0個參數(shù):
也可以類似可變參數(shù),先組裝一個dict,然后,把該dict轉換為關鍵字參數(shù)傳進去:
Python 函數(shù)定義以及參數(shù)傳遞
1.函數(shù)定義
#形如def func(args...):
doSomething123
以關鍵字def 開頭,后面是函數(shù)名和參數(shù)下面是函數(shù)處理過程。
舉例:
def add( a, b ):
return a+b12
參數(shù)可以設定默認值,如:
def add( a, b=10 ): #注意:默認值參數(shù)只會運算一次
return a+b12
默認值參數(shù)只會運算一次是什么意思?
def func( a, b=[] ): #b的默認值指向一個空的列表,每次不帶默認值都會指向這塊內存
b.append(a) return b
print(func(1))#向默認的空列表里加入元素1 ,默認列表里已經是[1]print(func(2))#向默認的列表里加入元素2,默認列表里已經是[1,2]print(func(3,[]))#向b指向的空列表里加入元素1 ,默認列表里還是[1,2]print(func(4))#向默認的列表里加入元素4,默認列表里已經是[1,2,4]'''
結果:
[1]
[1, 2]
[3]
[1, 2, 4]
'''12345678910111213141516
這下明白為什么默認參數(shù)只計算一次了吧,函數(shù)參數(shù)不傳遞時默認值總是指向固定的內存空間,就是第一次計算的空間。
2.參數(shù)傳遞
def func(a, b):
print('a=%d, b=%d' % (a,b) )12
在使用函數(shù)時可以如下方式,結果都是相同的
func(10,20) #不使用參數(shù)名,需要按參數(shù)順序傳遞func(a=10,b=20) #使用參數(shù)名可以不按順序傳遞func(b=20,a=10)#結果:a=10, b=20a=10, b=20a=10, b=201234567
如果函數(shù)定義形式如下方式:
def func(*args): #這種定義會把傳遞的參數(shù)包成元組
print(args,type(args))
func(10,20)#結果:#(10, 20) class 'tuple'1234567
舉一個和上述過程相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
a = (10, 20)
func(*a) #在調用函數(shù)使用`*`則會把元組解包成單個變量按順序傳入函數(shù)#結果:a=10, b=20123456
總結:*號在定義函數(shù)參數(shù)時,傳入函數(shù)的參數(shù)會轉換成元組,如果 *號在調用時則會把元組解包成單個元素。
另一種定義:
def func(**kw):#使用**定義參數(shù)會把傳入?yún)?shù)包裝成字典dict
print(kw, type(kw) )
func(a=10,b=20)#這種函數(shù)在使用時必須指定參數(shù)值,使用key=value這種形式#結果:{'b': 20, 'a': 10} class 'dict'12345
相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
d = {'a':10, 'b':20 }
func(**d) #在調用時使用**會把字典解包成變量傳入函數(shù)。12345
def func(*args, **kw):#這種形式的定義代表可以接受任意類型的參數(shù)
print(args,kw )12
總結:**號在定義函數(shù)參數(shù)時,傳入函數(shù)的參數(shù)會轉換成字典,如果 **號在調用時則會把字典解包成單個元素。
lambda表達式
lambda表達式就是一種簡單的函數(shù)
形如 f = lambda 參數(shù)1,參數(shù)2: 返回的計算值
例如:
add = lambda x,y: x+y
print(add(1,2))'''
結果:3
'''12345
網站標題:python里函數(shù)的參數(shù) python函數(shù)做參數(shù)
網站路徑:http://www.chinadenli.net/article8/docdgip.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站營銷、網站排名、外貿建站、定制網站、做網站、搜索引擎優(yōu)化
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)