Python“三大器”之生成器
生成器
1、什么是生成器
生成的工具
生成器是一个"自定义"的迭代器,本质上就是一个迭代器
2、如何实现生成器
yield:生成器
每一次yield都会往生成器对象中添加一个值
yield只能在函数内部定义
yield可以保存函数的暂停状态
# python内置的迭代器 # 可迭代对象 list1 = [1, 2, 3] # 迭代器对象:python内置的迭代器 list_iter = list1.__iter__()
# 自定义的迭代器 def func(): print("from func") yield 1, "bear", "pig" # return 1, "bear", "pig" res = func() # 当通过__next__取值时,才会执行函数体代码 print(res.__next__())
在函数内部定义了的yield,调用函数时,函数体代码不会执行,但是会返回一个结果,该结果就是一个生成器
用公鸡下蛋例子来解释生成器生成过程:
def func(): print("公鸡开始准备下蛋---") print("下蛋---1") yield "鸡蛋1" print("下蛋---2") yield "鸡蛋2" print("下蛋---3") yield "鸡蛋3" print("下蛋---4") yield "鸡蛋4" print("取最后一个蛋,查看是否下蛋成功") res = func() # 当通过__next__取值时,才会执行函数体代码 # print(res.__next__()) # print(res.__next__()) # print(res.__next__()) # print(res.__next__()) # next(迭代器对象) 也可以取值 print(next(res)) print(next(res)) print(next(res)) print(next(res))
上面例子中的next()作用等同于.__next__(),只不过使用方法不同
【迭代器对象.__next__() == next(迭代器对象)】
3、yield和return的区别
相同点:
返回值的个数都是无限制的
不同点:
return只能返回一次值
yield可以返回多个值
def func(): print("from func") yield 1, "bear", "pig" yield 2, "apple", "orange" # return 1, "bear", "pig" res = func() print(res.__next__()) print(res.__next__())
4、自定义生成器
在python2中,range(1, 5)生成一个列表[1, 2, 3, 4]
在python3中,range(1, 5)生成range对象,这个对象又是一个生成器,而生成器的本质是一个迭代器,所以range(1, 5)是一个迭代器对象
# 自定义range功能,创建一个自定义的生成器 def my_range(start, end, move=1): while start < end: yield start start += move range_iter = my_range(1, 5, 2) print(range_iter) for line in range_iter: print(line)