一、参数传递基础
在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参数传递给自身,然后通过递归调用,遍历了整个字典中的所有项。