python之生成器

2022-04-20 09:33:23 字數 2482 閱讀 4870

1. 生成器

本質就是迭代器.

乙個乙個的建立物件

建立生成器的方式:

1. 生成器函式

2. 通過生成器表示式來獲取生成器

3. 型別轉換(看不到)

2. 生成器函式 

生成器函式中包含 yield , 返回資料和return差不多.

return會立即結束這個函式的執行

yield 可以分段的執行乙個函式

生成器函式在執行的時候返回生成器. 而不是直接執行此函式

能向下執行的兩個條件:

__next__(), 執行到下乙個yield

def

func():

print('

今天是12.11

', end='')

yield

'today

'print('

昨天是12.10

', end='')

yield

'yesterday

'print('

明天是12.13

', end='')

yield

'tomorrow

'ret =func()

print(ret) #

print(ret.__next__()) #

今天是12.11 today

print(ret.__next__()) #

昨天是12.10 yesterday

print(ret.__next__()) #

明天是12.13 tomorrow

def

func():

print('

今天是12.11

', end='')

a = yield

'today

'print('

a',a, end='')

print('

昨天是12.10

', end='')

b = yield

'yesterday

'print('

b', b, end='')

print('

明天是12.13

', end='')

c = yield

'tomorrow

'print('

c', c, end='')

gen =func()

print(gen.__next__()) #

第乙個位置用send()沒有意義 今天是12.11 today

print(gen.send('

1')) #

給上乙個yield傳 值 a 1 昨天是12.10 yesterday

print(gen.send('

2')) #

b 2 明天是12.13 tomorrow

所有的生成器都是迭代器都可以直接使用for迴圈, 都可以使用list()函式來獲取到生成器內所有的資料

lst =

for i in range(1, 13):

'今天是第%s天

' %i)

print(lst) #

['今天是第1天', '今天是第2天', '今天是第3天', '今天是第4天', '今天是第5天', '今天是第6天', '今天是第7天', '今天是第8天', '今天是第9天', '今天是第10天', '今天是第11天', '今天是第12天']

lst = ['

今天是第%s天

' % i for i in range(1, 13)]

print(lst) #

['今天是第1天', '今天是第2天', '今天是第3天', '今天是第4天', '今天是第5天', '今天是第6天', '今天是第7天', '今天是第8天', '今天是第9天', '今天是第10天', '今天是第11天', '今天是第12天']

gen = func() # 建立生成器. 此時執行會把生成器函式中的**記錄在記憶體

當執行到__next__(), 執行此空間中的**, 執行到yield結束.

優點: 節省記憶體, 生成器本身就是**. 幾乎不占用記憶體

特點: 惰性機制, 只能向前. 不能反覆

3. 各種推導式 (詭異)

列表推導式 [結果 for迴圈 if]

#

生成列表,內容是1-100之間所有偶數的平方

lst = [i**2 for i in range(1, 101) if i % 2 ==0]

print(lst)

字典推導式

#

練習:

dic =

dic =

print(dic)

集合推導式

lst = [1, -1, 8, -8, 12]

#絕對值去重

s =

print(s) #

python之生成器

使用生成器表示式取代列表解析可以同時節省cpu 和 記憶體 ram 如果你構造乙個列表的目的僅僅是傳遞給別的函式,比如 傳遞給tuple 或者set 用生成器表示式替代吧 def ord map a string for c in a string yield ord c gen ord map u...

python之生成器

先來介紹下迭代器 迭代器即迭代取值的工具 迭代 的意思就是重複的基於上一次的結果取值 迭代器可以不依賴索引取值 取值 取乙個值就會少乙個,取完了,還取值就會報錯 1.什麼是生成器 在函式內但凡出現yield關鍵字,在呼叫函式就不會執行函式內 會返回乙個迭代器物件的值,該值稱之為生成器 強調 生成器的...

Python之生成器

通過列表生成式,我們可以產生列表,但是列表容量肯定有限,如果建立乙個很大的列表元素,要占用大量的記憶體空間,如果我們只要列表前面的元素,則後面的儲存空間大大浪費,這時候我們需要引出python生成器,這樣就必要建立完整的列表,從而大大節省空間,我們稱之為 generator.建立生成器方法一 使用 ...