zoukankan      html  css  js  c++  java
  • $python生成器

    本文讲解一下python生成器的基本用法。

    生成器的使用场景

    当数据量很大的时候,比如从一个超大文本文件中读取内容,如果一下子把数据全部放在列表中,相当于一下子把大量数据放在了内存中,有可能造成内存溢出。那么如何解决呢?

    解决方案:不存储所有的数据,而是存储列表元素的生成算法(相当于递推公式),只在使用的时候再根据生成算法生成相应的元素(惰性计算),这就是生成器。

    创建生成器的方式

    把列表生成式的中括号改为小括号

    a = (x for x in range(3))
    print '【Output】'
    print type(a)
    print a.next()
    print '-----'
    for x in a:
        print x
    
    【Output】
    <type 'generator'>
    0
    -----
    1
    2
    

    用yield关键字

    如果生成器的递推算法比较复杂,列表生成式的方式已经无法满足要求,那么可以用函数+yield关键字的方式来创建生成器。

    如果一个函数中出现了yield关键字,那么这个函数就不再是一个普通函数了,而变成了一个生成器,例如:

    def getNum(max):
        x = 0
        while x < max:
            yield x  # 相当于把普通函数的return语句变成了yield语句
            x += 1
    a = getNum(3)
    
    print '【Output】'
    print type(a)
    for x in a:
        print x
    
    【Output】
    <type 'generator'>
    0
    1
    2
    

    函数遇到yield就中断的特性

    def get():
        for i in range(3):
            print 'step' + str(i)
            yield i
        yield 111
        
        for i in range(10,12):
            print 'step' + str(i)
            yield i
        yield 222
    
    a = get()
    print '【Output】'
    for x in a:
        print x
    
    【Output】
    step0
    0
    step1
    1
    step2
    2
    111
    step10
    10
    step11
    11
    222
    

    生成器的应用:生成斐波那契数列

    def fib(max):
        a,m,n = 0,1,1
        while(a < max):
            yield m
            m,n = n,m+n
            a += 1
    print '【Output】'
    for x in fib(6):
        print x
    
    【Output】
    1
    1
    2
    3
    5
    8
  • 相关阅读:
    第七周psp
    【探路者】第三周立会报告6(总第18次)
    版本控制报告
    【探路者】第三周立会报告5(总第17次)
    【探路者】第三周立会报告4(总第16次)
    【探路者】第三周立会报告3(总第15次)
    #【探路者】第三周立会报告2(总第14次)
    【探路者】第三周立会报告1(总第13次)
    PSP
    【探路者】第二周立会报告6(总第12次)
  • 原文地址:https://www.cnblogs.com/jiayongji/p/7401291.html
Copyright © 2011-2022 走看看