python關鍵字參數
1. python中定義函數的關鍵字
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創建函數,這被叫做用戶自定義函數。
定義一個函數
可以定義一個由自己想要功能的函數,以下是簡單的規則:
1.函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括弧()。
2.任何傳入參數和自變數必須放在圓括弧中間。圓括弧之間可以用於定義參數。
3.函數的第一行語句可以選擇性地使用文檔字元串—用於存放函數說明。
4.函數內容以冒號起始,並且縮進。
5.return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
語法
Python 定義函數使用 def 關鍵字,一般格式如下:
1
2
def 函數名(參數列表):
函數體
默認情況下,參數值和參數名稱是按函數聲明中定義的順序匹配起來的。
示例
讓我們使用函數來輸出"Hello World!":
1
2
>>>def hello() :
print("Hello World!")
輸出結果
>>> hello()
Hello World!
2. Python 函數的關鍵字參數,為什麼不加引號
print_dict( a ='jack', b ='rose')
這是「調用」,調用的格式就這樣,語法要求的,沒有為什麼。跟後面是不是要把 a 作為一個 dict 的 key 沒關系。
3. 在Python函數中使用關鍵字參數時,怎樣按輸入的順序輸出
**kwargs 是一個 Dictionary. Dictionary 是無序的。
要想輸出有序,可以想一個排序的key函數,使你對 kwargs 的排序與輸入時的順序一致。
一種方法是直接把變數名按字母表順序寫進去,不過這樣輸入的順序就固定了,我覺得不是你想要的。
還有一種方法如下,需要你在寫參數時另外加一個由其他參數名稱組成的 tuple。這個 Tuple 中元素的順序就是你輸入參數的順序。
def test(**kwargs):
order = kwargs.get('order_list','')
if order:
sorted_keys = sorted([x for x in kwargs if x != 'order_list'],key=order.index)
for key in sorted_keys:
print '{0} = {1}'.format(key,kwargs[key])
else:
for key in kwargs:
print '{0} = {1}'.format(key,kwargs[key])
test(a=3,b=3,g=0,v=99,order_list=('a','b','g','v'))
4. python 函數變數 參數怎麼使用
剛學用Python的時候,特別是看一些庫的源碼時,經常會看到func(*args, **kwargs)這樣的函數定義,這個*和**讓人有點費解。其實只要把函數參數定義搞清楚了,就不難理解了。
先說說函數定義,我們都知道,下面的代碼定義了一個函數funcA
def funcA():
pass
顯然,函數funcA沒有參數(同時啥也不幹:D)。
下面這個函數funcB就有兩個參數了,
def funcB(a, b):
print a
print b
調用的時候,我們需要使用函數名,加上圓括弧擴起來的參數列表,比如 funcB(100, 99),執行結果是:
100
99
很明顯,參數的順序和個數要和函數定義中一致,如果執行funcB(100),Python會報錯的:
TypeError: funcB() takes exactly 2 arguments (1 given)
我們可以在函數定義中使用參數默認值,比如
def funcC(a, b=0):
print a
print b
在函數funcC的定義中,參數b有默認值,是一個可選參數,如果我們調用funcC(100),b會自動賦值為0。
OK,目前為止,我們要定義一個函數的時候,必須要預先定義這個函數需要多少個參數(或者說可以接受多少個參數)。一般情況下這是沒問題的,但是也有在定義函數的時候,不能知道參數個數的情況(想一想C語言里的printf函數),在Python里,帶*的參數就是用來接受可變數量參數的。看一個例子
def funcD(a, b, *c):
print a
print b
print "length of c is: %d " % len(c)
print c
調用funcD(1, 2, 3, 4, 5, 6)結果是
1
2
length of c is: 4
(3, 4, 5, 6)
我們看到,前面兩個參數被a、b接受了,剩下的4個參數,全部被c接受了,c在這里是一個tuple。我們在調用funcD的時候,至少要傳遞2個參數,2個以上的參數,都放到c里了,如果只有兩個參數,那麼c就是一個empty tuple。
好了,一顆星我們弄清楚了,下面輪到兩顆星。
上面的例子里,調用函數的時候,傳遞的參數都是根據位置來跟函數定義里的參數表匹配的,比如funcB(100, 99)和funcB(99, 100)的執行結果是不一樣的。在Python里,還支持一種用關鍵字參數(keyword argument)調用函數的辦法,也就是在調用函數的時候,明確指定參數值付給那個形參。比如還是上面的funcB(a, b),我們通過這兩種方式調用
funcB(a=100, b=99)
和
funcB(b=99, a=100)
結果跟funcB(100, 99)都是一樣的,因為我們在使用關鍵字參數調用的時候,指定了把100賦值給a,99賦值給b。也就是說,關鍵字參數可以讓我們在調用函數的時候打亂參數傳遞的順序!
另外,在函數調用中,可以混合使用基於位置匹配的參數和關鍵字參數,前題是先給出固定位置的參數,比如
def funcE(a, b, c):
print a
print b
print c
調用funcE(100, 99, 98)和調用funcE(100, c=98, b=99)的結果是一樣的。
好了,經過以上鋪墊,兩顆星總算可以出場了:
如果一個函數定義中的最後一個形參有 ** (雙星號)前綴,所有正常形參之外的其他的關鍵字參數都將被放置在一個字典中傳遞給函數,比如:
def funcF(a, **b):
print a
for x in b:
print x + ": " + str(b[x])
調用funcF(100, c='你好', b=200),執行結果
100
c: 你好
b: 200
大家可以看到,b是一個dict對象實例,它接受了關鍵字參數b和c。
5. Python方法的幾種常見參數類型
無默認值參數(關鍵字參數):
defmyfun(a):
print(a)
這是參數的最簡單形式。這個a就是無默認值參數。在調用函數時必需為無默認值參數指定值。
無默認值參數可以通過兩種方式來指定值:
#按參數定義順序不指名傳遞值
myfun('/src/image')
#無視定義順序,通過關鍵字指定值
myfun(a='/src/image')
無默認值參數在函數內部使用關鍵字作為變數名來訪問
無默認值參數可以有多個,也是一些其它參數類型的基礎。
默認值參數:
如果在定義時為參數指定一個默認值,那麼,這個參數就可以在調用時不指定值:
defmyfun(a=''):
print(a)
#不為a指定值
myfun()
#按定義順序為a指定值
myfun('/src/lib')
#通過關鍵字為a指定值
myfun(a='/src/lib')
在定義時,所有默認值參數只能出現在所有無默認值參數之後,也就是說,在函數的定義中,要先定義無默認值參數,再定義默認值參數。
不定長參數:
在參數名之前添加一個*號,則該參數稱為不定長參數。一個函數只可以有一個不定長參數。不定長參數的定義位置沒有限制,它可以定義在無默認值參數之間,也可以定義在默認值參數之後,或者它們之間的任何一個位置。
在調用時,不定長參數之後定義的無前兩種類型的參數就只能使用關鍵字來指定值了。
不定長參數在函數內部被處理為一個tuple。
def_max(*e,base=9):
print('called"_max":')
print('e:',e)
print('base:',base)
#只向不定長參數傳遞了值
#輸出:
#called"_max":
#e:(3,4,5)
#base:9
_max(3,4,5)
#也向默認值參數base傳遞了值
#輸出:
#called"_max":
#e:(3,4)
#base:5
_max(3,4,base=5)
#直接通過一個元組傳遞不定長參數的值
#輸出:
#called"_max":
#e:(3,4)
#base:5
p=(3,4)
_max(*p,base=5)
#使用混合方式傳遞不定長參數
#輸出:
#called"_max":
#e:(3,4,5,6,7)
#base:10
p1=(3,4)
p2=(6,7)
_max(*p1,5,*p2,base=10)
調用函數時如果沒有為不定長參數指定值,將導入一個空元組。
不定長關鍵字參數:
不定長關鍵字參數使用兩個星號作為前綴與其它類型的參數區分,它在函數內被導入為一個字典。調用時需要為不定長關鍵字參數給出約定的關鍵字名,賦值形式如同無默認值參數。
一般情況下,不定長參數是作為最後一個參數來定義。
defmyfun(**kw):
print(kw)
myfun(base=1,home='aaaa')
以上只是基本的調用方式,有些時候,可以有更有趣的調用方式,例如定義了一個既含無默認值參數也含默認值參數的函數:
defiter_dir(homedir,exts='*',includesubdir=False,monoinfile=False,
titlere='^[^^].*',textengine=default_textengine,
encode=None):
調用時也可以用這樣的方式來傳遞值:
kwgs={'homedir':'C:/Users/hunte/Documents/yun/阿瑟·C·克拉克',
'exts':'txt',
'includesubdir':True}
myiter=iter_dir(**kwgs)
forfileinmyiter:
pass
6. 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
7. python如何將可選參數或關鍵字參數從一個函數傳遞到另一個函數
使用函數參數列表中的*和**說明符收集參數;這會將位置參數作為元組,將關鍵字參數作為字典。然後,您可以使用*和**調用另一個函數時傳遞這些參數:
def f(x, *args, **kwargs):
...
kwargs['width'] = '14.3c'
...
g(x, *args, **kwargs)
8. python命名關鍵字參數時報錯
*city,這個是收集參數,一般放在普通關鍵字參數後面,不然報錯,因為收集參數已經把傳入的參數全部收集了,導致後面的關鍵字參數得不到參數傳值。
還有你給的手機參數是*,city,符號*不能單獨存在,要這么寫才行,*city
9. 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
#沒有默認參數
10. python函數,僅限關鍵字參數,但是調用時好像用了位置參數。這是為什麼呢
你理解錯了,*args說明可以傳遞可變個位置參數。而**keyargs才是可以傳遞可變個關鍵字參數的語法。而最後的那個sep="/"是默認參數,如果不傳遞就會使用默認值。
還有一種情況就是,使從某個位置以後的所有參數都為關鍵字參數,這可以使用*來實現,如:
##縮進格式看圖
def f(a,b,*,c,d):
print(a,b,c,d)
#這樣可以
f(1,2,c=3,d=4)
#這樣不行,c、d,
#只能用關鍵字參數來傳遞
f(1,2,3,4)