【文件属性】:
文件名称:中的新的可迭代对象-编译系统透视++图解编译原理_
文件大小:9.16MB
文件格式:PDF
更新时间:2024-06-29 19:45:42
Python 学习手册 中文 高清文字版
Python 3.0中的新的可迭代对象
Python 3.0中的一个基本的改变是,它比Python 2.X更强调迭代。除了与文件和字典这
样的内置类型相关的迭代,字典方法keys、values和items都在Python 3.0中返回可迭代对象,
就像内置函数range、map、zip和filter所做的那样。正如前一小节所介绍的,这些函数中的最
后三个都返回可迭代对象并处理它们。所有这些工具在Python 3.0中都根据请求产生结果,
而不是像它们在Python 2.6中那样构建结果列表。
尽管这样会节约内存空间,它可能在某种程度上会影响到我们的编码方式。目前为止,
在本书中的各种地方,我们已经把各种函数和方法调用结果都包含到一个list(...)调用中,从
而迫使它们一次产生其所有的结果:
>>> zip('abc', 'xyz') # An iterable in Python 3.0 (a list in 2.6)
>>> list(zip('abc', 'xyz')) # Force list of results in 3.0 to display
[('a', 'x'), ('b', 'y'), ('c', 'z')]
这在Python 2.6中不是必需的,因为像zip这样的函数返回结果的列表。在Python 3.0中,
它们返回可迭代的对象,根据需要来产生结果。这意味着要在交互提示模式下(并且可能在
某些其他的环境中)显示结果需要额外的录入,这对较大的程序来说很有用,在计算很大的
结果列表的时候,像这样的延迟计算会节约内存并避免暂停。让我们快速地浏览Python 3.0
可迭代对象的应用。
range迭代器
在上一章中,我们学习过range内置函数的基本行为。在Python 3.0中,它返回一个迭代
器,该迭代器根据需要产生范围中的数字,而不是在内存中构建一个结果列表。这取代了较
早的Python 2.X xrange(参见后面的版本差异提示),如果需要一个范围列表的话,你必须使
用list(range(...))来强制一个真正的范围列表(例如,显示结果):
C:\\misc> c:\python30\python
>>> R = range(10) # range returns an iterator, not a list
>>> R
range(0, 10)
>>> I = iter(R) # Make an iterator from the range
>>> next(I) # Advance to next result
0 # What happens in for loops, comprehensions, etc.
>>> next(I)
1
>>> next(I)
2
>>> list(range(10)) # To force a list if required
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
和这个调用在Python 2.X中返回的列表不同,Python 3.0中的range对象只支持迭代、索
引以及len函数。它们不支持任何其他的序列操作(如果你需要更多列表工具的话,使用
list(...)):
>>> len(R) # range also does len and indexing, but no others
10
>>> R[0]
0
>>> R[-1]
9
>>> next(I) # Continue taking from iterator, where left off