Python得yield關鍵字,yield是python中的生成器
瞭解生成器須要先了解什麼是生成式,切片的目的是從已有的列表中切出一部分返回,而生成式的目的則是從無到有的構建一個列表
一個生成式的案例
假如構建一個含有10個元素的列表,能夠怎麼作?
這裏可使用python的一個內置函數range來生產一些數字,而後利用循環填充到一個列表中
python
list = [] for i in range(1,11): list.append(i) print(list)
那麼使用生成式應該怎麼實現呢?
數據結構
list = [x for x in range(1,11)] print(list)
生成式還能夠像for同樣支持嵌套,支持多級嵌套
因爲生成式只能採用[]這種方式,因此只能生產list類型的數據結構,因此生成式,一般狀況下咱們稱之爲:列表生成式
同時也能夠用來生成集合,只要把[]替換成{}
一個實例
app
l = {x for x in range(1,11)}
print(l)
固然能夠寫成
函數
print({x for x in range(1,11)})
python語句越簡潔越好,這就是python所追求的簡潔
生成器是什麼?
生成器是這樣一個函數,記住上一次返回時在函數體重的位置,對生成器函數的第二次調用跳轉至該函數中間
上次調用的全部局部變量都不變
yield生成器
生成器就是迭代器,生成器就是一種迭代器,生成器擁有next方法而且行爲與迭代器徹底相同,所以
生成器也能夠用於python的for循環當中
yield指令,能夠暫停一個函數並返回中間結果,使用該指令的函數保存執行環境,而且在必要時回覆,
生成器比迭代器更增強大也更加複雜
在python當中,當你定義了一個函數,使用了yield關鍵字時,這個函數就是一個生成器
函數返回的是一個對象,不是日常函數所用的return語句那樣獲得的是結果值。
生成器對象支持幾個方法next(),send(),throw()
怎樣理解?
一個實例:
code
def get(): yield 0 yield 1 yield 2 get() 調用這個函數獲得的結果是<function get 0x00B2CB70>
說明這確實是一個函數類型,
對象
g=get()
第一次調用生成器的next方法時,生成器纔開始執行生成器函數
知道遇到yield暫時中止執行,而且yield的參數將做爲這次next方法的返回值
get
next(g) 0 以後每一次調用生成器的next方法,生成器將從上次暫停執行的位置恢復執行 生成器函數,直到咱一次遇到yield時暫停,一樣的yield的參數將做爲next犯方法的返回值 next(g) 1
def fib(): a,b=0,1 while True: yield b a,b=b,a+b for num in fib(): if num>100: break print(num)
那麼send()方法呢。
send是恢復生成器的方法,yield能夠有一個值,而這個值是在生成器的send方法被調用從而恢復執行的,調用send方法的參數
io
def repeater(): n=0 while True: n=yield n r=repeater() next(r) r.send(10)
調用send傳入非None值前,生成器必須處於掛起狀態,不然會拋出異常
不過,未啓動的生成器仍可使用None做爲參數調用send
print list,type(list)
如何生成斐波那契數列?
清單1.簡單輸出斐波那契數列的前N個數
for循環
def fab(max): n,a,b=0,0,1 L=[] while n<max: L.append(b) a=b b=a+b n=n+1 return L for n in fab(5): print n
初學python不久,綜合整理的文章,若有不足或者錯誤,歡迎你們指責。
function