2015-11-14 13 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()'函數。 –