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
(第二次迭代)