python可變參數函數
㈠ 在python中,函數定義為def+vfun(a,**b):……,則可變參數b的類型是
在函數的參數列表裡,參數名前帶兩個"*"的參數是字典類型。vfun函數的調用里,a後的參數都必須使用關鍵字傳參,它們作為鍵值對存到字典b
㈡ 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。
㈢ python可變參數求和
在Python函數中,還可以定義可變參數。顧名思義,可變參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。
我們以數學題為例子,給定一組數字a,b,c……,請計算a^2 + b^2 + c^2 + ……。
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
定義可變參數和定義一個list或tuple參數相比,僅僅在參數前面加了一個*號。在函數內部,參數numbers接收到的是一個tuple,因此,函數代碼完全不變。但是,調用該函數時,可以傳入任意個參數,包括0個參數:
>>> calc(1, 2)
5
>>> calc()
0
㈣ python 可變參數函數 怎麼做加法
函數add應該這樣定義:
每個=表示一個空格
def add(*a):
====s=0
====for b in a:
========s+=b
====return s
㈤ 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編程題:編寫函數,利用可變參數計算一組數的最大值
一行即可,排下序,取最後一個即可~
def maxnum(*nums):
return sorted(nums)[-1]
print(maxnum(-1, 34, -9, 56))#56
print(maxnum(1, 4, 6, 95, 3, 78))#95
㈦ python中定義函數時如何書寫可變參數和默認參數
參數名前面加*是可變位置參數,
加**是可變關鍵字參數;
參數名=默認值可以用來為參數指定默認值。
下面是一個例子:
#/使前面的參數成為僅僅是位置參數
def f(a=1,b=2,/,c=3,*args,**kwargs):print(a,b,c,*args,kwargs)
def f2(a=1,b=2,c=3,*args,**kwargs):print(a,b,c,*args,kwargs)
#*使後面的參數成為僅僅是關鍵字參數
def f3(a=1,b=2,*,c=3,d=4):print(a,b,c,d)
#/使前面的參數成為僅僅是位置參數
def f4(a=1,b=2,/,c=3,d=4):print(a,b,c,d)
f()
f(11,22)
#f(a=11,b=22)
f(c=666)
f(1,2,3,4,5,x=5,y=6)
f2()
f2(a=11,b=22)
f2(c=888)
f2("a","b","c",1,2,p="ok")
f3(1001,2222)
f3(a=1001)
f3(111,c=333,d=444)
f3(6,6,c=6,d=6)
#f3(6,6,6,6)
f4(1001,2222)
#f4(1001,b=2222)
f4(1001)
#f4(a=1001)
f4(111,c=333,d=444)
f4(1,2,3,4)
運行結果截圖如下:
㈧ python-函數可變參數類型
python中的函數,大多需要配置參數,以下是幾種函數的參數類型:
1.必備參數:以正確的順序、個數傳入函數。調用時的參數情況要和聲明時一樣。最常用的情況。
def tplink(a,b):
c=a+b+b
return c
tplink(4,2)
2.關鍵字參數:使用關鍵字參數允許函數調用時參數的順序和聲明時不一致,因為python解析器會在調用函數時,用參數名匹配參數值。
def tplink(age1,age2):
ageall=age1+age2+age2
return ageall
tplink(age2=4,age1=2)
3.默認參數:默認某個參數的取值
def tplink(age1,age2=5):
ageall=age1+age2+age2
return ageall
tplink(age1=4)
4.不定長參數:在聲明時並不確定 調用時的參數數量。這種情況,可以用不定長參數進行解決,具體操作是在參數名前用*。
但不能和 關鍵字參數並用。一般在正常參數arg之後。
*args、**kwargs的定義:
這兩個都是python中的不定長參數,又稱為可變參數。
*args 表示任何多個無名參數,它是一個 tuple ;
**kwargs 表示關鍵字參數,它是一個dict。
同時使用 * args和 ** kwargs 時,必須 * args參數列要在 ** kwargs前。且都在arg之後。
函數在調用時,會根據順序,看是否放進 *args 或者 **kwargs中。
具體可根據實際情況使用,可以 更方便靈活的接收信息。
㈨ python 帶可變參數的裝飾器怎麼用
裝飾器本身是用來是為一個函數是實現新的功能,並且不改變原函數的代碼以及調用方式。
遇到這樣一種問題:
眾多函數調用了你寫的裝飾器,但客戶有需求說,我想實現我可以隨之控制裝飾器是否生效。
那你就不可能在得到命令的時候去原函數頭部去做刪除和添加裝飾器調用的命令。這是就可以用到帶參數的裝飾器,定義一個開關,調用裝飾器的時候,把這個裝飾器的開關參數給傳遞進去,這樣當開關打開的時候裝飾器生效,關閉的時候則只執行原函數的代碼。
舉例:開關參數為True的時候執行過程:
F=True#step1裝飾器的開關變數
defouter(flag):#step2
defwrapper(func):#step4
definner(*args,**kwargs):#stpe6
ifflag:#step9
print('before')#step10
ret=func(*args,**kwargs)#step11執行原函數
print('after')#step13
else:
ret=func(*args,**kwargs)
print('123')
returnret#step14
returninner#step7
returnwrapper#step5
@outer(F)#先執行step3:outer(True)這個函數,然後step6:@wrapper#此處把開關參數傳遞給裝飾器函數
defhahaha():
pass#step12
hahaha()#step8相當於inner()
開關參數為False的時候執行過程:
F=False#stpe1裝飾器的開關變數
defouter(flag):#step2
defwrapper(func):#step4
definner(*args,**kwargs):#stpe6
ifflag:#step9
print('before')
ret=func(*args,**kwargs)
print('after')
else:
ret=func(*args,**kwargs)#step10執行原函數
print('123')#step12
returnret#step13
returninner#step7
returnwrapper#step5
㈩ Python的位置參數、默認參數、關鍵字參數、可變參數區別
對於python函數參數,對於初學者可能就是進入了迷宮,盡管我也是初學者,簡單總結一下。
說參數之前,先講一下兩個packing(包裹)和unpacking(解包裹):
輸出:
我總結不了這個概念,只能幫大家到這了
一、位置參數和關鍵字參數:
調用函數時根據函數定義的參數位置來傳遞參數。
注意:
有位置參數時,位置參數必須在關鍵字參數的前面,但關鍵字參數之間不存在先後順序的
二、默認參數:
用於定義函數,為參數提供默認值,調用函數時可傳可不傳該默認參數的值(注意:所有位置參數必須出現在默認參數前,包括函數定義和調用)
三、可變參數:
定義函數時,有時候我們不確定調用的時候會傳遞多少個參數(不傳參也可以)。此時,可用包裹(packing)位置參數,或者包裹關鍵字參數,來進行參數傳遞,會顯得非常方便。
1、包裹位置傳遞
我們傳進的所有參數都會被args變數收集,它會根據傳進參數的位置合並為一個元組(tuple),args是元組類型,這就是包位置傳遞。
2、包裹關鍵字傳遞
kargs是一個字典(dict),收集所有關鍵字參數
四、解包裹參數:
*args 和 **kargs ,也可以在函數調用的時候使用,稱之為解包(unpacking)
1、在傳遞元組時,讓元組的每一個元素對應一個位置參數
2、在傳遞詞典字典時,讓詞典的每個鍵值對作為一個關鍵字參數傳遞給函數
五、位置參數、默認參數、可變參數的混合使用
1、基本原則是:先位置參數,默認參數,包裹位置,包裹關鍵字(定義和調用都應遵循)
2、Python中 *args 和 **kwargs 的區別
先看個demo:
輸出結果:
分析一下:可以看到,這兩個是[Python]中的可變參數。 *args 表示任何多個無名參數,它是一個tuple; **kwargs 表示關鍵字參數,它是一個dict。並且同時使用 *args 和 **kwargs 時,必須 *args 參數列要在 **kwargs 前,否則會報語法錯誤!!!
還有個小應用場景:創建字典
其實python中就帶有dict類,使用dict(a=1,b=2,c=3)即可創建一個字典了。
*args:
重點在*,後面的args相當於一個變數名,可以自己定義的。它的本質就是將標准調用剩下的值集中轉變為元組。
從形參的角度:
從實參的角度:
從不同角度看**kwargs:
**kwargs與位置參數和默認參數混用:
超復雜混合參數混用記:
總結:
位置參數:
調用函數時所傳參數的位置必須與定義函數時參數的位置相同
關鍵字參數:
使用關鍵字參數會指定參數值賦給哪個形參,調用時所傳參數的位置可以任意
*位置參數:可接受任意數量的位置參數(元組);只能作為最後一個位置參數出現,其後參數均為關鍵字參數
**關鍵字參數:可接受任意數量的關鍵字參數(字典);只能作為最後一個參數出現