python 简单理解生成器

迭代器、生成器基础知识都已经学完。原理了解差不多了,具体实际用处下一遍讲。

生成器是特殊的迭代器,可以让代码输出后停止,随后直接执行,还能传参。

'''
生成器:
    在函数里面有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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值