目录
什么是生成器
在Python中,一边循环一边计算的机制,称为生成器:generator。但是它的本质还是迭代器。在python中是基于函数的形式变成的。
获取生成器的方法
1、通过生成器函数
通过生成器函数与自定义函数类似,都是需要将range换成yield,表示产生。在使用生成器时,也与常规调用函数不同,是在函数名的后面加上.__next__()。与调用迭代器方法一样。在获取时可以通过for循环获取内部的元素
def 函数名():
yielr 生成值
def function():
yield 1 # 生成第一个值
yield 2 # 生成第二个值
2、通过各种推导式来实现生成器
有关通过推导式生成一个生成器的详情看下面链接
python推导式_HHYZBC的博客-CSDN博客https://blog.csdn.net/HHYZBC/article/details/123620545
怎么调用生成器
直接调用函数名时,生成器函数是不会运行的,必须先将函数名加括号赋值给另一个变量,表示获取生成器
def function():
yield 1 # 第一个值
yield 2 # 第二个值
a = function() # 获取生成器
print(a.__next__()) # 输出内容为1
print(a.__next__()) # 输出内容为2
也可以使用for循环进行迭代获取生成器。生成器本质上还是迭代器。
yield与range的区别
range表示返回某个值,在函数内部中遇到会直接停止这个函数,可以出现多次,但是只会执行到第一次遇到的位置。而yield是表示产生某个值,可以出现多次,但是它是分段运行函数,每次遇到yield时都会停止运行,直到再次使用.__next__()方法时会进行运行下一段函数。
生成器的好处
因为本质是迭代器,所以迭代器有的好处生成器都有。
send方法
格式:
生成器.send(数据)
例子:
def function():
for i in range(1, 11): # 循环生成1到10
a = yield str(i) # 将生成器的值赋值给a
print(a) # 打印a
a = function() # 获取生成器
print(a.__next__()) # 打印第一次
print(a.__next__()) # 打印第二次
print(a.send('a')) # 打印第三次并修改此时生成器的值
print(a.__next__()) # 打印第四次
我个人的理解是修改上一次生成器的值。
第一次使用生成器生成1,然后由于遇到yield,使用生成器暂停运行
第二次使用生成器将第一次生成器的值赋值给a并打印,此时打印为None,然后进入第二次循环生成2,遇到yield,使用生成器暂停运行
第三次使用生成器由于send将a赋值给第二次生成器的值并打印变量a,此时变量a为a,然后进入第三次循环生成3,遇到yield,使用生成器暂停运行
第四次使用生成器将上一次生成器的值赋值给变量a并打印,此时为None,然后进入第四次循环生成4,遇到yield,使用生成器暂停运行。
以上是我个人理解,如果有错误欢迎大佬们指出。