Python 解包迭代器



我知道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

最新更新