作者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)
1F:→ uranusjr:Hmm, 看来是我搞错了 07/12 02:48
2F:推 SansWord:关键是iter(a), iter(a) 的用法会产生两个 iterator 07/17 11:09
3F:→ SansWord:这种包法必须要两个参数是同一个 reference 才行。 07/17 11:09