作者timTan (用口頭禪區分年記)
看板Python
標題Re: [問題] for迴圈問題
時間Fri Jul 12 02:39:22 2013
※ 引述《uranusjr (←這人是超級笨蛋)》之銘言:
: ※ 引述《WaiTingKuo (:!)》之銘言:
: : In [12]: a = [1, 2, 3, 4, 5, 6]
: : In [13]: for x, y, in zip(*[iter(a)]*2):
: : ....: print x, y
: : ....:
: : 1 2
: : 3 4
: : 5 6
: 推 EntHeEnd:請問*[iter(a)]是什麼意思...@@? 07/12 00:55
: 你的運算優先權錯了 =p
: a 是 list (i.e. a 是 iterable)
: iter(a) 會得到 a 的 iterator
: [iter(a)] 就包成一個單一元素的 list
: [iter(a)] * 2 會得到一個有兩個元素的 list(而且兩個元素會相同)
: *[iter(a)] * 2 會把這個 list 展開成 zip 的兩個參數
: 事實上 zip(*[iter(a)]*2) 就等同於
: a_iter = iter(a)
: zip(a_iter, a_iter)
: 事實上由於 iter 是回傳 reference, zip(iter(a), iter(a)) 也完全對等
是指 [iter(a)] * 2 跟 iter(a), iter(a) 比較嗎?
如果是的話,這不對等喔。
e.g.
In [3]: a = range(4)
In [4]: a
Out[4]: [0, 1, 2, 3]
In [5]: for k,v in zip( * [ iter(a)]*2 ) : print k,v
0 1
2 3
In [7]: for k,v in zip( iter(a), iter(a) ) : print k,v
0 0
1 1
2 2
3 3
ps: 我也不喜歡 list 的 乘法 ~
: 如果是我的話應該會這樣寫, 我個人很討厭 list 乘法...
: 用 iter 的好處是不用複製一個 list, 也不會需要大量 random access
: 所以效率會比較好
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.248.166.79
※ 編輯: timTan 來自: 111.248.166.79 (07/12 02:40)
→ uranusjr:Hmm, 看來是我搞錯了 07/12 02:48
推 SansWord:關鍵是iter(a), iter(a) 的用法會產生兩個 iterator 07/17 11:09
→ SansWord:這種包法必須要兩個參數是同一個 reference 才行。 07/17 11:09