1. 程式人生 > >python-高級特性

python-高級特性

png pytho process gen screen 內存 tle nac 個數


*********生成器*************


在Python中,這種一邊循環一邊計算的機制,稱為生成器(Generator),節省大量的空間。

列表生成式,當生成時元素即打印,會占用內存。

一、讀取生成器元素的兩種方式:

*l.next()
*for循環讀取;(生成器是可叠代對象);
列表生成式,當生成時元素即打印,會占用內存;

In [5]: l = [i for i in range(1,11)]

In [6]: print l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

技術分享圖片


In [7]: h = (i for i in range(1,11)) #將[] 改為()可創建生成器

*)生成器是可叠代對象

In [11]: from collections import Iterable #導入模塊

In [12]: lh = (i**2 for i in range(3))

In [13]: isinstance(lh,Iterable) #判斷
Out[13]: True


技術分享圖片

*for循環讀取

技術分享圖片

練習:生成著名的斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都
可由前兩個數相加得到

1, 1, 2, 3, 5, 8, 13, 21, 34, ...


技術分享圖片


技術分享圖片

二、*)yield關鍵字

a.如果函數裏面有yield關鍵字,那麽調用這個函數的結果賦給的變量為生成器
b.當生成器g調用第一個next方法時,會運行函數

,直到遇到第一個yield停止
c.當調用第二個next方法時,會從停止的地方繼續執行,知道遇到下一個yield


技術分享圖片


*)next方法與yield關鍵字的關系


技術分享圖片


技術分享圖片

In [18]: print lh.next() #第一個next,遇到第一個yirld結束,打印1
first
1

In [19]: print lh.next() #第二個next,遇到第二個yirld結束,打印2
second
2

In [20]: print lh.next() #第三個next,遇到第三個yirld結束,打印3
third
3

三、*)生成器的send方法

a.使用send方法給生成器函數發送數據
b.使用send方法前,必須先調用一次next()

方法
c.遇到下一個yield停止


*)消費者-生產者模型


技術分享圖片

技術分享圖片


技術分享圖片



*)生成器實戰應用:迷你聊天機器人


技術分享圖片


技術分享圖片



python-高級特性