一、參數傳遞基礎
在Python中,我們常常需要調用函數並向其傳遞參數。函數通過這些參數進行操作,並返回結果。Python中參數傳遞主要有以下幾種方式:
1. 位置參數
位置參數是指函數調用時按照參數在函數定義時的位置依次傳遞的參數。例如:
def sum(a, b):
return a + b
print(sum(1, 2))
輸出結果為3,因為1和2按照位置分別傳遞給了sum函數的參數a和b。
2. 關鍵字參數
關鍵字參數是指在函數調用時使用參數名來給參數賦值的一種形式。例如:
def sum(a, b):
return a + b
print(sum(a=1, b=2))
print(sum(b=2, a=1))
輸出結果均為3,因為參數a和b都被指定了具體的數值。無論參數的順序怎樣調換,函數調用都能夠正確執行。
3. 默認參數
默認參數是指函數定義時就預先指定了參數值,在函數調用時被省略時將使用這些默認值。例如:
def sum(a, b=2):
return a + b
print(sum(1))
print(sum(1, 3))
輸出結果分別為3和4,因為在第一個函數調用中,參數b被省略了,因此使用了默認值2;在第二個函數調用中,參數b被指定為3。
二、*arg和**kwargs的應用
1. *arg的應用
*arg是一個可變參數列表,使函數能夠接受任意數目的參數。在函數內部,它是一個包含了所有參數的元組。例如:
def print_args(*args):
print(args)
print_args(1, 2, 3)
print_args('a', 'b', 'c', 'd')
輸出結果分別為(1, 2, 3)和(‘a’, ‘b’, ‘c’, ‘d’),因為所有傳遞給函數的參數都被包含在args元組中。
2. **kwargs的應用
**kwargs同樣是一個可變參數列表,不同的是它接收的是關鍵字參數,將所有參數打包進一個字典中。在函數內部,可以通過字典的鍵來訪問參數值。例如:
def print_kwargs(**kwargs):
print(kwargs)
print(kwargs['name'])
print_kwargs(name='John', age=20)
輸出結果為{‘name’: ‘John’, ‘age’: 20}和John,因為參數name和age被打包進了kwargs字典中,並能夠通過相應的鍵來訪問。
三、*arg和**kwargs的巧妙應用
1. 使用*arg傳遞元組
通過將一個元組作為*arg的參數,可以將元組中所有的值傳遞給函數。例如:
def print_scores(*scores):
print('Scores:')
for score in scores:
print(score)
scores = (90, 85, 95)
print_scores(*scores)
輸出結果為:
Scores:
90
85
95
可以看到,元組中的所有分數被傳遞給了print_scores函數,並被分別打印出來。
2. 使用**kwargs傳遞字典
通過將一個字典作為**kwargs的參數,可以將字典中所有的鍵/值對傳遞給函數。例如:
def print_info(**info):
print('Info:')
for key, value in info.items():
print(key, value)
info = {'name': 'John', 'age': 20, 'city': 'New York'}
print_info(**info)
輸出結果為:
Info:
name John
age 20
city New York
可以看到,字典中的所有鍵/值對被傳遞給了print_info函數,並根據鍵和值分別打印出來。
3. 使用*arg和**kwargs實現函數遞歸
要實現函數循環嵌套,可以使用*arg和**kwargs來調用自身。例如:
def print_tree(*names, **info):
if info:
print(info)
for name in names:
print(name)
if isinstance(info.get(name), dict):
print_tree(**info[name])
data = {'root': {'A': {'B': {}, 'C': {}}, 'D': {}, 'E': {}}}
print_tree(**data)
輸出結果為:
root
{'A': {'B': {}, 'C': {}}, 'D': {}, 'E': {}}
A
{'B': {}, 'C': {}}
B
C
D
E
可以看到,函數將一個字典作為**kwargs參數傳遞給自身,然後通過遞歸調用,遍歷了整個字典中的所有項。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/259394.html