Python--核心2(生成器,迭代器,閉包,裝飾器)之生成器

1、生成器函數

  1.概念spa

    在Python中, 一邊循環一邊計算的機制, 稱爲生成器: generator code

    建立生成器: G = ( x*2 for x in range(5)) 協程

    能夠經過 next(生成器) 函數得到生成器的下一個返回值 對象

    沒有更多的元素時, 拋出 StopIteration 的異常 blog

    生成器也能夠使for 循環,由於生成器也是可迭代對象 generator

  2.生成器1 生成的第一種方式 it

list2 = [x for x in rang(10)]
print(type(list2))
#獲得一個生成器對象
g = (x*2 for x in rang(10))
print(type(g))
#打印生成器生成第一個數字
peint(next(g))
peint(next(g))
peint(next(g))
一共10個數字,打印超出報StopIteration異常 

  3.生成器io

   3.1使用循環求斐波那契數列的第n個數for循環

def feibo(items):
    a, b, n = 1, 1, 3
    while n <=items:
        if items == 1 or items ==2:
            return 1
        else:
            a, b =b, a +b
            print(b,end=" ")
            n += 1
    return b
feibo(4)

   3.2生成器的第二種生成方式  yield

    函數中只要有yield關鍵字,這個函數就變成了生成器

def fibo(n):
    a = 1
    b = 1
    i = 3
    if n == 1 or n == 2:
        return 1
    while i <= n:
        a, b = b, a + b
        i += 1
        # 協程 讓函數變成了生成器 至關於循環的暫停
        yield b
    return b
# 獲得生成器對象
v = fibo(10)
# 用生成器的方式打印出來
print(next(v))
# 使用for循環遍歷生成器
for x in v:
    print(x,end="\t")

  3.3 生成器 send()的用法 必須有一個參數

def test():
    i = 0
    while i < 5:
#賦值運算下次會被執行  yield會使程序停住
        temp = yield i
        print(temp)
        i += 1
g = test()
print("-----send----")
print(g.__next__())
print(next(g))
print(g.send("aaa"))
運行結果:
-----send---
0
None
1
aaa
2

 3.4 首次調用send()異常問題

  解決方案:

    1.首次調用使用__next__(),不使用send()

    2.或者首次使用send(None)

def test():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i += 1
g = test()
print("-----send----")
# 首次調用不傳參或者傳遞非None參數都會致使異常
print(g.send())
print(g.send("aaa"))
相關文章
相關標籤/搜索