2024-05-29 02:54:44 发布
网友
我正在读一本书Think Python: How to think like a computer scientist,它说在Python 3.x中,dict([list of tuples])返回一个iterator,而不是一个list(Python 2.7就是这样)。
dict([list of tuples])
iterator
list
这本书没有进一步解释,这使我感到困惑。我特别想知道:
迭代器和列表有何不同,并且
在列表上返回迭代器有什么好处?
迭代器是一种机制,通过它,您可以使用for在一个列表或其他一些对象/值集上进行迭代。列表实现迭代器。但也可以实现返回数字序列、随机字符串等的迭代器
for
当您返回迭代器时,您只是返回迭代对象;接收代码对底层容器或生成器算法一无所知。
迭代器很懒;它们只在被要求返回序列或列表中的下一个元素时才返回。因此,可以用它们实现无限序列。
进一步阅读Iterator TypesThe ^{} statement
首先,你的书错了(或者你误解了):
>>> dict([(1, 2), (3, 4), (5, 6)]) {1: 2, 3: 4, 5: 6}
如您所见,dict([list of tuples])返回Python 2.x和3.x中的字典
dict([
list of tuples
])
列表和迭代器的根本区别在于,列表按特定顺序包含多个对象,因此您可以从中间的某个位置拉出其中一个对象:
>>> 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函数一次检索一个值。
next
iterable对象是一个提供__iter__方法的对象,当您将iterable传递给iter函数时将调用该方法。通常不需要显式地执行此操作;例如,for循环会隐式地执行此操作。环状物
__iter__
iter
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
迭代器是一种机制,通过它,您可以使用
for
在一个列表或其他一些对象/值集上进行迭代。列表实现迭代器。但也可以实现返回数字序列、随机字符串等的迭代器当您返回迭代器时,您只是返回迭代对象;接收代码对底层容器或生成器算法一无所知。
迭代器很懒;它们只在被要求返回序列或列表中的下一个元素时才返回。因此,可以用它们实现无限序列。
进一步阅读} statement
Iterator Types
The ^{
首先,你的书错了(或者你误解了):
如您所见,
dict([
list of tuples
])
返回Python 2.x和3.x中的字典列表和迭代器的根本区别在于,列表按特定顺序包含多个对象,因此您可以从中间的某个位置拉出其中一个对象:
。。。而迭代器按特定顺序生成多个对象,通常根据请求动态创建它们:
我在这里使用^{} 进行演示;在实际代码中,使用for循环遍历迭代器更常见:
请注意权衡:一个由一万亿个整数组成的列表将比大多数机器可用的内存要多,这使得迭代器的效率更高。。。以不能在中间某处索要物品为代价:
列表是包含一系列值的数据结构。迭代器是一个对象,它提供一个接口,通过
next
函数一次检索一个值。iterable对象是一个提供
__iter__
方法的对象,当您将iterable传递给iter
函数时将调用该方法。通常不需要显式地执行此操作;例如,for
循环会隐式地执行此操作。环状物自动调用
list
的__iter__
方法。您可以使用或者更明确地说
一种方法是从一个单列表创建两个迭代器。
相关问题 更多 >
编程相关推荐