Python解包迭代器

8

我知道Python中的*操作符用于解包可迭代对象,例如解包列表。

然而,在实践中,我们也使用*操作符来解包迭代器,但我还没有找到一份说明它的文档。

请看以下示例:

>>> a = [1,2,3]
>>> print(a)
[1, 2, 3]

解包可迭代对象

>>> print(*a)
1,2,3

解压迭代器

>>> it = iter(a)
>>> print(*it)
1,2,3

2
尽管Python文档中的措辞如此,但它实际上并不是一个运算符,因为您无法在任意表达式中使用它。它是一种特殊的语法,允许在函数调用的参数列表中使用,并且(在Python 3中)可以在赋值的左侧使用。 - chepner
请查看 https://docs.python.org/3/reference/expressions.html#expression-lists 和 https://docs.python.org/3/reference/simple_stmts.html#assignment-statements。 - chepner
因为所有的迭代器都是可迭代的。 - juanpa.arrivillaga
3个回答

3

星号*是可迭代拆包运算符。

可迭代对象是可以遍历的对象。当传递给 iter() 方法时,它生成一个迭代器。迭代器是用于使用 next ()方法遍历可迭代对象的对象。迭代器有 next ()方法,该方法返回对象的下一项。

请注意,每个迭代器也都是可迭代的,但并非每个可迭代对象都是迭代器。

(来自geeksforgeeks)

在您的示例中,您的迭代器是可迭代的,因此您可以应用可迭代拆包运算符*

您可以查看PEP 448


2
这是因为iter应用于迭代器时返回相同的迭代器:

iterator.__iter__()
返回迭代器对象本身。这是允许容器和迭代器与for和in语句一起使用的必要条件。该方法对应于Python/C API中Python对象类型结构的tp_iter插槽。

在表达式列表中使用对象已经导致创建迭代器。因此,假设可迭代/迭代器协议已正确实现,则func(*iter(foo))func(*foo)具有相同的效果。

0

* 运算符(星号表达式)调用 __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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接