迭代器
可迭代-直接作用於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等常量經常用作哨符值==。
委派生成器
解釋:
- 委派生成器在 yield from 表達式處暫停時,調用方可以直接把數據發給子生成器。
- 子生成器再把產出的值發給調用方。
- 子生成器返回之後,解釋器會拋出 StopIteration 異常,並把返回值附加到異常對象上,此時委派生成器會恢復。