Python學(xué)習(xí)筆記
Day_06-函數(shù)(二)
上節(jié)學(xué)習(xí)了函數(shù)的一些基本知識和用法。這一節(jié)繼續(xù)學(xué)習(xí)函數(shù)參數(shù)的傳遞方面的知識彻舰。
6.1 基本傳參
1、位置(position)傳參
首先我來定義一個函數(shù),說明一下位置傳參的意思束莫。
例:
"""
python學(xué)習(xí)筆記-day06
函數(shù)的一些知識及用法髓废。
version:0.2
author:chris
公眾號:穎川河
"""
def num_plus(a, b, c):
"""calculate the sum of a , b and c """
d = a + b + c
print(a, b, c)
return d
print(num_plus(11, 12, 22))
print(num_plus(22, 11, 12))
print(num_plus(12, 22, 11))
輸出結(jié)果如下:
11 12 22
45
22 11 12
45
12 22 11
45
從上述例題中可以看出巷懈,參數(shù)是按照定義函數(shù)時的形參的順序被調(diào)用的,雖然結(jié)果一樣慌洪,但是參數(shù)的位置或者所對應(yīng)的實參事不一致的顶燕。
2、關(guān)鍵字(Keyword)傳參
關(guān)鍵字傳參的意思是冈爹,在單數(shù)調(diào)用的時候涌攻,將形參作為傳參的關(guān)鍵字,這樣雖然實參的順序發(fā)生變化频伤,也不影響實參的值恳谎。還是用上面的例子說明一下:
def num_plus(a, b, c):
"""calculate the sum of a and b """
d = a + b + c
print(a, b, c)
return d
print(num_plus(11, c=12, b=22))
print(num_plus(b=22, a=11, c=12))
print(num_plus(b=12, a=22, c=11))
輸出結(jié)果如下:
11 22 12
45
11 22 12
45
22 12 11
45
上面的例子中可以看出,函數(shù)調(diào)用過程中傳參的時候憋肖,我門指定了關(guān)鍵字因痛,那么在函數(shù)調(diào)用進(jìn)行計算的時候,就嚴(yán)格按照關(guān)鍵字進(jìn)行計算岸更,而且鸵膏,以第二個print(num_plus(b=22, a=11, c=12))
為例可以看出,指定關(guān)鍵字后實參的順序是可以打亂的怎炊。但是较性,需要注意的是,如果位置傳參和關(guān)鍵字傳參同時使用的時候结胀,第一個位置的實參必須是位置傳參赞咙,就像print(num_plus(11, c=12, b=22))
是正確的,而如果換成print(num_plus(a=11, 12, b=22))
就會報錯糟港,提示你在一個位置參數(shù)前面出現(xiàn)了關(guān)鍵字參數(shù)攀操。
6.2 包裹(packing)傳參
這種傳參的說法是我看Vamei大神說的,菜鳥教程中的說法是不定長傳參秸抚。暫且先按照Vamei大神的說法速和。
上面的傳參方式要求在定義函數(shù)的時候定義參數(shù)的個數(shù)歹垫,但是實際應(yīng)用的過程中,往往不需要確定參數(shù)的個數(shù)颠放。這個時候就需呀用到包裹(packing)傳參的方式排惨。
同基本傳參,包裹傳參也包括位置傳參和關(guān)鍵字傳參碰凶。
1暮芭、位置傳參
還是以一個例子來說明,代碼如下:
def pack_position(*numbers):
print(type(numbers))
print(numbers)
print(pack_position(1, 4, 9))
print(pack_position(1, 6, 3, 5, 7, 8))
輸出結(jié)果如下:
<class 'tuple'>
(1, 4, 9)
None
<class 'tuple'>
(1, 6, 3, 5, 7, 8)
None
從結(jié)果中我們可以看到欲低,定義函數(shù)時辕宏,通過在形參前面加*
,就可以定義一個長度可變的參數(shù)砾莱。函數(shù)調(diào)用的時候瑞筐,可以給定不同長度或者不同個數(shù)的實參,輸出后會將這些實參包裹進(jìn)一個元組中腊瑟。
2聚假、關(guān)鍵字傳參
同理,包裹傳參中也有關(guān)鍵字傳參闰非。它的用法時在定義函數(shù)時的形參前面加兩個*
來實現(xiàn)魔策。
代碼如下:
def pack_keyword(**numbers):
print(type(numbers))
print(numbers)
print(pack_keyword(a=12, b=2))
print(pack_keyword(a=1, b=4, c=6, d=17))
輸出結(jié)果如下:
<class 'dict'>
{'a': 12, 'b': 2}
None
<class 'dict'>
{'a': 1, 'b': 4, 'c': 6, 'd': 17}
None
唉,這就看出來區(qū)別了河胎。定義函數(shù)的時候闯袒,在形參前加**
,就是告訴函數(shù)游岳,這是一個個數(shù)不定的形參政敢,函數(shù)調(diào)用的時候,需要通過關(guān)鍵詞來調(diào)用胚迫。調(diào)用后喷户,函數(shù)會將實參包裹進(jìn)一個dict,關(guān)鍵詞是鍵key访锻,數(shù)值就是值value褪尝。
6.3 混合傳參
python中規(guī)定,函數(shù)定義的時候期犬,不同類型的形參可以混合使用河哑,即可以將位置、關(guān)鍵字龟虎、包裹位置璃谨、包裹關(guān)鍵字混合使用。
例如:
def mix_argument(a, b, *position, **keyword):
print(a, b)
print(position)
print(keyword)
print(mix_argument(1, 2, 4, 6, 8, d=9, e=11, f=22))
輸出結(jié)果如下:
1 2
(4, 6, 8)
{'d': 9, 'e': 11, 'f': 22}
需要注意的是,當(dāng)進(jìn)行混合傳參的時候佳吞,必須嚴(yán)格按照位置-關(guān)鍵字-包裹位置-包裹關(guān)鍵字的順序拱雏,否則程序會報錯。
6.4 小結(jié)
本次學(xué)習(xí)了函數(shù)參數(shù)的傳遞和調(diào)用底扳,接下來我將學(xué)習(xí)匿名函數(shù)lambda的用法铸抑。