作者max80713 ()
看板Python
標題Re: [問題] list的iterator應用問題
時間Sat Jul 2 10:09:53 2016
原po的程式碼可以說是generator版本的list comprehension,
什麼是list comprehension?
其實把原敘述的左右小括號改成中括號就是了,如下:
>>> test = [(x,y) for x in range(3) for y in range(x)]
會產生出類似的結果:
>>> test
[(1, 0), (2, 0), (2, 1)]
test會是一個list。這樣子的敘述其實等價於:
>>> test = []
>>> for x in range(3):
for y in range(x):
test.append((x,y))
(從上述程式碼原po大概就可以理解為什麼會有那樣的output了吧!)
list comprehension提供了一個更快速的方式建立起一個有規律的list,
x和y也會被清理掉而不會像下面那種方式依然存在。
但原po的程式碼則叫做generator expression:
>>> test = ((x,y) for x in range(3) for y in range(x))
得到的test會是一個generator,是一種iterator,
可以透過next()取得下一個值直到沒有東西,
>>> next(test)
(1, 0)
>>> next(test)
(2, 0)
>>> next(test)
(2, 1)
>>> next(test)
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
next(test)
StopIteration
也可以像原po一樣透過for迴圈取值出來,
所以會得到類似list comprehension的結果。
那樣的敘述等價於:
>>> def test():
for x in range(3):
for y in range(x):
yield(x,y)
>>> test = test()
generator expression省去了建立generator function,實作iterator class的麻煩。
※ 引述《Neverfor (yorker)》之銘言:
: test=( (x, y) for x in range ( 3 ) for y in range (x) )
: for x,y in test:
: print(x,y)
: output:
: 1 0
: 2 0
: 2 1
: 不好意思 看了很久想不出來程式碼第一行跟結果的關係QQ
: 這種用法是什麼意思呢?
: 想問
: 1. (x,y)是否代表 輸出的iterator 1個elemeny 是 (x,y)
: 2.迴圈看不太懂意思
: 前面的for x 是否是後面y range的x
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.168.202.245
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1467425395.A.84B.html
※ 編輯: max80713 (118.168.202.245), 07/02/2016 10:14:59
※ 編輯: max80713 (118.168.202.245), 07/02/2016 10:21:00
推 ccvs: 推07/02 13:37
※ 編輯: max80713 (42.73.86.45), 07/02/2016 14:04:02
推 Neverfor: 感謝大大用心回覆!! 07/02 21:54
推 Neverfor: 請問這種的類似用法,實際上好用嗎@@? 07/02 21:56
→ max80713: generator expression好用的地方在於短短的一行程式碼就 07/02 22:19
→ max80713: 可以做出你想要的generator;另外它會在需要用到的時候 07/02 22:19
→ max80713: 才分配一塊記憶體給下一個值,不像list comprehension 07/02 22:19
→ max80713: 產出越長的list,就會佔據越大的記憶體空間。 07/02 22:19
推 Sunal: 當list超大的時候就很好用了 07/02 22:37
推 Neverfor: 謝謝 07/03 03:40
推 Yshuan: 推講解 07/03 04:18
推 enjoyloli: 所以是處理超大List用小刮號,一般情況用中掛號? 07/03 14:46
→ max80713: 端看需求而定:如果你想call一些list function或是重複 07/03 15:42
→ max80713: 使用這些值那建議把它們存成list;如果只是要掃過所有 07/03 15:42
→ max80713: 值一次,或是個數實在太多就用generator:) 07/03 15:42
推 yougigun: 長知識! 07/04 00:04
推 sunshinehope: 嗚嗚推 07/04 10:03