Python中的list和iterator有什么区别?

时间:2014-09-03 21:30:25

标签: python python-3.x python-2.7 list iterator

我正在阅读本书Think Python: How to think like a computer scientist,其中说在Python 3.x中,dict([list of tuples])会返回iterator而不是list(就像Python中的情况一样) 2.7)。

这本书没有进一步解释,这让我感到困惑。特别是,我想知道:

  1. 迭代器和列表有何不同,

  2. 在列表上返回迭代器有什么好处?

6 个答案:

答案 0 :(得分:18)

首先,你的书是错的(或者你误解了它):

>>> 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

我在这里使用next()进行演示;在实际代码中,使用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

答案 1 :(得分:8)

列表是包含一系列值的数据结构。迭代器是一个对象,它通过next函数提供一次一个地检索值的接口。

可迭代对象是提供__iter__方法的对象,当您将迭代传递给iter函数时会调用该方法。你并不经常需要明确地这样做;例如,for循环隐含地执行。像

这样的循环
for x in [1,2,3]:
    print x

自动调用list的{​​{1}}方法。您可以使用

明确地执行此操作
__iter__

或者更明确地使用

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

查看区别的一种方法是从单个列表创建两个迭代器。

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

答案 2 :(得分:4)

迭代器是一种机制,您可以使用for迭代列表或其他一组对象/值。列表实现了一个迭代器。但是您也可以实现返回数字序列,随机字符串等的迭代器。

当你返回一个迭代器时,你只是返回迭代对象;接收代码对基础容器或生成器算法一无所知。

迭代器是懒惰的;它们只在被要求时返回序列或列表中的下一个元素。因此,您可以使用它们实现无限序列。

进一步阅读
Iterator Types
The for statement

答案 3 :(得分:3)

这里的关键定义是:

  • 列表:完全存储在内存中,它也是一个迭代器 - 即你可以从一个元素转到下一个元素。
  • Iterable:实现Iterator协议的任何对象 - 即允许您从一个元素转到下一个元素。它可以使用存储在内存中的数据,也可以是文件,或者可以计算每个步骤。

很多东西都是不是列表的迭代,所有列表都是迭代

答案 4 :(得分:2)

迭代器是一个产生值的对象,但不一定与包含要产生的所有值的内存数据结构相关联。相反,列表是完全构造的并且驻留在存储器中。基本上,迭代器通常具有更高的内存效率,并且通常比作为内存结构创建的相同数据更高效,因为所有元素计算都可以在访问元素而不是前载时完成,并且所有元素都是& #39; t需要驻留在记忆中。

答案 5 :(得分:0)

您应该在此处阅读Python文档的迭代器协议指南:https://docs.python.org/2/library/stdtypes.html#iterator-types

基本上,Python中的迭代器是符合常规protocol的迭代器,用于迭代容器中的元素。 list是符合该协议的特定容器类型。