2015-11-14 12 views
-3

下面的代码混淆了我:Python iter()函数如何工作?

>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> zip(*([iter(a)]*2)) 
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 
>>> iter(a) 
<listiterator object at 0x7f3e9920cf50> 
>>> iter(a).next() 
0 
>>> iter(a).next() 
0 
>>> iter(a).next() 
0 

next()总是返回0。那么,如何在iter功能工作?

+1

密切相关:http://stackoverflow.com/q/29570348/2301450 – vaultah

+1

@vaultah,我认为它几乎是一个确切的副本 –

+0

@PadraicCunningham,对不起,我想知道如何*([iter(a) ] * 2)'工作,特别是Python中的'*'。 –

回答

4

您正在创建一个新的迭代器每次。每个新的迭代器都从头开始,它们都是独立的。

创建迭代一次,然后遍历一个实例:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> a_iter = iter(a) 
>>> next(a_iter) 
0 
>>> next(a_iter) 
1 
>>> next(a_iter) 
2 

我用next() function而不是调用iterator.next()方法; Python 3将后者重命名为iterator.__next__(),但next()函数将调用正确的“拼写”,就像len()用于调用object.__len__

+0

'zip(*([iter(a)] * 2))'是如何工作的,python中的*是什么意思,'C'中的'*'是获得一个指针的值。 –

+0

请参阅[*] *(双星)和\ *(星号)对于Python参数所做的操作是什么?](https://stackoverflow.com/q/36901)。 –

+0

'[iter(a)] * 2'产生一个列表,其中有两个引用给一个迭代器。 'zip(*(...))'将这两个引用作为参数应用于'zip()'函数。 –