iterable数据类型每次返回其中的一个数据项。
任意包含__iter__()方法的对象或任意序列(也即包含__getitem__()方法的对象,该方法接受从0开始的整数参数)都是一个iterable,并可以提供一个迭代子。迭代子是一个对象,该对象可以提供__next__()方法,该方法依次返回每个相继的数据项,并在没有数据项时产生StopIteration异常。
数据项返回的顺序依赖于底层的iterable。对列表与元组等情况,数据项的返回通常从第一个数据项(索引位置0)开始依序返回,但是有些迭代子也可能以任意顺序返回数据项——比如,用于字典与集合的迭代子。
内置的iter函数有两种很不同的行为。给定一个组合数据类型或序列时,该函数将返回一个用于传递给函数的对象的迭代子——如果该对象无法进行迭代,就产生一个TypeError异常。在创建自定义组合数据类型时,会有这种用法,但在其他上下文中极少使用。第二种不同的iter()行为是在为该函数传入一个可调用的(函数或方法)参数与一个哨点值。在这种情况下,传入的函数在每次迭代时都会进行调用,并每次返回该函数的返回值,如果返回值等于哨点值,就产生StopIteration异常。
使用for item in iterable循环时,Python在效果上是调用iter(iterable)来获取一个迭代子。之后再每次循环迭代时,将调用该迭代子的__next__()方法以获取下一个数据项,在产生StopIteration异常时,将捕获这个异常,循环终止。获取迭代子的下一项的方法是调用内置的next函数。
product = 1
for i in [1,2,4,8]:
product *= i
print(product) # prints:64
#相当于
product = 1
i = iter([1,2,4,8])
while True:
try:
product *= next(i)
except Stopiteration:
break
print(product) # prints:64
通过调用tuple(i),任意(有穷的)iterable,i,都可以转换为一个元祖,或通过调用list(i)转换为一个列表。enumerate函数以迭代子伟参数,并返回一个枚举对象,该对象可以看成迭代子,每次迭代时,将返回一个二元组,该二元组的第一项为迭代次数(默认从0开始),第二项是来自enumerate()调用时的迭代子的下一项。
open函数以文本模式打开时返回的文件对象可用作迭代子,每次迭代时返回该文件的一行。通过将迭代子传递给enumerate(),可以获取一个枚举迭代子,该迭代子在每次迭代时,将返回迭代次数(存放于变量line,“行号”中)以及该文件的一行。enumerate函数接受一个可选的关键字参数,start,默认为0,使用时这一参数设置为1,因为按照常规,文本文件行号是从1开始计数的。
sorted()函数返回一个列表,列表中的数据项都进行了排序,reversed()函数简单地返回一个迭代子,该迭代子在进行迭代时采用的顺序与作为参数赋予该迭代子的值顺序想法。