python生成式生成器詳細解答

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

相關文章
相關標籤/搜索