目录
一、概念
生成器的本质就是迭代器。
生成器包括两种:生成器函数和生成器表达式
二、生成器基础
1.生成器函数
一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内。
(1).生成器函数执行之后会得到一个生成器作为返回值,并不会执行函数体。
(2).执行了__next__()方法之后才会执行函数体,并且获得返回值。
(3).next()内置方法,内部调用生成器函数的__next__()方法。
(3).yield和return相同的是可以返回值,但是不同的是yield 不会结束函数
我们要明白的是:
next(函数地址)等价于 函数地址.__next__()
2.有返回值的生成器
3.创建一个生成器,生成一个生产线
我把代码放在下面,大家可以试试:
def ksf():
for i in range(1,2000001):
yield "正在生产第{}桶方便面".format(i)
a = ksf()
#第一种方法
for i in range(1,2000001):
print(next(a))
#第二种方法
for fbm in a:#a 是一个迭代器,我们用for循环一个一个取出来
print(fbm)
4.send()方法
(1)send()获取下一个值的效果和next()基本一样,只是在获取下一个值的时候,会给上一个yield的位置传递一个数据
(2)使用send()的注意事项:
1)第一次使用生成器的时候,是用next()获取下一个
2)最后一次yield不能接受外部的值
5.用一个生成器,求平均数
6,yield from
使用yield取出生成器的值
三、生成器表达式
1.格式
将列表推导式的 [ ] 改成 () 即可
# 列表推导式:
lst = [i for i in range(10)]
print(lst) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 生成器表达式:
g = (i for i in range(10))
for i in g:
print(i)
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
2.练习:老母鸡下蛋
# 1.列表推导式
egg_lst = ['鸡蛋%s' % i for i in range(10)]
print(egg_lst)
# ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
# 2.生成器表达式
laomuji = ('鸡蛋%s' % i for i in range(10))
for i in laomuji:
print(i)
# 鸡蛋0
# 鸡蛋1
# 鸡蛋2
# 鸡蛋3
# 鸡蛋4
# 鸡蛋5
# 鸡蛋6
# 鸡蛋7
# 鸡蛋8
# 鸡蛋9
laomuji = ('鸡蛋%s' % i for i in range(10))
print(list(laomuji))
# ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
# list()函数:底层会默认调用生成器的__next__()方法