Python 3.x 为什么我的zip函数输出的比最短的iterable多?
我无法理解以下代码的输出Python 3.x 为什么我的zip函数输出的比最短的iterable多?,python-3.x,list,closures,generator,Python 3.x,List,Closures,Generator,我无法理解以下代码的输出 def gengen(mp): def gen(start): while True: if start % mp == 0: yield start start += 1 return gen threes = gengen(3) fours = gengen(4) for d, v, i in zip(threes(10), fours(17), ra
def gengen(mp):
def gen(start):
while True:
if start % mp == 0:
yield start
start += 1
return gen
threes = gengen(3)
fours = gengen(4)
for d, v, i in zip(threes(10), fours(17), range(2)):
print (d, v)
#output: 12 20 (this one is clear to me since 12/20 are the next integer divisible by 3/4)
15 24 (this one is not!)
为什么它也会打印15-24?我的理解是,函数输出的元素数zip
将等于最短的iterable。
所以我认为打印(列表(zip(三(10),四(17),范围(2))
打印出[12,20,0]
为什么它会再次调用gengengen
函数,直到到达范围(x)
的上限
我希望我的问题是可以理解的,但要简短一点:15 24也打印出来的原因是什么?原因是
zip
将查找通过的iterables中最短的一个。在您的情况下range(2)
是三个iterables中最短的一个(其他两个iterables将无限产生),这将导致2个循环
通过可视化可能更容易掌握:
print(list(zip(threes(10), fours(17), range(2))))
输出:
[(12,20,0)、(15,24,1)]
zip()
中最短的iterable是range(2)
(这是两个元素-因此您将得到两次迭代)。您正在打印d
和v
变量(不是i
),因此您会看到12 20
(第一次迭代)和15 24
(第二次迭代)