Python生成器函数和迭代器:yield和iter、next方法
Python生成器函数是一种特殊的函数,它可以暂停执行并返回一个中间结果,然后继续执行。这种函数可以使用yield关键字来定义,生成器函数的返回值是一个可迭代的对象,可以通过for循环或next方法来遍历它。在遍历生成器对象时,每次调用next方法都会从上一次yield语句处继续执行,直到生成器函数执行完毕或者遇到return语句。
下面是一个简单的示例,它展示了如何使用生成器函数来生成斐波那契数列:
def fib(max):
a, b = 0, 1
while a < max:
yield a
a, b = b, a + b
f = fib(1000)
for i in f:
print(i)
# 输出:
# 0
# 1
# 1
# 2
# 3
# 5
# ...
在这个例子中,生成器函数fib使用yield语句生成斐波那契数列的每个数字。当生成器对象f被遍历时,每次调用next方法都会从上一次yield语句处继续执行,生成下一个数字。当a达到1000时,生成器函数终止,遍历结束。
除了使用for循环来遍历生成器对象外,我们也可以使用next方法来逐个访问生成器的每个元素:
f = fib(1000) print(next(f)) # 输出 0 print(next(f)) # 输出 1 print(next(f)) # 输出 1 print(next(f)) # 输出 2 print(next(f)) # 输出 3 print(next(f)) # 输出 5 # ...
此时,如果继续调用next方法,生成器会继续生成下一个数字,直到生成器函数执行完毕,抛出StopIteration异常。
另一个与生成器相关的概念是迭代器。迭代器是一种实现了__iter__和__next__方法的对象。__iter__方法返回迭代器自身,__next__方法返回迭代器中的下一个元素。在Python中,所有可迭代的对象都实现了__iter__方法,因此它们都是迭代器。生成器对象也是一种迭代器。
下面是一个简单的例子,它使用iter和next方法来遍历一个序列:
s = 'hello' it = iter(s) # 获取迭代器 print(next(it)) # 输出 'h' print(next(it)) # 输出 'e' print(next(it)) # 输出 'l' print(next(it)) # 输出 'l' print(next(it)) # 输出 'o' print(next(it)) # 抛出 StopIteration 异常
在这个例子中,我们使用iter函数获取字符串s的迭代器对象,然后使用next方法逐个访问其中的元素。当所有元素都被访问完毕时,再调用next方法会抛出StopIteration异常。
需要注意的是,Python中的for循环语句会自动调用iter函数来获取对象的迭代器,因此我们可以通过for循环来遍历任何可迭代的对象:
s = 'hello'
for ch in s:
print(ch)
# 输出:
# h
# e
# l
# l
# o
在这个例子中,我们使用for循环语句遍历字符串s的每个字符,由于字符串s是一个可迭代的对象,因此for循环语句会自动调用它的__iter__方法来获取它的迭代器对象,并使用next方法来逐个访问其中的元素。
综上所述,Python中的生成器函数和迭代器为我们提供了一种方便和高效的遍历序列和集合的方法。生成器函数可以使我们按需生成序列的元素,而不会占用太多的内存空间;迭代器则可以帮助我们逐个访问元素,而不必将整个序列都加载到内存中。
