Python學習 生成器的學習1210

2022-07-03 15:42:12 字數 2838 閱讀 3850

在python中,這種一邊迴圈一邊計算的機制,稱為生成器:

結論: 生成器本質是乙個函式,不同於函式的是它生成的是乙個物件,不執行函式內的**

列表生成器:列表是直接生成數字在記憶體,可以隨時呼叫

元組顯示的型別是生成器,只儲存在記憶體中,但是只有在呼叫的時候生成

1. c = (x for x in range(10)), 利用 ()來生成

2.  利用yield()方法

利用()生成

c = (x for x in range(10))

# print(c.next) 在py2中的方法

print(c.__next__()) # 輸出0,__next__()是乙個私有方法,不建議用

print(next(c)) # 輸出1, 利用next內建函式迭代輸出,當輸出到最有乙個元素的時候,就不會輸出資料

for i in c: # for呼叫c裡面的next去迭代輸出,節約記憶體空間

print(i, end='\t') # 2 3 4 5 6 7 8 9 ,因為前面輸出了0,1,所以指標指向了下一位,所以從2開始

利用yield建立:如果乙個函式定義中包含yield關鍵字,那麼這個函式就不再是乙個普通函式,而是乙個generator

最難理解的就是generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

def fun():

print('ok')

yield 1 # 有yield關鍵字,代表fun()非函式,是乙個生成器

# 此時作為return 直接結束了函式

g = fun() # 此時的fun()是乙個生成器物件,而非函式

print(g) # a = next(g)

print('a', a) # 接收了傳遞回來的值1

# next(g) # ok, 當遇到yield1的時候,可以認為是return 1,結束了函式的執行,g釋放,所以後面的print在執行會報錯

print(next(g)) # print()裡面是乙個可迭代物件,yield 1返回乙個1被print捕捉到,所以 迭代輸出 ok 和 1

生成器的send()方法:使用之前必須先進入到生成器裡面,然後利用send()賦值給上次返回處

def fun():

print('ok1')

count = yield 1

print(count)

yield 2

b = fun()

b.send(none) # 等價於 next(b),開始進入到函式, 直到遇到了yield 1後返回到此處,執行後面的b.send('hello world')

tt = b.send('hello world') # 進入到退出的yield 1的位置,將'hello world'賦值給count進行列印,遇到yield 2後返回結果到此處

print(tt) # 將yield 2的結果賦給tt, 然後進行列印

還可通過yield實現在單執行緒的情況下實現併發運算的效果

import time

def consumer(name):

print("%s 準備吃包子啦!" %name)

while true:

baozi = yield

print("包子[%s]來了,被[%s]吃了!" %(baozi,name))

def producer(name):

c = consumer('a')

c2 = consumer('b')

c.__next__()

c2.__next__()

print("老子開始準備做包子啦!")

for i in range(10):

time.sleep(1)

print("做了2個包子!")

c.send(i)

c2.send(i)

producer("ftl1012")

利用生成器實現斐波那契

def fib(max):

n, b, a = 0, 0, 1

while n <= max:

# print(b, end='\t')

yield b # 等價於 print(b),將我們需要的結果先存放起來

b, a = a, b+a # 賦值是同時執行的

n += 1

gen = fib(6)

print(next(gen))

print(next(gen))

print(next(gen))

print(next(gen))

【學習參考】

【學習參考】

Python學習筆記 生成器

有時候乙個列表裡的元素過多,多到計算機記憶體存不下來,我們就需要想乙個辦法解決這個問題,如果能在需要的時候生成新元素就好了,可以用生成器。生成器 一種邊迴圈邊根據某種演算法計算生成元素的機制 如何建立乙個生成器呢,最簡單的方法通過修改一下列表生成器建立。n n for n in range 10 d...

Python生成器學習筆記

生成器在python中首先是乙個物件,用於建立python序列。使用生成器可以迭代龐大的序列,且不需要在記憶體中建立和儲存整個序列。通常,生成器是為迭代器產生資料的。典型的使用用例是range 函式。每次迭代生成器時,生成器會記住上一次呼叫的內容,並且返回下乙個值。生成器函式和普通函式類似,但是它的...

今日學習 python生成器

學習python的生成器 generator 生成器是返回1個迭代器的函式。總結 發現乙個方法,先抄寫一遍,再默寫1遍,2遍,3遍.每次默寫的過程中發現對各函式,語法的理解更深入了,3遍之後基本就能有條理的寫出 後續都按照這個方法學習。steps python git deep ai def my ...