目錄
簡介
python 中函數有5種參數類型,位置參數,默認參數,可變參數,命名關鍵字參數和關鍵字參數,
在函數參數列表中,參數的優先順序是
位置參數 >默認參數>可變蠶食>命名關鍵字參數>關鍵字參數
位置參數
- 給函數的位置參數傳參時,參數位置與函數變量的位置一一對應。例如:
# 位置參數
def power(x,n):
sum = 1
while(n>0):
n=n-1
sum = sum * x
print( sum)
return sum
# 調用示例:
power(2,0)
給位置參數傳參時,也可以通過列表或元組的方式進行
#傳入的參數值是通過一個元組方式,如
tuple1 = (3,2)
power(*tuple1)
# 注 此時元組數據的個數必須與函數變量的個數一致
默認參數
我理解的是默認參數是位置參數的特殊類型,在定義函數的同時,給函數參數設置了默認值。
在調用函數時,默認參數可以被初始化,也可以不傳入任何值
默認參數必須指向一個不可變對象。如果默認參數是一個可變參數時,當調用函數 默認參數被修改時,它的值就發生了變化。
示例:
# 默認參數
def add_end(L=None):
if L is None:
L = []
L.append("END!")
print(L)
return L
# 調用示例
add_end([1,2,3])
可變參數
定義可變參數時 在參數前面加一個*號, 表示該參數是可變參數了,
可變參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。
可以接受列表或元組類型的參數
可變參數函數應該如何調用
1 將參數值羅列在參數中
2. 當可變參數的值是列表或者是元組時,調用時,在變量前面添加 * 號
3. 可變參數在函數調用時自動組裝爲一個tuple
示例:
# 可變參數 可變參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。
def caculate(*numbers):
sum = 0
for n in numbers:
sum = sum + n
print(sum)
return sum
# 調用示例
# 多個參數值依次傳入
caculate(1,2,3,4,5)
caculate(1,2,3)
#
# 列表類型的可變參數
# para = [1,2,3,4,5]
# caculate(*para)
關鍵字參數
1. 定義關鍵字參數時,在參數前面添加兩個星號 **
2. 允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict
3. 關鍵字參數是,是函數調用數據的一個拷貝,函數內部修改關鍵字參數,不會影響傳入的關鍵字參數的值 (即:傳入的字典變量的值不會被更改)
示例:
# 關鍵字參數
def person(name,age,**kw):
print('name:', name, 'age:', age, 'other:', kw)
# 調用示例 1:
person("Jack", '13')
person("Jack",'13',city ='BeiJing',job='HeBei')
輸出:
name: Jack age: 13 other: {}
name: Jack age: 13 other: {'city': 'BeiJing', 'job': 'HeBei'}
關鍵字參數也可以通過字典變量的方式調用,調用時在變量前面添加兩個星號 **
示例:
# 通過字典變量給關鍵字參數傳參
dicts = {'city':'BeiJing','job':'Engineer'}
person("Jack", '13',**dicts)
命名關鍵字參數
1. 限制關鍵字參數的名字(函數參數中將參數的關鍵字定義好)
2. 當函數參數中沒有定義可變參數時,命名關鍵字參數需要一個特殊分隔符*,*後面的參數被視爲命名關鍵字參數
當函數參數列表中包含了可變參數,則不需要這個特殊的分割符號了。
示例:
# 函數定義中已沒有一個可變參數,需要一個特殊的分割符號'*'
def person(name, age, *, city, job):
print(name, age, city, job)
# 如果函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就不再需要一個特殊分隔符*了
def person(name, age, *args, city, job):
print(name, age, args, city, job)
# 調用示例:
person("Jack",'13',city ='BeiJing',job='Engineer')
組合參數
Python函數中,可以用位置參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
但是,不要同時使用太多的組合,否則函數接口的可理解性很差
思考:
對於任意函數,都可以通過類似func(*args, **kw)
的形式調用它,無論它的參數是如何定義的。
參考資料:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888