3 回答

TA贡献1936条经验 获得超6个赞
您需要使用一些括号:
((x for x in range(10) if x%2==i) for i in range(2))
这对我来说没有意义,所以我认为最好先尝试一些简单的方法。因此,我返回列表并尝试:
[>>> [x对于范围(2)中的i,如果x%2 == i,则x对于范围(10)中的x] [1、1、3、3、3、5、5、7、7、9、9]
之所以有效,是因为先前的列表理解将i变量泄漏到了封闭范围,并成为当前变量的i。尝试启动一个新的python解释器,由于NameError失败,这将失败。计数器的泄漏行为已在Python 3中删除。
编辑:
等效于for的循环:
(x for x in range(10) if x%2==i for i in range(2))
将会:
l = []
for x in range(10):
if x%2 == i:
for i in range(2):
l.append(x)
这也会给出名称错误。
编辑2:
括号中的版本:
((x for x in range(10) if x%2==i) for i in range(2))
等效于:
li = []
for i in range(2):
lx = []
for x in range(10):
if x%2==i:
lx.append(x)
li.append(lx)

TA贡献1895条经验 获得超7个赞
Lie Ryan的for循环等效项将我带到以下内容,这似乎确实可以正常工作:
[x for i in range(2) for x in range(10) if i == x%2]
输出
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]Lie Ryan的for循环等效项将我带到以下内容,这似乎确实可以正常工作:
[x for i in range(2) for x in range(10) if i == x%2]
输出
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]

TA贡献1784条经验 获得超8个赞
扩大李·瑞安的答案:
某物=(如果x%2 == i对于范围(2)中的i,则x对于范围(10)中的x)
等效于:
def _gen1():
for x in range(10):
if x%2 == i:
for i in range(2):
yield x
something = _gen1()
而带括号的版本等效于:
def _gen1():
def _gen2():
for x in range(10):
if x%2 == i:
yield x
for i in range(2):
yield _gen2()
something = _gen1()
实际上,这确实产生了两个生成器:
[<generator object <genexpr> at 0x02A0A968>, <generator object <genexpr> at 0x02A0A990>]
不幸的是,它产生的生成器有些不稳定,因为输出将取决于您如何使用它们:
>>> gens = ((x for x in range(10) if x%2==i) for i in range(2))
>>> for g in gens:
print(list(g))
[0, 2, 4, 6, 8]
[1, 3, 5, 7, 9]
>>> gens = ((x for x in range(10) if x%2==i) for i in range(2))
>>> for g in list(gens):
print(list(g))
[1, 3, 5, 7, 9]
[1, 3, 5, 7, 9]
我的建议是完全写出生成器函数:我认为,如果i不这样做就试图获得正确的作用域几乎是不可能的。
添加回答
举报