App下載
話題 首頁 > Python2 教程 > Python2 教程話題列表 > 詳情

關(guān)于 Python 列表推導(dǎo)的疑惑

精華
jing_cai 2016-10-19 11:49:15 瀏覽(4311) 回復(fù)(5) 贊(0)

關(guān)于“Python list comprehension 其實就是 generator.”該怎么理解?

另外 map filter、generator 也讓人挺不解的,求python 大牛都給解釋下。這么設(shè)計的緣由是什么?

python

回答(5)

廈門小懶懶 2016-10-19

首先關(guān)于問題里面引用的那句話:不要這樣理解,會把自己繞進(jìn)去,而且也不準(zhǔn)確。這個問題要往簡單來看。對于一個簡單的 list comprehension [x**2 for x in range(10)],它等價于:

l = []


for x in range(10):
    l.append(x**2)

所以,list comprehension 只是一個語法糖,能讓容器的初始化變得更加簡潔,但它本質(zhì)上還是在往容器里不斷塞東西。(當(dāng)然,由于這個語法存在,python 也可以針對性的優(yōu)化性能,性能會比自己 append 好一些)

List comprehensions provide a concise way to create lists. List comprehensions 提供了一種簡潔明了的方式來創(chuàng)建 list。 來自 python 官方文檔

它跟 generator 概念不一樣,如果要說的話,迭代器(iterator)可能才是描述 x**2 for x in range(10) 這種語法的正確方法,雖然它的名字確實叫做 generator expression。

其次,什么是 generator。 這個概念本身是很晦澀,如果初學(xué)不要強(qiáng)行理解。

簡單說它就是一個數(shù)據(jù)生成器,或者精確點說,它是個調(diào)用者可控的迭代器(iterator),僅此而已。

Generator 函數(shù)就像一個扭蛋機(jī),使用者每次投入一枚硬幣它就吐出一顆扭蛋。

  • 扭蛋機(jī)不知道也不關(guān)心使用者是誰
  • 使用者不知道也不關(guān)心下次吐出的扭蛋是什么
  • 當(dāng)使用想要扭蛋的時候就投幣,立即就會出一個扭蛋,或者告訴他已經(jīng)沒有庫存了
  • 當(dāng)使用者不需要扭蛋的時候,他就可以一直無視這個扭蛋機(jī)

這樣設(shè)計的好處是,耦合低和可控。

至于 generator 的高級用法,比如模擬 coroutine 什么的,可以暫時無視。

最后,關(guān)于 map、filter 等函數(shù)的設(shè)計思路。 從 generator 的特性可以看出,它所能表達(dá)的只能是一種順序輸出的情況,無法后悔,除非從頭開始。 這就像一條工廠的流水線,只能向前不能后退。 如果我們有這樣一條流水線,我們能做什么呢?

  • 流水線的入口接著一個 generator,源源不斷的從 generator 輸出到流水線
  • 我們可以對流水線上的東西進(jìn)行加工,一塊鋼板在上面銼一下變成某米的后蓋,這就是 map
  • 我們可以把流水線上的殘次品扔掉,這就是 filter

流水線生產(chǎn)是工業(yè)時代智慧體現(xiàn),能夠?qū)?zhí)行效率做到最高,并且流水線上各個環(huán)節(jié)都沒有耦合性,它的合理性相當(dāng)明顯。

一筆荒蕪 2018-05-31

有同樣等問題咋解決,只能慢慢等大神啦.留名留名。。

1144100656 2018-05-31

有問題找度娘,大佬太少,問題不好解決!!!!!

1152696398 2018-05-31

有問題找度娘,大佬太少,問題不好解決!!!!!

Samurai7013 2019-03-13

mark一下,以后再回來細(xì)看

要回復(fù),請先登錄 或者注冊