python三大神器之一(生成器)

13、生成器

13.1 创建生成器

简易生成器:
list1 = [x for x in range(5)]
print(list1)

obj1 = (x for x in range(5))  #简易生成器
print(obj1)

展示:
[0, 1, 2, 3, 4]
<generator object <genexpr> at 0x0000026142D51318>


函数生成器:
def fei(num):
    a = 0
    b = 1
    current_index = 0
    while current_index < num:
        # print(a)
        yield a
        a,b = b,a+b
        current_index += 1
gen = fei(4)
print(gen)
for i in gen:
    print(i)
# ret = next(gen)
# print(ret)
# ret = next(gen)
# print(ret)
# ret = next(gen)
# print(ret)
# ret = next(gen)
# print(ret)

展示:
<generator object fei at 0x0000024E097E2318>
0
1
1
2


注意点:
函数里面出现yield,说明已经不是一个简单的函数,而是生成器,用for遍历(或者next少用)

13.2 关于生成器

from collections.abc import Iterable

list1 = [x for x in range(5)]
print(list1)

obj1 = (x for x in range(5))
# print(tuple(obj1))
print(obj1)
print(isinstance(obj1,Iterable))


展示:
[0, 1, 2, 3, 4]
<generator object <genexpr> at 0x0000026142D51318>
True


注意点:
1(推导式)生成的是一个生成器
2、如果想要转元组,tuple进行强转
3isinstance判断,生成器是一个可迭代对象,用for循环可以挨个取出每一个对象

13.3 关于生成器的访问

方法一:

print(next(obj1))
print(next(obj1))
print(next(obj1))
print(next(obj1))
print(next(obj1))
print(next(obj1,'没有数据了'))

# for i in obj1:
#      print(i)


展示:
0
1
2
3
4
没有数据了


注意点:
1、访问方式:(1)通过for循环来进行遍历
		   (2next()如果遍历的次数超过总个数,会报错,所以使用的时候,要么赋值默认值,要么使			用try
    

方法二:

def fei(num):
    a = 0
    b = 1
    current_index = 0
    while current_index < num:
        params = yield a
        print('本次接受的参数',params)
        a,b = b,a+b
        current_index += 1
# 产生一个生成器对象
gen = fei(5)

# gen.send(None)
print(next(gen))
print('##########')
print(gen.send('java'))
print('$$$$$$$$$$$$')
print(gen.send('python'))
print('%%%%%%%%')
print(gen.send('go'))


展示:
0
##########
本次接受的参数 java
1
$$$$$$$$$$$$
本次接受的参数 python
1
%%%%%%%%
本次接受的参数 go
2


注意点:
如果使用send函数唤醒生成器,第一次调用send的时候,传入的值为None
一般情况下,会使用next来唤醒执行第一次

13.4 yield与return的区别

yield在生成器中的作用:

[外链图片转存失败(img-iPD3eqYP-1564742124133)(G:\CSDN1\基础知识\基础知识1.png)]

yield与return的区别
yield的特点:
程序在执行的时候遇到yield会暂停执行,如果yield后面有返回值,先把值返回再暂停
再次启动生成器获取数据的时候会从暂停的地方开始执行
Return只返回一次值,后面有代码不执行,yield可以多次返回值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值