迭代器、生成器基础知识都已经学完。原理了解差不多了,具体实际用处下一遍讲。
生成器是特殊的迭代器,可以让代码输出后停止,随后直接执行,还能传参。
'''
生成器:
在函数里面有yeld就是生成器,
比列表更省内存,
'''
# 方法一:
nums = [x * 2 for x in range(10)]
# 此时nums 是一个列表
nums = (x * 2 for x in range(10))
# 此时nums 是个生成器
# 方法二:
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
# print(a) 上篇讲迭代器时这用的是print,但是如果将所有数据保存下来还是需要用append填加 到列表里面,依然占用内存。
# 因此用yield 将函数 变成 生成器模板。运行到yield时会输出,随后继续向yield后边运行。
# 用next()方法取数。
yield a
current_num += 1 # 每次用这个计数是总感觉很low
# 如果在调用create——num的时候,发现这个幻术中有yield那么此时,不在是调用一个函数,而是创建一个生成器对象。
obj = create_num(10)
# 如果想输出后边的值就多复制一个,有没有别的办法?
ret = next(obj)
print(ret)
'''
用生成器创建出一个生成器模板,如果想循环获取用while,停止时需要用捕获异常停止,
如果想获取return的返回值,也用异常捕获赋值。
'''
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
yield a
a,b= b,a+b
current_num += 1
return "ok******"
obj = create_num(10)
while True:
try:
ret = next(obj)
print(ret)
except Exception as ret:
print(ret.value)
break
'''
理解next 和send 方法运行的过程
如果想往迭代器里传参数,需要send()方法,同时他也可以代替next()取值。
send()长用在next()后边,放在前面会报错,解决办法send(None)
'''
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
ret = yield a # ret不用再def里声明。
print(">>>ret>>>",ret)
a, b = b, a + b
current_num += 1
obj = create_num(10)
ret = next(obj)
print(ret)
ret = obj.send("None")
print(ret)