$python生成器

本文講解一下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關鍵字的方式來建立生成器。code

若是一個函數中出現了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
相關文章
相關標籤/搜索