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

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

關于 Python 列表推導的疑惑

關于 Python 列表推導的疑惑

蠱毒傳說 2018-06-25 09:21:21
關于Python list comprehension 其實就是 generator.該怎么理解?另外 map filter、generator 也讓人挺不解的,求python 大牛都給解釋下。這么設計的緣由是什么?
查看完整描述

3 回答

?
一只名叫tom的貓

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

這樣處理主要是 Lazy 求值的做法

設想一些應用場景,你需要對1000萬個斐波那切數相加求和。

  • 一種方法是先用一個列表,寫一個函數,直接生成1000萬個個斐波那切數,然后再把1000萬個存儲,然后迭代這個list的每一個數進行疊加求和。(先生成,再處理)

  • 另外一種方式就是,寫一個能按照要求,每次生成一個斐波那切數函數,求和的過程為每調用函數,生成一個斐波那切數,然后進行求和一次。(一邊生成一遍處理)

第二種方法,就是一種 lazy 的方式,也就是 python 慣用的 generator


查看完整回答
反對 回復 2018-07-06
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

不知道題主這句話是從何得來的,我測試的Python2.7就是轉化成for函數而已如下.

https://img1.sycdn.imooc.com//5b3f7dec0001545606690646.jpg

不知道Py3.*中是否也是如此(可能變了吧)

查看完整回答
反對 回復 2018-07-06
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

首先關于問題里面引用的那句話:不要這樣理解,會把自己繞進去,而且也不準確。

這個問題要往簡單來看。對于一個簡單的 list comprehension?[x**2 for x in range(10)],它等價于:

l?=?[]for?x?in?range(10):
????l.append(x**2)

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

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

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

其次,什么是 generator。

這個概念本身是很晦澀,如果初學不要強行理解。

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

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

  • 扭蛋機不知道也不關心使用者是誰

  • 使用者不知道也不關心下次吐出的扭蛋是什么

  • 當使用想要扭蛋的時候就投幣,立即就會出一個扭蛋,或者告訴他已經沒有庫存了

  • 當使用者不需要扭蛋的時候,他就可以一直無視這個扭蛋機

這樣設計的好處是,耦合低可控。

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

最后,關于?map、filter?等函數的設計思路。

從 generator 的特性可以看出,它所能表達的只能是一種順序輸出的情況,無法后悔,除非從頭開始。

這就像一條工廠的流水線,只能向前不能后退。

如果我們有這樣一條流水線,我們能做什么呢?

  • 流水線的入口接著一個 generator,源源不斷的從 generator 輸出到流水線

  • 我們可以對流水線上的東西進行加工,一塊鋼板在上面銼一下變成某米的后蓋,這就是?map

  • 我們可以把流水線上的殘次品扔掉,這就是?filter

流水線生產是工業時代智慧體現,能夠將執行效率做到最高,并且流水線上各個環節都沒有耦合性,它的合理性相當明顯。


查看完整回答
反對 回復 2018-07-06
  • 3 回答
  • 0 關注
  • 277 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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