本文目錄一覽:
Python函數里的默認參數和關鍵字參數有什麼區別
#有默認參數
#定義默認參數 age = 1, gender = ‘M’
def person( name, age = 1, gender=’M’):
print ‘name: %s age: %d gender: %s’ % (name, age, gender)
#這裡只傳一個值給第一個參數which is name, age 和 gender已經有默認值,
#就算不傳新值給 age or gender也沒問題
person(‘Jacky’)
#output — name: Jacky age: 1 gender: M
#沒有默認參數
def person(name, age, gender):
print ‘name: %s age: %d gender: %s’ % (name, age, gender)
# person(‘Jacky’) — error, 3個參數只傳了一個值
#沒有默認參數,就一定要傳 N(total 參數) 個值給 function.
person(‘Jacky’, 19, ‘M’)
******************************************************
#關鍵字參數
#用上面第一個例子 person( name, age=1, gender=’M’)
#用關鍵字給function傳值時,不雖要跟着順序來也沒問題
#就算 age 和 name 順序不同, 但因為是用關鍵字來傳值,所以沒問題
person( age=18, name=’Jacky’)
#output — name: Jacky age: 18 gender: ‘M’
person( gender=’F’, age=17, name=’Ashley’)
#output — name: Ashley age: 17 gender: ‘F’
# Error, 沒用關鍵字去傳值
# person( 20, ‘M’, ‘Jacky’) — 沒用關鍵字時,一定要按順序去傳值
i tried to explain as clear as i can….xP
Python的函數和參數
parameter 是函數定義的參數形式
argument 是函數調用時傳入的參數實體。
對於函數調用的傳參模式,一般有兩種:
此外,
也是關鍵字傳參
python的函數參數定義一般來說有五種: 位置和關鍵字參數混合 , 僅位置參數 , 僅關鍵字參數 , 可變位置參數 , 可變關鍵字參數 。其中僅位置參數的方式僅僅是一個概念,python語法中暫時沒有這樣的設計。
通常我們見到的函數是位置和關鍵字混合的方式。
既可以用關鍵字又可以用位置調用
或
這種方式的定義只能使用關鍵字傳參的模式
f(*some_list) 與 f(arg1, arg2, …) (其中some_list = [arg1, arg2, …])是等價的
網絡模塊request的request方法的設計
多數的可選參數被設計成可變關鍵字參數
有多種方法能夠為函數定義輸出:
非常晦澀
如果使用可變對象作為函數的默認參數,會導致默認參數在所有的函數調用中被共享。
例子1:
addItem方法的data設計了一個默認參數,使用不當會造成默認參數被共享。
python裏面,函數的默認參數被存在__default__屬性中,這是一個元組類型
例子2:
在例子1中,默認參數是一個列表,它是mutable的數據類型,當它寫進 __defauts__屬性中時,函數addItem的操作並不會改變它的id,相當於 __defauts__只是保存了data的引用,對於它的內存數據並不關心,每次調用addItem,都可以修改 addItem.__defauts__中的數據,它是一個共享數據。
如果默認參數是一個imutable類型,情況將會不一樣,你無法改變默認參數第一次存入的值。
例子1中,連續調用addItem(‘world’) 的結果會是
而不是期望的
關於python帶默認值的參數只能放在後面的問題
第一個那個*x是*args的意思,就是任意個參數,C++里的 va_arg,…符號這種,python函數里可以有*args和**kwargs。
*args之後可以隨便放有默認值的和沒有默認值的。
因為這之後的任何東西都得用」y=1「」z=1「這種來賦值。
比如說第一個函數,def fun(*x, y=4, z),我寫fun(1,2,3,4,5),這五個數全跑到*x里了。我想給y和z賦值必須要寫fun(1,2,3,4,5,y=6,z=7)。相當於z跟有默認值的那種也差不多了。所以規定可以把z放在*x後面的任何位置,包括y=4後面,它們的位置關係已經沒有用了。
規定def fun(x=4, y) y必須放在x前,就是要保留這種位置關係,要不我寫fun(1),你說這個1是給x的還是y的?就有了歧義。所以必須要有正確的位置關係。但是*x後面所有東西都是用參數名賦值的,位置關係不起作用了,所以可以任意順序了。
要理解規定背後的原因。同理,**kwargs放在最後,也是這個原因。消除歧義性。
Python中定義函數默認參數值的使用注意事項?
4.7.1. 默認參數值
最常用的一種形式是為一個或多個參數指定默認值。這會創建一個可以使用比定義是允許的參數更少的參數調用的函數,例如:
def ask_ok(prompt, retries=4, complaint=’Yes or no, please!’):
while True:
ok = input(prompt)
if ok in (‘y’, ‘ye’, ‘yes’):
return True
if ok in (‘n’, ‘no’, ‘nop’, ‘nope’):
return False
retries = retries – 1
if retries 0:
raise OSError(‘uncooperative user’)
print(complaint)
這個函數可以通過幾種不同的方式調用:
只給出必要的參數:
ask_ok(‘Do you really want to quit?’)
給出一個可選的參數:
ask_ok(‘OK to overwrite the file?’, 2)
或者給出所有的參數:
ask_ok(‘OK to overwrite the file?’, 2, ‘Come on, only yes or no!’)
這個例子還介紹了 in 關鍵字。它測定序列中是否包含某個確定的值。
默認值在函數 定義 作用域被解析,如下所示:
i = 5
def f(arg=i):
print(arg)
i = 6
f()
將會輸出 5。
重要警告: 默認值只被賦值一次。這使得當默認值是可變對象時會有所不同,比如列表、字典或者大多數類的實例。例如,下面的函數在後續調用過程中會累積(前面)傳給它的參數:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
這將輸出:
[1]
[1, 2]
[1, 2, 3]
如果你不想讓默認值在後續調用中累積,你可以像下面一樣定義函數:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/182111.html