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)
以上是 Python“三大器”之生成器 的全部内容, 来源链接: utcz.com/z/530470.html