2014-09-03 28 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 
相关问题