总结:
当**input当成实参时,表示解包成字典。同理,*input表示解包成元组或列表当是实参时。当**input当成形参定义函数时,表示接收任意个参数打包成字典。同理,*input表示打包成元组或列表。
一、*args, **kwargs的打包
1.利用**打包的例子
当我们使用 **
来打包关键字参数时,我们可以将这些关键字参数打包成一个字典。这样做可以使代码更加灵活,适用于需要动态设置参数的情况。下面是一个简单的例子:
def create_student_record(name, age, **kwargs):
record = {
"name": name,
"age": age
}
for key, value in kwargs.items():
record[key] = value
return record
# 创建一个学生记录
student1 = create_student_record("Alice", 20, major="Computer Science", GPA=3.5)
print(student1)
代码解析:在这个例子中,我们定义了一个名为 create_student_record
的函数,它接受两个必选的参数 name
和 age
,以及任意数量的其他关键字参数。通过使用 **kwargs
,我们可以动态地接受任意数量的关键字参数,并将它们打包成一个字典 kwargs。
调用 create_student_record
函数时,我们传递了三个参数:name="Alice"
, age=20
以及 major="Computer Science"
, GPA=3.5
这两个额外的关键字参数。这些额外的关键字参数会被打包成一个字典,并传递给函数。
当我们运行这段代码时,会输出:
{'name': 'Alice', 'age': 20, 'major': 'Computer Science', 'GPA': 3.5}
2.利用*打包的例子
当使用*
来打包参数时,它将会把多个参数收集成一个元组。
def print_arguments(*args):
for arg in args:
print(arg)
# 使用*来打包参数
print_arguments("Hello", "World", 2023, True)
在这个例子中,print_arguments
函数使用*args
来接收任意数量的参数,并将它们打包成一个元组。当函数被调用时,传入的参数被打包成一个元组,然后通过循环逐个打印出来。
当你运行上面的代码时,它会输出:
Hello
World
2023
True
二、*args, **kwargs的解包
1.利用**kwargs解包的例子
当我们使用 **
来解包字典时,我们可以将字典中的键值对作为关键字参数传递给函数或方法。这样做可以使代码更加简洁清晰。下面是一个简单的例子:
def greet(name, age):
print(f"Hello, {name}! I heard you are {age} years old.")
# 定义一个字典
person = {"name": "Alice", "age": 25}
# 使用 ** 解包字典,将键值对作为关键字参数传递给函数
greet(**person)
通过使用 **person
,我们将字典 person
中的键值对解包,并作为关键字参数传递给 greet
函数。这样,greet
函数就可以像这样调用:greet(name="Alice", age=25)
。
当我们运行这段代码时,会输出:
Hello, Alice! I heard you are 25 years old.
三、利用*和**同时打包的例子。(其实就是一个元组和一个字典解包完再打包)
当我们同时使用 *
和 **
来处理参数时,我们可以将位置参数和关键字参数同时打包传递给函数。下面是一个简单的例子:
def print_info(*args, **kwargs):
print("Positional arguments:")
for arg in args:
print(arg)
print("\nKeyword arguments:")
for key, value in kwargs.items():
print(f"{key}: {value}")
# 创建一些参数
names = ["Alice", "Bob", "Charlie"]
info = {"age": 25, "country": "USA"}
# 使用 * 和 ** 打包参数并传递给函数
print_info(*names, **info)
在这个例子中,我们定义了一个名为 print_info
的函数,它接受任意数量的位置参数 args
和任意数量的关键字参数 kwargs
。
我们准备了一个列表 names
和一个字典 info
作为参数。通过使用 *names
,我们将列表中的元素作为位置参数传递给函数;通过使用 **info
,我们将字典中的键值对作为关键字参数传递给函数。
当函数内部执行时,会按照位置参数和关键字参数的方式分别处理参数,并输出它们的值。
当我们运行这段代码时,会输出:
Positional arguments:
Alice
Bob
Charlie
Keyword arguments:
age: 25
country: USA