亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

何時使用列表理解與 for 循環

何時使用列表理解與 for 循環

當年話下 2022-08-25 15:04:04
對于何時首選列表理解而不是循環,是否有一般規則?例如:for單個 for 循環在轉換為理解時非常有用:l = []for word in sentence:    l.append(word)# [word for word in sentence]雙倍可能也是:l = []for word in sentence:    for letter in word:        l.append(letter)# [letter for word in sentence for letter in word]但是,我認為在那之后可讀性會變得非常差。例如,使用 s:ifl = []for word in sentence:    if word.startswith('u'):        for letter in word:            if letter in ('a', 'b', 'c', 'o'):                l.append(letter)# [letter for word in sentence if word.startswith('u') for letter in word if letter in ('a', 'b', 'c', 'o')]對于循環模式的復雜性,是否有建議,在循環模式中,嘗試將其放入列表理解中會更糟?for
查看完整描述

3 回答

?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

答案取決于您的意見。但是,由于我確實記得一位在Python社區中備受推崇的書的作者提出的一條具體建議,我可以分享Luciano Ramalho的“Fluent Python”一書中的以下摘錄:

for 循環可用于執行許多不同的操作:掃描序列以計數或選取項目,計算聚合(總和、平均值)或任意數量的其他處理任務。[...]相比之下,listcomp只做一件事:構建一個新列表。

當然,濫用列表理解來編寫真正難以理解的代碼是可能的。我見過帶有listcomps的Python代碼,只是為了重復一個代碼塊的副作用。

如果不對生成的列表執行某些操作,則不應使用該語法。

另外,盡量保持簡短。如果列表理解跨越兩行以上,則最好將其拆分或重寫為普通的舊 for 循環。使用你最好的判斷:對于Python和英語一樣,沒有硬性規定來清晰地寫作。


查看完整回答
反對 回復 2022-08-25
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

據此,可以獲得性能。


import timeit


def squares(size):

    result = []

    for number in range(size):

        result.append(number*number)

    return result


def squares_comprehension(size):

    return [number*number for number in range(size)]


print(timeit.timeit("squares(50)", "from __main__ import squares", number = 1_000_000))

print(timeit.timeit("squares_comprehension(50)", "from __main__ import squares_comprehension", number = 1_000_000))


5.4292075

4.1652729000000015

希望這有幫助。


查看完整回答
反對 回復 2022-08-25
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

我想補充一點,你總是可以使用生成器和迭代器。沒有主要的內存開銷,但除非最里面的操作成本相對較高,否則性能可能會受到影響。


from itertools import chain

sentence = "flat is better than nested"


words = sentence.split()

f_words = (w for w in words if w.startswith('f'))

f_chars = chain(*f_words)

good_chars = [c for c in f_chars if c in 'abco']


查看完整回答
反對 回復 2022-08-25
  • 3 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號