在Python中,list和iterator有什么区别?

2024-05-29 02:54:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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


Tags: ofto列表dictcomputerlistlikehow
3条回答

迭代器是一种机制,通过它,您可以使用for在一个列表或其他一些对象/值集上进行迭代。列表实现迭代器。但也可以实现返回数字序列、随机字符串等的迭代器

当您返回迭代器时,您只是返回迭代对象;接收代码对底层容器或生成器算法一无所知。

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

进一步阅读
Iterator Types
The ^{} statement

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

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

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

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

iterable对象是一个提供__iter__方法的对象,当您将iterable传递给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

相关问题 更多 >

    热门问题