一、迭代器
支持迭代的容器,如列表(list)、元组(tuple)、字典(dict)、集合(set)这些序列式容器。
自定义迭代器的类中必须实现以下2个方法:
__next__(self):返回容器的下一个元素。
__iter__(self):该方法返回一个迭代器(iterator)。
除此之外,Python 内置的 iter() 函数也会返回一个迭代器,该函数的语法格式如下:
iter(obj[, sentinel])
其中,obj 必须是一个可迭代的容器对象,而 sentinel 作为可选参数,如果使用此参数,要求 obj 必须是一个可调用对象(__call__)。
二、生成器
特殊的迭代器,与迭代器不同的是,它可以实现在迭代的同时生成元素,而迭代器必须先将所有数据存储到容器中,才能开始迭代。
生成器创建方式也比迭代器简单很多:
定义一个以 yield 关键字标识返回值的函数;
调用刚刚创建的函数,即可创建一个生成器。
def intNum():
print('开始执行')
for i in range(5):
yield i
print('继续执行')
num = intNum() # 成功过创建了一个num生成器对象
和 return 相比,yield 除了可以返回相应的值,还有一个更重要的功能,即每当程序执行完该语句时,程序就会暂停执行。
print(intNum()) 即便调用生成器函数,Python 解释器也不会执行函数中的代码,它只会返回一个生成器(对象)。
要想使生成器函数得以执行,或者想使执行完 yield 语句立即暂停的程序得以继续执行,有以下 2 种方式:
通过生成器(上面程序中的 num)调用 next() 内置函数或者 __next__() 方法;
通过 for 循环遍历生成器。
# 调用next()内置函数
print(next(num))
# 调用__next()__方法
print(num.__next__())
# 通过for循环遍历生成器
for i in num:
print(i)
除此之外,还可以使用 list() 函数和 tuple() 函数,直接将生成器能生成的所有值存储成列表或者元组的形式。例如:
num = intNum()
print(list(num))
num = intNum()
print(tuple(num))