Python *args 和 **kwargs
*args 和 **kwargs
默认情况下,函数必须传入正确数量的参数。
但是,有时您可能不知道函数会接收多少个参数。
*args 和 **kwargs 允许函数接受未知数量的参数。
任意参数 - *args
如果您不知道函数将传递多少个参数,请在参数名称前添加一个*。
这样,函数将接收一个参数元组,并可以相应地访问其中的元素:
实例
使用 *args 可以接受任意数量的参数:
def my_function(*kids):
print("The youngest child is " + kids[2])
my_function("Emil", "Tobias", "Linus")
亲自试一试 »
任意参数在Python文档中通常简写为*args。
什么是 *args?
*args 参数允许函数接受任意数量的位置参数。
在函数内部,args 会变成一个包含所有传递参数的元组:
实例
Accessing individual arguments from *args:
def my_function(*args):
print("Type:", type(args))
print("First argument:", args[0])
print("Second argument:", args[1])
print("All arguments:", args)
my_function("Emil", "Tobias", "Linus")
亲自试一试 »
将 *args 与常规参数一起使用
您可以将常规参数与 *args 结合使用。
常规参数必须位于 *args 之前:
实例
def my_function(greeting, *names):
for name in names:
print(greeting, name)
my_function("Hello", "Emil", "Tobias", "Linus")
亲自试一试 »
在这个例子中,"Hello" 被赋值给 greeting,其余内容则收集在 names 中。
*args 的实际示例
*args 在创建灵活的函数时非常有用:
实例
计算任意数量值之和的函数:
def my_function(*numbers):
total = 0
for num in numbers:
total += num
return total
print(my_function(1, 2, 3))
print(my_function(10, 20, 30, 40))
print(my_function(5))
亲自试一试 »
实例
求最大值:
def my_function(*numbers):
if len(numbers) == 0:
return None
max_num = numbers[0]
for num in numbers:
if num > max_num:
max_num = num
return max_num
print(my_function(3, 7, 2, 9, 1))
亲自试一试 »
任意关键字参数 - **kwargs
如果您不确定函数会接收多少个关键字参数,请在参数名称前添加两个星号**。
这样,函数将接收一个参数字典,并可以相应地访问其中的元素:
实例
使用 **kwargs 可以接受任意数量的关键字参数:
def my_function(**kid):
print("His last name is " + kid["lname"])
my_function(fname = "Tobias", lname = "Refsnes")
亲自试一试 »
任意关键字参数在Python文档中通常缩写为**kwargs。
什么是 **kwargs'?
`**kwargs 参数允许函数接受任意数量的关键字参数。
在函数内部,`kwargs` 会变成一个包含所有关键字参数的字典:
实例
Accessing values from **kwargs:
def my_function(**myvar):
print("Type:", type(myvar))
print("Name:", myvar["name"])
print("Age:", myvar["age"])
print("All data:", myvar)
my_function(name = "Tobias", age = 30, city = "Bergen")
亲自试一试 »
将 **kwargs 与常规参数一起使用
您可以将常规参数与 **kwargs 结合使用。
常规参数必须位于 **kwargs 之前:
实例
def my_function(username, **details):
print("Username:", username)
print("Additional details:")
for key, value in details.items():
print(" ", key + ":", value)
my_function("emil123", age = 25, city = "Oslo", hobby = "coding")
亲自试一试 »
组合使用 *args 和 **kwargs
您可以在同一个函数中同时使用 *args 和 **kwargs。
顺序必须为:
- 常规参数
- *args
- **kwargs
实例
def my_function(title, *args, **kwargs):
print("Title:", title)
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
my_function("User Info", "Emil", "Tobias", age = 25, city = "Oslo")
亲自试一试 »
解包参数
调用函数时,也可以使用 * 和 ** 运算符将列表或字典解包(展开)成单独的参数。
使用 * 解包列表
如果您的列表中存储了值,您可以使用 * 将它们解包为单独的参数:
实例
使用 * 将列表解包为参数:
def my_function(a, b, c):
return a + b + c
numbers = [1, 2, 3]
result = my_function(*numbers) # Same as: my_function(1, 2, 3)
print(result)
亲自试一试 »
使用 ** 解包字典
如果您的字典中存储了关键字参数,您可以使用 ** 来解包它们:
实例
使用 ** 将字典解包为关键字参数:
def my_function(fname, lname):
print("Hello", fname, lname)
person = {"fname": "Emil", "lname": "Refsnes"}
my_function(**person) # Same as: my_function(fname="Emil", lname="Refsnes")
亲自试一试 »
注意:在函数定义中使用*和**来收集参数,并在函数调用中使用它们来解包参数。

