我知道Python中的*
运算符用于解压缩可迭代,例如解压缩列表。
但是,在实践中,我们也使用*
运算符来解压缩迭代器,但我还没有找到解释它的文档。
请参阅示例:
>>> a = [1,2,3]
>>> print(a)
[1, 2, 3]
解压缩可迭代
>>> print(*a)
1,2,3
解包迭代器
>>> it = iter(a)
>>> print(*it)
1,2,3
星号*
是可迭代的解包运算符
可迭代是一个对象,可以迭代它。它生成一个 传递给 iter(( 方法时的迭代器。迭代器是一个对象,它是 用于使用next(( 方法迭代可迭代对象。 迭代器有next(( 方法,它返回 对象。
请注意,每个迭代器也是一个可迭代的,但不是每个可迭代的 是一个迭代器。
(来自Geeksforgeeks(
在您的示例中,迭代器是可迭代的,因此您可以应用*
可迭代解包运算符
你可以看看PEP 448
这是有效的,因为应用于迭代器的iter
返回相同的迭代器:
iterator.__iter__()
返回迭代器对象本身。这是 需要允许容器和迭代器与 和在语句中。此方法对应于 tp_iter 插槽 Python/C API 中 Python 对象的类型结构。
在表达式列表中使用对象已经会导致创建迭代器。所以func(*iter(foo))
与func(*foo)
具有相同的效果,假设迭代/迭代器协议已经正确实现。
*
运算符(带星号的表达式(调用__iter__
方法。
演示
class d(dict):
def __iter__(self):
for x in dict.__iter__(self):
print(99)
yield x
print(*d(a=1, b=2))
# 99
# 99
# a b