我知道Python中的*
操作符用于解包可迭代对象,例如解包列表。
然而,在实践中,我们也使用*
操作符来解包迭代器,但我还没有找到一份说明它的文档。
请看以下示例:
>>> a = [1,2,3]
>>> print(a)
[1, 2, 3]
解包可迭代对象
>>> print(*a)
1,2,3
解压迭代器
>>> it = iter(a)
>>> print(*it)
1,2,3
我知道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__()
返回迭代器对象本身。这是允许容器和迭代器与for和in语句一起使用的必要条件。该方法对应于Python/C API中Python对象类型结构的tp_iter插槽。
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