十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
*代表的是參數(shù)個數(shù)不確定的情況;帶一個星號(*)參數(shù)的函數(shù)傳人的參數(shù)存儲為一個元組(tuple);而帶兩個星號(*)參數(shù)的函數(shù)傳人的參數(shù)則存儲為一個字典(dict);由于傳入的參數(shù)個數(shù)不定,所以當與普通參數(shù)一同使用時,必須把帶星號的參數(shù)放在最后。
成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為呂梁等服務建站,呂梁等地企業(yè),進行企業(yè)商務咨詢服務。為呂梁企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
題主你好,
一般來說, python函數(shù)中有兩種形式的參數(shù): 位置參數(shù), 關鍵字參數(shù).
位置參數(shù): 說白了就是在函數(shù)調用時必傳的,你不給它賦值函數(shù)就運行不了.如:
從拿上圖例子來說, 在調用hello時,如果你只寫個hello(),肯定會報錯, 因為在執(zhí)行函數(shù)里面的print(name)時, 不知道name的值是多少.
所以對于上圖來說,hello("Jack"), hello("Mike")這都是正確的調法.
小結: 就上面的hello函數(shù)定義來說, name就叫做位置參數(shù). 說白了就是函數(shù)定義中,只有變量名的參數(shù)就是位置參數(shù)(如果這句話不理解,接著向下看完關鍵字參數(shù),一比較就明白了),而位置參數(shù)的特點是: 調用函數(shù)時必須要給它們傳值,原因上面已經說過 ? //def hello(a,b,c,d,e,f) 這里面a,b,c,d,e,f全都是位置參數(shù)
-----
關鍵字參數(shù): 首先它同位置參數(shù)一樣, 也是用在函數(shù)定義中. 其外在表現(xiàn)就是一具等式: "變量名=值". 舉例來說吧:
對比一下這個hello函數(shù), 和位置參數(shù)中的hello函數(shù)有啥不一樣,可以看到該hello函數(shù)中的參數(shù)為 name="張三",而位置參數(shù)中的hello函數(shù)參數(shù)為 name, 最大的區(qū)別在于函數(shù)調用時,
位置參數(shù)中你要使用 hello("名字")的形式進行調用, 而關鍵字參數(shù)中直接使用hello()不用加任何參數(shù). 原因也很好理解: 位置參數(shù)中name沒有默認值, 而關鍵字參數(shù)中,在聲明的時候就給name賦了一個默認值,"張三", 所以說在調用關鍵字參數(shù)中的hello函數(shù)時,即使我們不給name參數(shù)傳值,print(name)函數(shù)在執(zhí)行時會使用name的默認值, 整個邏輯是通的.
-----
總結一下位置參數(shù)和關鍵字參數(shù),共兩點:
1.從外觀看,位置參數(shù)就是一個變量名,如a,b,c,d等; 關鍵字參數(shù)表面看就是一個等式,如age=18, name="張三"等.
2.函數(shù)調用時,位置參數(shù)必須傳值;關鍵字參數(shù)可傳可不傳,傳值時用的是傳給它的這個值,不傳時,用的是在函數(shù)聲明時的那個默認值. //上面講關鍵字參數(shù)的時候,函數(shù)調用時只說了可以直接使用hello()調用,此時,name使用函數(shù)定義時的默認值,"張三". 這里再補一個使用自定義值的,即在講關鍵字參數(shù)的那個hello函數(shù)中, 我們還可以使用hello("王五"), hello("趙六")的形式進行調用,此時print(name)輸出的值就不再是默認的"張三"了, 而是我們自定義的"王五","趙六".
-----
通過上面的講解,應該能認出什么叫位置參數(shù),什么叫關鍵字參數(shù)了,其特征(一個是變量名, 一個是等式)和用法(一個是必須傳值,一個是可傳可不傳)應該也能明白了. 那么這里就再舉一個同時含有 位置參數(shù)和關鍵字參數(shù)的例子:
按照之前講的,調用person時,age必須要傳值,name可傳可不傳,所以調用形式可以是:
person(18), 也可以是person(18,"李四")? //同時把參數(shù)名加上進行調用也可以,即person(age=18,"李四"), person(age=18, name="李四"), person(18,name="李四")這都是合法的,當然如果看著亂,記住一種就好.
**.還有一點需要注意函數(shù)定義中,位置參數(shù)一定要位于關鍵字參數(shù)前,也就是說def person(name="張三",age)這么寫是錯誤的(對于這條約定我是這么理解的, 你想啊假如位置參數(shù)位于關鍵字參數(shù)前是可行的,則我們在調用person時,即使name就是默認值"張三",我們也要傳值, 因為如果你這么寫,person(18),則18會傳給person的第一個參數(shù)name,如果你寫person("張三",18)又麻煩了,因為name的默認值就是"張三', 但我覺得使用person(age=18)還可以理解呀,不管怎么樣吧,記住規(guī)矩就是這樣的.).
-----
下面就該引出題主問題中所謂的"不定長參數(shù)"了. 我感覺叫"任意數(shù)量的參數(shù)"更好理解一些,因為重點在于數(shù)量,而不在于長度.//至少如果我沒有看到你的實際題目,你說"不定長參數(shù)"我會理解為一個參數(shù)的值的長度不限, 而非可以有任意多個參數(shù).
為了迎合題主, 下面就稱"不定長參數(shù)"吧.
python中一般不定長參數(shù)有兩種類型,位置不定長參數(shù)和關鍵字不定長參數(shù), 其外在特征是:
位置不定長參數(shù)由一個星號+變量名組成: *var??? //var是我隨意寫的,可以是*a,*b,*any等
關鍵字不定長參數(shù)由兩個星號+變量名組成: **key? //同理,key也可以是任意名稱.
-----
不定長參數(shù)的出現(xiàn)其實就是為了增加函數(shù)的靈活性, 這個靈活性就體現(xiàn)在"可以表示任意多個參數(shù)位置參數(shù)和或關鍵字參數(shù)".
-----
最后再說回題主的問題:
def hh(w,**l,pu='d')
這個用法不對, pu='d'要放在**l前面,我說下原因:
先看一下hh這個函數(shù)中的參數(shù)類型有兩種, w是位置參數(shù); **l和pu='d'是關鍵字參數(shù).
因此w放在最前面沒毛病(位置參數(shù)要位于關鍵字參數(shù)前面), 而為什么pu='d'要放在**l前面呢,因為**l表示所有的關鍵字參數(shù)都要傳給l,所以如果pu='d'寫在**l后面,則pu='d'就不起作用了,因此不能這樣寫.
=====
希望可以幫到題主, 歡迎追問.
python中的函數(shù),大多需要配置參數(shù),以下是幾種函數(shù)的參數(shù)類型:
1.必備參數(shù):以正確的順序、個數(shù)傳入函數(shù)。調用時的參數(shù)情況要和聲明時一樣。最常用的情況。
def tplink(a,b):
c=a+b+b
return c?
tplink(4,2)
2.關鍵字參數(shù):使用關鍵字參數(shù)允許函數(shù)調用時參數(shù)的順序和聲明時不一致,因為python解析器會在調用函數(shù)時,用參數(shù)名匹配參數(shù)值。
def tplink(age1,age2):
ageall=age1+age2+age2
return ageall
tplink(age2=4,age1=2)
3.默認參數(shù):默認某個參數(shù)的取值
def tplink(age1,age2=5):
ageall=age1+age2+age2
return ageall
tplink(age1=4)
4.不定長參數(shù):在聲明時并不確定 調用時的參數(shù)數(shù)量。這種情況,可以用不定長參數(shù)進行解決,具體操作是在參數(shù)名前用*。
但不能和 關鍵字參數(shù)并用。一般在正常參數(shù)arg之后。
*args、**kwargs的定義:
這兩個都是python中的不定長參數(shù),又稱為可變參數(shù)。
*args 表示任何多個無名參數(shù),它是一個 tuple ;
**kwargs 表示關鍵字參數(shù),它是一個dict。
同時使用 * args和 ** kwargs 時,必須 * args參數(shù)列要在 ** kwargs前。且都在arg之后。
函數(shù)在調用時,會根據順序,看是否放進 *args 或者 **kwargs中。
具體可根據實際情況使用,可以 更方便靈活的接收信息。
==================================
將列表傳遞給函數(shù)后,函數(shù)就能直接訪問其內容
假設有一個用戶列表,要問候其中的每位用戶
將列表傳遞給函數(shù)后,函數(shù)就可對其進行修改,在函數(shù)中對這個列表所做的任何修改都是永久性的
一家為用戶提交的設計制作3D打印模型的公司,需要打印的設計存儲在一個列表中,打印后轉移到另一個列表中。
有時候需要禁止函數(shù)修改列表,為解決這個問題,可想向函數(shù)傳遞列表的副本而不是元件;這樣函數(shù)所做的任何修改都只影響副本,不影響元件
有時候,預先布置的函數(shù)需要接受多少個實參,python允許函數(shù)從調用語句中手機任意數(shù)量的實參
一個制作披薩的寒素,它需要接受很多配料,但無法確定顧客要多少種配料,下面函數(shù)只有一個形參*toppings,不管調用語句提供了多少實參,這個形參都將他們統(tǒng)統(tǒng)收入囊中
如果要讓函數(shù)接受不同類型的實參,必須在函數(shù)定義中將接納任意數(shù)量實參的形參放在最后
python先匹配位置實參和關鍵字實參,再將余下的實參收集到最后一個形參中
如果前邊的函數(shù)還需要一個表示披薩尺寸的實參,必須將該形參放在*toppings的前面
有時候,需要接受任意數(shù)量的實參,但預先不知道傳遞給函數(shù)的會是射門楊的信息,再這種情況下,可將函數(shù)編寫成能夠接受任意數(shù)量的鍵-值對,調用語句提供了多少就接受多少
創(chuàng)建用戶簡介:你知道你將收到有關用戶的信息,但不確定會是什么樣的信息,在下面示例中,build_profile()接受名和姓,同時還接受任意數(shù)量的關鍵字實參
Python中函數(shù)參數(shù)的定義主要有四種方式:
1. F(arg1,arg2,…)
這是最常見的定義方式,一個函數(shù)可以定義任意個參數(shù),每個參數(shù)間用逗號分割,用這種方式定義的函數(shù)在調用的的時候也必須在函數(shù)名后的小括號里提供個數(shù)相等
的值(實際參數(shù)),而且順序必須相同,也就是說在這種調用方式中,形參和實參的個數(shù)必須一致,而且必須一一對應,也就是說第一個形參對應這第一個實參。例如:
復制代碼代碼如下:
def a(x,y):print x,y
調用該函數(shù),a(1,2)則x取1,y取2,形參與實參相對應,如果a(1)或者a(1,2,3)則會報錯。
2. F(arg1,arg2=value2,…)
這種方式就是第一種的改進版,提供了默認值,例如:
復制代碼代碼如下:
def a(x,y=3):print x,y
調用該函數(shù),a(1,2)同樣還是x取1,y取2,但是如果a(1),則不會報錯了,這個時候x還是1,y則為默認的3。上面這倆種方式,還可以更換參數(shù)位置,比如a(y=4,x=3)用這種形式也是可以的。
3. F(*arg1)
上面兩種方式是有多少個形參,就傳進去多少個實參,但有時候會不確定有多少個參數(shù),則此時第三種方式就比較有用,它以一個*加上形參名的方式來表示這個函
數(shù)的實參個數(shù)不定,可能為0個也可能為n個。注意一點是,不管有多少個,在函數(shù)內部都被存放在以形參名為標識符的元組中。
復制代碼代碼如下:
def a(*x):print x
?
a(1,2,3)
(1, 2, 3)
a(x=1,y=2,z=3)
Traceback (most recent call last):
File "stdin", line 1, in module
TypeError: a() got an unexpected keyword argument 'x'
4. F(**arg1)
形參名前加兩個*表示,參數(shù)在函數(shù)內部將被存放在以形式名為標識符的dictionary中,這時調用函數(shù)的方法則需要采用arg1=value1,arg2=value2這樣的形式。
復制代碼代碼如下:
def a(**x):print x
?
a(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3} #存放在字典中
a(1,2,3) #這種調用則報錯
Traceback (most recent call last):
File "stdin", line 1, in module
TypeError: a() takes exactly 0 arguments (3 given)