Python3.7之生成器

Python3.7之生成器

1、生成器概念

Python使用生成器對延遲操做提供了支持。所謂延遲操做,是指在須要的時候才產生結果,而不是當即產生結果。主要有兩種結構能夠延遲結果建立。生成器函數和生成器表達式。python

1.生成器函數

和其餘函數編寫方式相同,可是使用yield語句一次返回一個結果,在每一個結果之間掛起當前狀態,下次調用的時候會從當前狀態繼續。函數

def count(n):
    yield n**2


for i in range(5):
    print(count(i).__next__())
    
'''
0
1
4
9
16
'''

2.生成器表達式

相似於列表解析,不一樣的是它返回的是一個可迭代對象而不是一個列表。code

a = (m**2 for m in range(5))
print(type(a))

# <class 'generator'>

注意:生成器是一個對象,咱們用的是()而不是[]。用[]就等於建立一個列表。對象

任何使用了yield的函數就是生成器,生成器就是一個返回迭代器的函數,或者說生成器就是一個迭代器。generator

2、總結yield

實現斐波那契數列:class

def feibo():
    a = 0
    b = 1
    while True:
        yield b  # 先返回再暫停
        a, b = b, a + b


f = feibo()
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())

'''
1
1
2
3
5
8
13
'''

1.和return類似,返回值。test

2.暫停迭代,直到調用下一個next()方法。先返回再暫停。yield

3.調用的時候返回生成器對象。迭代器

假如yield後面緊接着一個數據,就會把數據返回,做爲next()函數或者for ...in...迭代出的下一個值。程序

3、send()

yield還能接收值,用send方法傳入。

咱們能夠經過send()方法,向生成器內部傳遞參數。

next(g)至關於send(None)

def test():
    i = 1
    while i < 5:
        temp = yield i**2
        print(temp)
        i += 1


t = test()

# 第一次運行只能使用next或者send(None)
print(t.__next__())
# send的做用至關於使生成器繼續運行,而且傳遞的參數爲yield的返回值(程序中即temp的值)
print(t.send("Hello World"))
print(t.__next__())
# 至關於send(None) 此時temp = None

'''
1
Hello World
4
None
9
'''

yield = a,會返回a。

b = yield,會把yield接收的值賦值給b。

def count(n):
    x = 0
    while x < n:
        value = yield x
        if value is not None:
            print('Received value: %s' % value)
        x += 1


x = count(5)
print(next(x))
print(x.send('hello'))
print(next(x))

'''
0
Received value: hello
1
2
'''
def h():
    print("Wen Chuan")
    m = yield 5
    print(m)
    d = yield 12


c = h()
print(next(c))
print(c.send("."))

'''
Wen Chuan
5
.
12
'''
相關文章
相關標籤/搜索