生成方法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触发