PYTHON 学习笔记之迭代器与生成器
迭代器
访问集合元素的一种方式
一般方法分为两种 iter() 和 next()
下面的代码实验简单的迭代
list = [0,1,2,3,4,5] # 创建一个列表
i = iter(list) # 使用iter()创建一个迭代器
print(next(i)) # 使用next()输出迭代器的元素
print(next(i))
# 也可以使用循环来遍历
# 这里要注意到下面的遍历开始的起点是2
# 因为上面两个next使迭代器中指向的元素前进了两位
for x in i:
print(x,end=',')
输出结果:
0
1
2,3,4,5,
生成一个迭代器
这里涉及面向对象编程已经类的创建,这部分内容下次再详细讲解
生成器
在python中,使用了yield的函数成为生成器
它只能返回迭代器,只能用于迭代操作
在调用生成器的时候,每次遇到yield,函数就会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行
简单的使用yield实现斐波那契数列
import sys
def fib(n): # 生成器函数 用于生成斐波那契数列
a, b, c = 0, 1, 0
while True:
if (c > n):
return # 循环出来的条件
yield a # 保存运行到这里程序的状态,并将a的值返回
# 并且下一次进入时从上一次保存的状态往下运行
# 对于这个函数来说就是保存了上一次a,b,c的值
a, b = b, a + b
c += 1
f = fib(5)
while True:
try:
print(next(f), end=",")
# 这里print的值相当于每次yield的a值
except StopIteration:# 抛出异常结束
sys.exit()
输出结果:
0,1,1,2,3,5,
总结
一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。