如何使用 zip、* 和 *3 的组合同时迭代 3 个元素?

How does iterating over 3 elements at the same time using a combination of zip, * and *3 work?

我正在尝试使用以下方法一次迭代 3 个元素(这似乎有效):

for a, b, c in zip(*[iter(accounts_iter)]*3):
    print(a)
    print(b)
    print(c)
  1. accounts_iter 是我创建的元组列表。
  2. iter(accounts_iter)accounts_iter 解包到一个列表迭代器中,所以它仍然是一个元组列表,只是它现在是可迭代的

这是我难以理解的地方。

在我的输出中,我似乎没有重复项,但确实能够在每个循环中处理 3 个项目。

但是一旦 zip(*[iter(accounts_iter)]*3) 发生,我不会有同一个元组的 3 个副本吗?

展开层层叠叠的“聪明”,您可能会发现这个等效拼写更容易理解:

x = iter(accounts_iter)
for a, b, c in zip(*[x, x, x]):
    print(a, b, c)

反过来,这相当于偶数 less-clever:

x = iter(accounts_iter)
for a, b, c in zip(x, x, x):
    print(a, b, c)

现在应该开始变得清晰了。只有一个迭代器对象 x。在每次迭代中,zip() 在幕后会调用 next(x) 3 次,对传递给它的每个迭代器对象调用一次。但是这里每次都是 same 迭代器对象。因此它传递前 3 个 next(x) 结果,并让共享迭代器对象等待传递它的第 4 个结果。起泡、冲洗、重复。

顺便说一句,我怀疑您在头脑中错误地解析了 *[iter(accounts_iter)]*3。尾随 *3 首先发生,然后前缀 * 应用于创建的 3 元素列表 *3f(*iterable) 是使用可变数量的参数调用 f() 的快捷方式,每个对象一个参数 iterable 传递。