迭代器返回的iter
將產生來自給定迭代的每個元素只有一次。你可以想象每個迭代器返回iter
就好像有一個指向下一個元素的符號。在第一個摘錄中,您有2個標記:i
和i2
,並且在第二個標記中。迭代器支持名爲next
的單個操作,該操作將獲取「符號」當前指向的項目,並移動「符號」以使其指向以下元素。
zip(p, q)
/izip(p, q)
將在內部從p
獲得下一個元素,那麼從q
和建立這些元素的元組,併產生它;然後重複只要p
和q
都有next
元素。
在第一種情況下,有2個獨立的迭代器。因此i
和i2
都將產生它們各自列表中的所有元素。我將在此介紹它採用簡單的代碼和zip
- 作爲獎金,這是Python的3兼容:
>>> a = [1, 2, 3, 4]
>>> p = iter(a)
>>> q = iter(a)
>>> list(zip(p, q))
[(1, 1), (2, 2), (3, 3), (4, 4)]
在您在相同迭代兩次經過第二種情況。 izip
仍然認爲它有2個迭代器;所以izip
會先問p
爲next
元素,然後q
爲next
元素 - 但只有一個迭代器 - 所以izip
將看到來自p
未來每第二個元素,以及每秒從q
:
>>> a = [1, 2, 3, 4]
>>> p = iter(a)
>>> q = p
>>> q is p
True
>>> list(zip(p, q))
[(1, 2), (3, 4)]
最後,dict
,當給出元組可迭代時,將構造一個字典,其中每個元組的第一個元素成爲一個關鍵字,第二個元素成爲該關鍵字的值。因此:
>>> dict([(1, 1), (2, 2), (3, 3), (4, 4)])
{1: 1, 2: 2, 3: 3, 4: 4}
和
>>> dict([(1, 2), (3, 4)])
{1: 2, 3: 4}
順便說一句,這個代碼是不必要的複雜:
a = ['hello', 'world', '1', '2', 'other', 'thing']
b = ['hello', 'world', '1', '2', 'other', 'thing']
i = iter(a)
i2= iter(b)
c = dict(izip(i, i2))
首先,列表不必重複 - 你可以有2個迭代器迭代相同的列表,他們將獨立工作,即你可以有
i2 = iter(a)
仍然得到相同的結果,b
在這裏是不必要的。
其次,大多數時候你不需要明確地創建迭代器 - 隱式會做。因此,第一種情況的代碼可以簡寫爲
a = ['hello', 'world', '1', '2', 'other', 'thing']
c = dict(zip(a, a))
相同的迭代器vs不同的迭代器。 –
因爲在第二種情況下,你已經將一個迭代器傳遞給'izip'函數,而且迭代器是一次迭代'izip'將以交織方式從實際迭代中消耗項目。 (每次迭代兩項)。 – Kasramvd