1 生成器函数的含义
生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法。相较迭代器而言,生成器简单使用。
2 生成器的创建方式
2.1 生成器表达式
把列表推导式的[] 修改为(),如
(i for i in range(1, 10000) if i % 2 == 0)
代码执行界面如下:
2.2 生成器函数
(1)在一个一般函数中使用yield关键字,可以实现一个最简单的生成器,此时这个函数变成一个生成器函数。简单来说,生成器函数就是函数
中包含 yield语句的函数。
yield语法:yield [返回值] ([] 表示可选参数)。
yield的作用:yield可以去阻断当前的函数执行。当使用next()(或.__next__())函数,会让函数继续执行,yield后面的值作为next()函数
返回值,当执行到下一个 yeild时,又会被暂停挂起。
yield与return的区别:yield会保存当前函数的执行状态,在返回后,函数又回到之前保存的状态继续执行;而return返回后,函数
状态终止。
(2)代码实例
1 def mylist(): 2 for i in range(3): 3 print("列表的第%s个元素:" % i, end="") 4 yield i 5 6 7 ml = mylist() # 创建一个生成器 8 print(next(ml)) 9 print(next(ml)) 10 print(next(ml)) 11 print(next(ml)) # 当生成器遍历完后,再遍历就会报错
代码执行顺序示意图:
3 生成器的遍历
3.1 next()或.__next__()遍历,代码如下
1 # 方式1 2 ml = (i for i in range(1, 10) if i % 2 == 0) 3 print("next()方式遍历结果:", end="") 4 print(ml.__next__(), end=" ,") 5 print(ml.__next__(), end=" ,") 6 print(ml.__next__(), end=" ,") 7 print(ml.__next__()) 8 9 # 方式2 10 ml2 = (i for i in range(1, 10) if i % 2 == 0) 11 print(".__next__()方式遍历结果:", end="") 12 print(next(ml2), end=" ,") # next()相当于 生成器.__next__() 13 print(next(ml2), end=" ,") 14 print(next(ml2), end=" ,") 15 print(next(ml2))
上面代码执行结果如下:
3.2 for in方式遍历,代码如下,
1 ml = (i for i in range(1, 10) if i % 2 == 0) 2 print("for in 遍历结果为;", end=" ") 3 for i in ml: 4 print(i, end=", ")
上面代码执行结果为:
4 关闭生成器
命令:生成器名称.close() ,例如 ml.close()。
注意:生成器只会遍历一次,当关闭生成器或者遍历一遍后,后续如果再调用,会抛出StopIteration异常提示。下次如果想继续重新遍历,必须先重新创建生成器。