将列表推导转换为genexprs时出现奇数截断

时间:2014-07-07 18:13:39

标签: python-3.x generator

我刚刚编写了一些代码,它们使用前面的列表理解来构建一个需要做的事情的位置列表。

tilewidth=tileheight=64
xs=[x*tilewidth for x in range(0,fillwidth//tilewidth)]
ys=[y*tileheight for y in range(0,fillheight//tileheight)]
positions=[(x,y) for x in xs for y in ys]

这给出了

[(0, 0), (0, 64), (0, 128), ... (64, 0), (64, 64), (64, 128), ... (1216, 1152), (1216, 1216)]

这正是我想要的。

然而,当我尝试将列表推导转换为生成器时,只需通过交换括号的括号,我只得到(0,0)到(0,1216)范围。为什么呢?

1 个答案:

答案 0 :(得分:1)

生成器只能迭代一次。当你有嵌套迭代器时,内部迭代器只会迭代一次,因此缩短了结果。


[(x,y) for x in xs for y in ys]

相当于

for x in xs:
    for y in ys:               
        result.append((x,y))

上面,如果ys是生成器,ys只能迭代一次。因此,第一次通过外部循环,对于x的第一个值,ys会产生项目。在xs的后续迭代中,ys 已消耗,因此不再有任何项目附加到result