武道之路-煉體期六重天(年已過,恢複更新),之路六重
產生器:調用的時候才產生的資料(惰性計算,協程:保留上次進入的狀態,每次程式進入,相當於調用上一次的狀態,非同步),單線程下的並發效果(不同角色間切換)。
(3.x)range(),列表產生式 [i*i for i in range(20)],
檔案讀取:
for line in f: (這裡f是檔案控制代碼)
print(line)
記住重要的方法:__next__(計算下一個狀態值),send(value)(把值傳給產生器的yeild)
例如(斐波那契數列):
def seq(num):
#計算幾位斐波那契數列
count,x,y=0,0,1
while count<num:
yield y #想把什麼放入產生器
x,y=y,x+y
count=count+1
return 'end'
g=seq(10)
g.__next__()->1
g.__next__()->1
g.__next__()->2
...
超過num數字會拋出異常
捕獲異常:
try:
#程式段
except StopIteration(異常類型,這裡表示沒有更多值了):
print('error')
break
單線程下的並發效果(非同步):
import time
def employee(name):
print('%s 已經準備工作'%name)
while True:
work=yield
print('%s 員工已經完成老闆下發的%s份工作 '%(name,work))
def boss(name):
wang=employee('小王')
zhang=employee('小張')
wang.__next__() #相當於把函數變成產生器 停在yield(執行到這裡)
zhang.__next__()
print('%s 準備去接單了'%name)
for i in range(10):
print('已經接到 %d 份單子'%i)
wang.send(i)#把值傳給yield
zhang.send(i)
time.sleep(1)#隔一秒
boss('大哥')#調用,boss 接單,員工完成工作同時進行!(不熟悉的自己設斷點調試過程)
迭代器(Iterator):可被__next__調用並不斷返回下一個值的對象,直到拋出異常。產生器(generator),range(), f(檔案控制代碼),[i*5 for i in range(10)],for迴圈(底層)
可迭代對象(Iterable):可直接作於for迴圈的對象,list tuple,dict,set,str(可通過Iter()轉成迭代器), 帶yield的function,generator
from collections inport Iterable(Iterator) 先引入
isinstance(對象,Iterable(Iterator)) 判斷是否是可迭代對象(迭代器)
一些內建函數:
abs() 求絕對值
bool()判斷真假
all()檢測可迭代對象裡的元素的值有假即是假
any()檢測可迭代對象裡的元素的值有真即是真
bin()轉二進位-》b'.....'
bytearray('值',encoding='編碼'),二進位可變數組,bytes不可變
callable() 是否可調用,函數,類---》()
chr 返回ASCII值對應的字元,ord 與之相反