3 回答

TA貢獻1936條經(jīng)驗 獲得超7個贊
您需要使用一些括號:
((x for x in range(10) if x%2==i) for i in range(2))
這對我來說沒有意義,所以我認(rèn)為最好先嘗試一些簡單的方法。因此,我返回列表并嘗試:
[>>> [x對于范圍(2)中的i,如果x%2 == i,則x對于范圍(10)中的x] [1、1、3、3、3、5、5、7、7、9、9]
之所以有效,是因為先前的列表理解將i變量泄漏到了封閉范圍,并成為當(dāng)前變量的i。嘗試啟動一個新的python解釋器,由于NameError失敗,這將失敗。計數(shù)器的泄漏行為已在Python 3中刪除。
編輯:
等效于for的循環(huán):
(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條經(jīng)驗 獲得超7個贊
Lie Ryan的for循環(huán)等效項將我?guī)У揭韵聝?nèi)容,這似乎確實可以正常工作:
[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循環(huán)等效項將我?guī)У揭韵聝?nèi)容,這似乎確實可以正常工作:
[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條經(jīng)驗 獲得超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()
實際上,這確實產(chǎn)生了兩個生成器:
[<generator object <genexpr> at 0x02A0A968>, <generator object <genexpr> at 0x02A0A990>]
不幸的是,它產(chǎn)生的生成器有些不穩(wěn)定,因為輸出將取決于您如何使用它們:
>>> 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]
我的建議是完全寫出生成器函數(shù):我認(rèn)為,如果i不這樣做就試圖獲得正確的作用域幾乎是不可能的。
添加回答
舉報