如何使用 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)
accounts_iter
是我创建的元组列表。
iter(accounts_iter)
将 accounts_iter
解包到一个列表迭代器中,所以它仍然是一个元组列表,只是它现在是可迭代的
这是我难以理解的地方。
*[iter(accounts_iter)]
将 Step 2
中的列表解压缩为单独的元组,因此不再是元组列表而是单个元组
*[iter(accounts_iter)]*3
乘以 3
在我的输出中,我似乎没有重复项,但确实能够在每个循环中处理 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 元素列表 *3
。 f(*iterable)
是使用可变数量的参数调用 f()
的快捷方式,每个对象一个参数 iterable
传递。
我正在尝试使用以下方法一次迭代 3 个元素(这似乎有效):
for a, b, c in zip(*[iter(accounts_iter)]*3):
print(a)
print(b)
print(c)
accounts_iter
是我创建的元组列表。iter(accounts_iter)
将accounts_iter
解包到一个列表迭代器中,所以它仍然是一个元组列表,只是它现在是可迭代的
这是我难以理解的地方。
*[iter(accounts_iter)]
将Step 2
中的列表解压缩为单独的元组,因此不再是元组列表而是单个元组*[iter(accounts_iter)]*3
乘以 3
在我的输出中,我似乎没有重复项,但确实能够在每个循环中处理 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 元素列表 *3
。 f(*iterable)
是使用可变数量的参数调用 f()
的快捷方式,每个对象一个参数 iterable
传递。