zoukankan      html  css  js  c++  java
  • Python 生成器generator

    列表的问题
    列表生成器可以直接创建一个表,
    但是,如果一个表中有100万个元素,那么这个表太占空间,
    而且往往我们仅仅需要访问前面几个元素,后面绝大多数元素占用的空间都白白浪费了。

    生成器
    如果列表元素可以按照某种算法推算出来,那我们可以在循环的过程中不断的推算出后续的元素。而不用一开始就创建整个list.
    这样,节省了大量的空间。
    这种一遍循环一遍计算的机制,称为生成器:generator.


    创建生成器generator.
    第一种方法:只要报一个列表生成式的[]改成(),就穿件了一个generator.
    创建列表

    L = [x*x for x in range(10)]
    print L
    #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    创建生成器

    g =(x*x for x in range(10))
    for n in g:
      print n

    第二种方法:用函数来实现。裂变生成式的for循环无法实现的时候,还可以用函数来实现。
    如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

    def fib(m):
    n, a, b = 0, 0, 1
    while n < m:
        yield b
        a, b = b, a + b
        n = n + 1
        return

    在生成器中,不允许return后面带任何参数。否则:SyntaxError: 'return' with argument inside generator
    因为在生成器中,return会引起StopIterationError。 一般生成器也不通过这种return的方式返回值。


    函数生成器的工作原理:
    函数定义中包含yield关键字那么函数就变成了生成器。在生成器执行过程中,遇到yield就中断,下次又继续从中断点后执行。
    函数形式定义的生成器一般不会用next()来获取下一个返回值。而是直接用for循环来迭代。

  • 相关阅读:
    nginx不支持pathinfo模式解决方法
    php只保留两位小数
    分享图文到QQ空间
    android 使用信鸽推送通知栏不显示推送的通知?
    Editetext获取焦点后让输入软键盘中出现搜索按键
    Android EditText的使用过程中遇到的问题
    在线根据现有apk生成指定id的推广apk (已过时)
    @Validated和@Valid区别
    idea快捷键使用总结
    大概
  • 原文地址:https://www.cnblogs.com/haoshine/p/5092477.html
Copyright © 2011-2022 走看看