''' 生成器:
生成方法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触发)
生成器与迭代器的区别
最新推荐文章于 2022-06-14 16:33:43 发布