python中的生成器yield

生成器yield使用yield語句 可以讓函數生成一個結果序列而不僅僅是一個值

def  countdow(n):
     print("Start!");
     while n>0:
          yield n;
          n -= 1;
c = countdow(5);
print(c.__next__()) 
print(c.__next__())


輸出結果:

Start!

5
4

__next__()方法使生成器函數一直運行到下一條yield語句爲止,此時__next__()方法將返回值傳遞給了yield並且函數暫時中止執行 再次調用__next__()時 函數繼續執行 此過程持續到生成器函數返回結束爲止

通常不會手動調用__next__()方法  而是使用循環

for i in  countdow(5):
 print(i);


輸出結果:
5
4
3
2
1

生成器是基於處理管道、流或數據流編寫程序的一種強大的方式;
如:

def tail(f):  
 for line in f:  
  if not line : #如果 非真 則暫時休眠並且再次嘗試
   time.sleep(0.1);
   continue;
  yield line; # 將獲取到的文件中的值 生成一個序列的值
filecount = tail(open('E:/work.txt'));

#grep方法 用於在上面方法生成器中查找特定的子字符串  
def grep(lines,searchtext):
 for line in lines:
  if searchtext in line :
   yield  line;
lines  = grep(filecount,'tom');  #查找帶有tom 的子字符串
for line in lines: 
 print(line);


輸出結果:
'tom',120,132

總結:

生成器的作用:當程序運行到yield時 將運行的值 傳遞給了yield  程序不會輸出 可認爲在此時程序處於暫停的狀態    當使用__next__()方法的時候 函數繼續執行 直至再次遇到yield  

優點:yield存儲的並不是單一的值,而是保存當前的程序執行狀態 不用一次計算所有的元素 而是用一次算一次 節省內存空間

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章