Python 解包
在 Python 中,* 和 ** 是用于解包(unpacking)操作符,它们分别用于解包可迭代对象(如列表、元组)和字典。这两个操作符在函数调用时非常有用,可以将一个可迭代对象或字典的内容“展开”并传递给函数。
1. * 的作用:解包可迭代对象
* 用于解包可迭代对象(如列表、元组等),将其元素作为单独的参数传递给函数。
示例 1:解包列表
1 | def add(a, b, c): |
在上面的例子中:
numbers是一个列表[1, 2, 3]。- 使用
*numbers将列表解包为三个单独的参数1,2,3,然后传递给add函数。
示例 2:解包元组
1 | def greet(name, age): |
2. ** 的作用:解包字典
** 用于解包字典,将其键值对作为关键字参数传递给函数。
示例 1:解包字典
1 | def greet(name, age): |
在上面的例子中:
person是一个字典{"name": "Alice", "age": 25}。- 使用
**person将字典解包为关键字参数name="Alice"和age=25,然后传递给greet函数。
示例 2:解包字典
1 | def print_info(name, age, city): |
3. 在 asyncio.gather() 中使用 *tasks
回到你的问题,在 asyncio.gather() 中使用 *tasks 是为了将 tasks 列表中的每个任务解包为单独的参数传递给 asyncio.gather()。
示例代码
1 | import asyncio |
解释:
tasks是一个包含两个协程任务的列表:[task1(), task2()]。asyncio.gather(*tasks)等价于asyncio.gather(task1(), task2())。*tasks将列表中的每个任务解包为单独的参数,传递给asyncio.gather()。
4. * 和 ** 的其他用途
在函数定义中:
*args:用于接收任意数量的位置参数,打包为一个元组。**kwargs:用于接收任意数量的关键字参数,打包为一个字典。
示例:
1 | def example_function(*args, **kwargs): |
输出:
1 | Positional arguments: (1, 2, 3) |
5. 总结
*用于解包可迭代对象(如列表、元组),将其元素作为单独的参数传递给函数。**用于解包字典,将其键值对作为关键字参数传递给函数。- 在
asyncio.gather(*tasks)中,*tasks将任务列表解包为单独的参数,方便并发执行多个任务。