生成器与迭代器的区别


''' 生成器: 
生成方法1:生成器表达式 tu = (i for i in range(1,11))
元组的推导式,打印出来是一个生成器generator,我们称之为生成器表达式 tu = (i for i in range(1,11))
生成器:什么时候用,什么时候去取值
优点:节约内存,提高性能
'''
tu = (i for i in range(1,11))
print(tu) # <generator object <genexpr> at 0x00000000023EEFC0> 生成器对象
# print(next(tu))  # 可以使用next()方法依次访问里面的元素

'''生成器:
生成方法2:通过yield定义函数定义生成器
当函数中有yield关键字时,函数不会立即运行
生成器记录了上一次在函数体中的位置
'''
def gen_fun():
    yield 1000
    print('hello')
    yield 1001
res = gen_fun()
# print(res)  # 当函数中有yield关键字时,函数不会立即运行,这个时候返回的是生成器对象<generator object gen_fun at 0x000000000244D200>
# print(next(res)) # 1000
# print(next(res)) # hello  1001 当下一个next()的时候才会执行hello
# print(next(res)) # StopIteration # 不再返回元素,再执行就会抛出中断异常

# ==============================================
'''迭代器:
(1)生成器是迭代器的一种:因为可以使用next()方法取值
(2)可迭代对象:只要可以通过for遍历的称为可迭代对象iterable,可迭代对象内部只实现了__iter__方法
(3)可通过iter()方法将迭代对象转换成迭代器
(4)迭代器内部实现了__iter__方法外,还实现了__next__方法
'''
li = [1,2,3,4]
li1 = iter(li) # 返回一个可迭代对象iter()触发了对象li的内置方法__iter__'''
# 迭代器内部实现了__iter__方法外,还实现了__next__方法
# print(next(li1)) # 触发了li1对象的__next__方法

'''生成器相比迭代器  
1 生成器是生成元素的,迭代器是访问集合元素的一中方式
2 生成器是迭代器的一种
3 多了方法send:send方法用来与生成器交互
'''
def gen():
    for i in range(1,5):
        se = yield i
        print(se)

g = gen()
print(next(g)) # 1
print(g.send(100)) # 100 2 这里的100赋值给se(打印2的原因是因为yield才是暂停这个函数,等待下一个next触发)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值