第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

高級嵌套列表理解語法

高級嵌套列表理解語法

慕的地6264312 2019-11-28 12:41:43
我一直在與列表理解打交道,以更好地理解它們,但遇到了一些我無法解釋的意外輸出。我之前沒有發(fā)現(xiàn)這個問題,但是,如果它是重復(fù)的問題,我深表歉意。我本質(zhì)上是想寫一個生成器。一個使用列表推導(dǎo)的簡單生成器如下所示:(x for x in range(10) if x%2==0) # generates all even integers in range(10)我想要做的是編寫一個生成器,生成兩個生成器-第一個生成器生成range(10)中的偶數(shù),第二個生成range(10)中的奇數(shù)。為此,我做了:>>> (x for x in range(10) if x%2==i for i in range(2))<generator object <genexpr> at 0x7f6b90948f00>>>> for i in g.next(): print i... Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 1, in <genexpr>UnboundLocalError: local variable 'i' referenced before assignment>>> g.next()Traceback (most recent call last):  File "<stdin>", line 1, in <module>StopIteration>>> g = (x for x in range(10) if x%2==i for i in range(2))>>> g<generator object <genexpr> at 0x7f6b90969730>我不明白為什么在分配之前會引用“ i”我認(rèn)為它可能與有關(guān)i in range(2),所以我做到了:>>> g = (x for x in range(10) if x%2==i for i in [0.1])>>> g<generator object <genexpr> at 0x7f6b90948f00>>>> g.next()Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 1, in <genexpr>UnboundLocalError: local variable 'i' referenced before assignment這對我來說沒有意義,所以我認(rèn)為最好先嘗試一些簡單的方法。因此,我返回列表并嘗試:>>> [x for x in range(10) if x%2==i for i in range(2)][1, 1, 3, 3, 5, 5, 7, 7, 9, 9]我期望與以下相同:>>> l = []>>> for i in range(2):...     for x in range(10):...             if x%2==i:...                     l.append(x)... >>> l[0, 2, 4, 6, 8, 1, 3, 5, 7, 9] # so where is my list comprehension malformed?但是,當(dāng)我直覺嘗試時,它起作用了:>>> [[x for x in range(10) if x%2==i] for i in range(2)][[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]] # so nested lists in nested list comprehension somehow affect the scope of if statements? :S因此,我認(rèn)為該if語句在什么范圍的范圍內(nèi)運行可能是一個問題。因此,我嘗試了以下操作:>>> [x for x in range(10) for i in range(2) if x%2==i][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]現(xiàn)在,我感到非常困惑。有人可以解釋這種現(xiàn)象。我不明白為什么列表理解似乎不正確,也不了解if語句范圍界定的工作原理。
查看完整描述

3 回答

?
LEATH

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)


查看完整回答
反對 回復(fù) 2019-11-28
?
人到中年有點甜

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]


查看完整回答
反對 回復(fù) 2019-11-28
?
青春有我

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不這樣做就試圖獲得正確的作用域幾乎是不可能的。


查看完整回答
反對 回復(fù) 2019-11-28
  • 3 回答
  • 0 關(guān)注
  • 450 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號