zoukankan      html  css  js  c++  java
  • python3

    在Python中,这种一边循环一边计算的机制,称为生成器:generator。

    生成器保存的是算法,每次调用 next() ,就计算出 下一个元素的值,
    直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常
    当然,这种不断调用 next() 实在是太变态了,正确的方法是使用 for 循环,因为生成器也是可迭代对象。
    所以,我们创建了一个生成器后,基本上永远不会调用 next() ,
    而是通过 for 循环来迭代它,并且不需要关心 StopIteration 异常。

    创建生成器的方法:
    1、只要把一个列表生成时的[]改为()
    2、定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator


    用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中
    while True:
    try:
    x = next(g)
    print("value:%d"%x)
    except StopIteration as e:
    print("生成器返回值:%s"%e.value)
    break

    生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。
    生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。
    def gen():
    i = 0
    while i<5:
    temp = yield i
    print(temp)
    i+=1

    r = gen()
    可以通过next(r)或者 r.__next__()方法获取下一个值


    生成器的特点:
    1、节约内存
    2、迭代到下一次的调用时,所使用的参数都是第一次所保留下的,
    即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的
  • 相关阅读:
    Java的Regex --正则表达式
    Java的包装类
    类的始祖Object
    abstract和interface关键字介绍
    内部类
    Accumulation Degree [换根dp,二次扫描]
    牛客练习赛61 [口胡]
    CF1334G Substring Search [bitset,乱搞]
    CF1175F The Number of Subpermutations [哈希,乱搞]
    CF793G Oleg and chess [线段树优化建边,扫描线,最大流]
  • 原文地址:https://www.cnblogs.com/AndyChen2015/p/7410225.html
Copyright © 2011-2022 走看看