我刚刚编写了一些代码,它们使用前面的列表理解来构建一个需要做的事情的位置列表。
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)范围。为什么呢?
答案 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
。