Python 協程(1)

迭代器

可迭代-直接作用於for循環的變量
迭代器不但可以作用於for循環,還可以被next調用
例如range就是一個迭代器,是否是一個迭代器可以用isinstance判斷

案例1

from collections import Iterable
from collections import Iterator
l1=[1,2,3,4]
print(isinstance(l1,Iterable))
print(isinstance(l1,Iterator))

Iter函數

案例2

from collections import Iterable
from collections import Iterator
s='I love TianjinBinhai'
print(isinstance(s,Iterable))
print(isinstance(s,Iterator))
s_iter=iter(s)
print(isinstance(s_iter,Iterable))
print(isinstance(s_iter,Iterator))

生成器

generator:一邊循環一邊計算下一個元素的機制和算法
三個條件:1-每次調用都生產出for循環需要的下一個元素2-如果達到最後一個,報出StopIterration異常3-可以被next函數調用

#直接使用生成器
案例3

L=[x*x for x in range(5)] #放在中括號中的是列表生成器
g=(x*x for x in range(5)) #放在小括號中的就是生成器
print(type(L))
print(type(g))

#如果函數中包含yield,則這個函數叫做生成器,函數調用遇到yield返回
案例4

#生成器案例
#在函數odd中,yield負責返回
def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield 1
    print('step 3')
    yield 1
one=next(odd())
print(one)

for循環調用生成器

案例5

#斐波那契數列生成器
def fib(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n=n+1
        #需要注意,報出異常的返回值使return的返回值
    return 'done'
g=fib(5)
for i in range(6):
    rst=next(g)
    print(rst)

協程

定義:協程是爲非搶佔式多任務產生子程序的計算機程序組件,協程允許不同入口點在不同位置暫停或開始執行程序
技術:協程就是一個你可以暫停執行的函數

協程在運行過程中有四個狀態:

GEN_CREATE:等待開始執行
GEN_RUNNING:解釋器正在執行,這個狀態一般看不到
GEN_SUSPENDED:在yield表達式處暫停
GEN_CLOSED:執行結束

協程終止

協程中未處理的異常會向上冒泡,傳給next函數或者send方法的調用方(即觸發協程的而對象)
終止協程的一種方式:發送某個哨符值。內置的None和Ellipsis等常量經常用作哨符值==。

委派生成器

解釋:

  1. 委派生成器在 yield from 表達式處暫停時,調用方可以直接把數據發給子生成器。
  2. 子生成器再把產出的值發給調用方。
  3. 子生成器返回之後,解釋器會拋出 StopIteration 異常,並把返回值附加到異常對象上,此時委派生成器會恢復。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章