7.1 获取所有函数参数
在Python中,有几种非常便捷的方法可以从函数内部获取传递给它的所有参数列表。让我们看看他们。
使用*args
*args
允许传递可变数量的位置(普通)参数到函数中。这些参数会被打包成一个元组,并可以在函数内部处理。
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
解释
函数print_numbers
接受任意数量的位置参数,这些参数被打包在元组args
中。我们可以使用for
循环遍历函数内部的参数。
优势
- 灵活性:允许向函数传递任意数量的参数。
- 通用性:可用于参数数量不确定的函数。
使用**kwargs
**kwargs
允许传递可变数量的命名参数到函数中。这些参数会被打包成字典,并可以在函数内部处理。
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
解释
函数print_person_info
接受任意数量的命名参数,这些参数被打包在字典kwargs
中。我们可以使用字典方法items()
来遍历函数内部的参数。
优势
- 灵活性:允许向函数传递任意数量的命名参数。
- 可读性:命名参数让函数调用更具可读性。
7.2 固定参数类型
仅位置参数
在Python 3.8及以上版本中,可以定义只能通过位置传递的参数的函数。通过在函数定义中使用符号/
来实现。
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # 输出: Hello, Alice!
greet("Alice", greeting="Hi") # 输出: Hi, Alice!
# greet(name="Alice") # 错误: TypeError
解释
函数greet
接受参数name
,只能通过位置传递。参数
在/前
只能通过位置传递。
这种方法可以限制参数传递方式,提高可读性并防止错误。
仅命名参数(Keyword-Only Arguments)
也可以定义只能通过名称传递参数的函数。通过在函数定义中使用符号*
来实现。
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # 输出: Hello, Alice!
greet(name="Alice", greeting="Hi") # 输出: Hi, Alice!
# greet("Alice") # 错误: TypeError
函数greet
接受参数name
,只能通过名称传递。参数
在*后
只能通过名称传递。
这种方法强制明确指定参数名,提高了代码的可读性。
结合位置和命名参数
还可以结合位置和命名参数,以实现最大灵活性。
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # 输出: Hello, Alice!
greet("Alice", greeting="Hi") # 输出: Hi, Alice!
# greet(name="Alice") # 错误: TypeError
函数greet
接受参数name
,只能通过位置传递,而命名参数greeting
必须通过名称传递。使用/
和*
可以结合位置和命名参数。
所有三种情况的完整示例:
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# 使用不同参数调用函数
full_example(1, 2, 3, 4, e=5, f=6) # 所有参数正确传递
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # 错误: TypeError
解释
-
仅位置参数:
a
和b
必须仅通过位置传递。 -
普通位置或命名参数:
c
和d
可以通过位置或名称传递。 -
仅命名参数:
e
和f
必须仅通过名称传递。
GO TO FULL VERSION