2014-09-03 26 views
2

我正在閱讀Think Python: How to think like a computer scientist這本書,其中說在Python 3.x中,dict([list of tuples])返回iterator而不是list(如Python 2.7中的情況)。Python中的list和iterator有什麼區別?

這本書沒有進一步解釋它,這讓我感到困惑。我特別想知道:

  1. 如何是迭代器,並列出不同,和

  2. 什麼是一個列表返回迭代器的優勢在哪裏?

+2

呃......'dict(...)''返回一個'dict'。在這兩個python版本中。你指的是「地圖」嗎? – roippi 2014-09-03 21:39:32

回答

3

迭代器是您可以使用for迭代列表或其他一組對象/值的機制。一個列表實現了一個迭代器。但是你也可以實現返回數字序列,隨機串等的迭代器。

當你返回一個迭代器時,你只是返回迭代對象;接收代碼不知道底層容器或生成器算法的任何內容。

迭代器很懶;當被要求時,它們只返回序列或列表中的下一個元素。因此你可以用它們實現無限序列。

進一步閱讀
Iterator Types
The for statement

0

列表是一個子集的所有迭代的對象,你可以不在名單可迭代的對象。

+2

列表是* iterables *,不是迭代器。 – 2014-09-03 21:36:00

2

迭代器是一個產生值的對象,但不一定與包含所有要生成的值的內存數據結構關聯。相比之下,清單是完全構建和駐留在記憶中的。基本上,迭代器通常具有更高的內存效率,並且通常比創建爲內存結構的相同數據性能更高,因爲所有的元素計算都可以在元素被訪問而不是前加載時完成,並且所有元素都不會不需要駐留在記憶中。

2

的關鍵在這裏的定義是:

  • 列表:完全存儲在內存中,而這也將是一個迭代器 - 即你可以從一個元素去下。
  • Iterable:實現Iterator協議的任何對象 - 即允許你從一個元素轉到下一個元素。它可以使用存儲在內存中的數據,它可以是一個文件,或者可以計算每個步驟。

很多事情是iterables這不是列表,所有的列表都iterables

11

首先,你的書是錯誤的(或者你誤會了吧):

>>> dict([(1, 2), (3, 4), (5, 6)]) 
{1: 2, 3: 4, 5: 6} 

正如你可以看到,dict([list of tuples])在Python 2.x和3.x中均返回字典。

列表和迭代器之間的根本區別就在於一個列表包含按特定順序的對象的數量 - 這樣你就可以,例如,從中間的某個位置拉他們一出來:

>>> my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> my_list 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> my_list[3] 
'd' 

...而迭代器產生一些對象以特定的順序,往往對動態創建他們的要求:

>>> my_iter = iter(range(1000000000000)) 
>>> my_iter 
<range_iterator object at 0x7fa291c22600> 
>>> next(my_iter) 
0 
>>> next(my_iter) 
1 
>>> next(my_iter) 
2 

我使用的是0用於演示目的的;在實際的代碼是更常見的迭代器與迭代的for循環:

for x in my_iter: 
    # do something with x 

通知的權衡:一個萬億整數的列表將使用更多的內存比大多數機器都可用,這使得迭代多更高效......在不能夠在中間的某個地方要求對象的成本:

>>> my_iter[37104] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'range_iterator' object is not subscriptable 
+0

我是Python新手。你如何調用任務產生的對象:「range()」?它是「任務」的正確方式來引用「範圍()」? – Stefano 2018-02-27 17:09:42

4

列表是保存一系列值的數據結構。迭代器是一個對象,它提供了一個接口,通過next函數一次檢索一個值。

一個可迭代的對象是一個提供__iter__方法的對象,當您將一個迭代函數傳遞給iter函數時會調用該方法。你通常不需要明確地這樣做;例如,一個for循環會隱式執行。像

for x in [1,2,3]: 
    print x 

環路自動調用list__iter__方法。你可以用

for x in iter([1,2,3]): 
    print x 

甚至更​​明確地這樣做明確地

for x in [1,2,3].__iter__(): 
    print x 

的一種方式,看看不同的是從單一名單創建迭代器。

l = [1, 2, 3, 4, 5] 
i1 = iter(l) 
i2 = iter(l) 
print next(i1) # 1 
print next(i1) # 2 
print next(i2) # 1 again; i2 is separate from i1 
print l   # [1, 2, 3, 4, 5]; l is unaffected by i1 or i2 
相關問題