python---生成器

目录

一、概念

二、生成器基础

1.生成器函数

2.有返回值的生成器

3.创建一个生成器,生成一个生产线

4.send()方法

5.用一个生成器,求平均数

6,yield from

三、生成器表达式

1.格式     

2.练习:老母鸡下蛋


一、概念

生成器的本质就是迭代器。

生成器包括两种:生成器函数和生成器表达式

二、生成器基础

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

使用for环取出g1生成器值的所有值

使用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__()方法

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值