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

    生成器也是一种迭代器,与其他迭代器不同的是,生成器每次只进行一次迭代,只返回一个值。生成器并没有把所有迭代的内容都存储到内存中,而是在运行的过程中生成值。生成器亦可以通过遍历来使用,比如“for”循环,或者将其传递给任意可以进行迭代的函数或结构。
    大多数生成器都是通过函数来实现的,生成器并不会通过return来返回一个值,而是yield(可以翻译为‘生成’)一个值,如下面的实例:

    def generator_function():
        for i in range(5):
            yield i
    for item in generator_function():
        print(item)
    代码运行结果:    
    0
    1
    2
    3
    4
    

    生成器的最佳应用场景是:不想在同一时间内将所有计算出来的结果都存储到内存中,特别是结果集里还包含有循环

    这样会消耗大量的资源

    许多python 2里的标准库返回的都会列表,而在Python 3中大多都修改成了返回生成器,因为生成器占用的资源更少。下面是一个计算斐波那契数列的生成器:

    def fibon(n):
        a = 1
        b = 1
        for i in range(n):
            yield a
            a, b = b, a + b
    

    使用方法如下:

    result = []
    for x in fibon(20):
        result.append(x)    
    print(result)
    

    运行结果为:

    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
    

    使用这种方法我们可以不用担心代码会占用大量的内存。如果采用以前的方式来实现:

    def fibon(n):
        a = 1
        b = 1
        result = []
        for i in range(n):
            result.append(a)
            a,b = b, a + b
        return result
    

    这也许在计算很大的参数时,会用尽计算机的资源。
    我们知道生成器么一次调用只会进行一次迭代,接下来验证一下,Python有一个内置的函数next(),它允许获取序列的下一个元素,如:

    def generator_function():
        for i in range(3):
            yield i
            
    gen = generator_function()
    print(gen.next())
    0
    print(gen.next())
    1
    print(gen.next())
    2
    print(gen.next())
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    StopIteration
    
    

    我们可以看到,在yield掉所有的值后,next()触发了一个StopIteration的异常,该异常告诉我们所有的值都已经被yield掉了。那么为什么我们是用for循环时不会有该异常呢?原来是for循环会自动捕获该异常并停止调用next()

  • 相关阅读:
    我的第九个java程序--spring和mybatis整合(java project)
    php 批量插入字段
    php 遍历静态html成文章列表
    把world转成html
    java 读取world的图片 并把图片路径存入数据库
    我的第八个java程序--读取word内容
    我的第7个java程序--把java web项目改为java project项目--mybatis
    我的第六个java程序 spring-bean
    学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用
    学习spring1--跟我一起学Spring 3(2)–开发环境配置
  • 原文地址:https://www.cnblogs.com/qianyeliange/p/8635516.html
Copyright © 2011-2022 走看看