生成器和Python的三個推導式

2022-02-26 10:05:34 字數 2725 閱讀 2355

一、生成器

我們知道的迭代器有兩種:一種是呼叫方法直接返回的,一種是可迭代物件通過執行iter方法得到的,迭代器有的好處就是節省記憶體

如果某些情況下,我們需要節省記憶體,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。總而言之生成器就是我們自己寫的迭代器。

python中提供的生成器:

1.生成器函式:常見函式定義,但是使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式狀態,以便下次從離開的地方繼續執行。個人理解就是有乙個記憶功能,會記住這次執行結束的狀態,然後下次執行的時候從這裡繼續,每次都是以此往復。

2.生成器表示式:類似於列表推導,但是生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表。

生成器generator

本質:迭代器(所以自帶了__iter__和__next__方法)

特點:惰性運算、開發者自定義

二、生成器函式

乙個包含yield關鍵字的函式就是乙個生成器函式。yield可以為我們從函式中返回值,但是yield又不同於return,return的執行意味著程式的結束,呼叫生成器函式不會返回具體的值,而是得到乙個可迭代物件。每一次獲得這個可迭代物件的值,就能推動函式的執行,獲取新的返回值。直到函式結束。

import

time

defgenrator_fun1():

a = 1

print('

現在定義了a變數')

yield

a b = 2

print('

現在又定義了b變數')

yield

bg1 =genrator_fun1()

print('

g1 :

',g1) #

列印g1可以發現g1就是乙個生成器

print('

-'*20) #

我是華麗的分割線

print

(next(g1))

time.sleep(1) #

sleep一秒看清執行過程

print(next(g1))

生成器有什麼作用麼?

省記憶體

三、send

def

generator():

print(123)

content = yield 1

print('

*****==

',content)

print(456)

yield2

g =generator()

ret = g.__next__

()print('

***'

,ret)

ret = g.send('

hello

') #

send的效果和next一樣

print('

***'

,ret)

#send 獲取下乙個值的效果和next基本一致##

使用send的注意事項

#第一次使用生成器的時候 是用next獲取下乙個值

#最後乙個yield不能接受外部的值

四、python的三大推導式

1.列表推導式和生成器表示式

l = [i for i in range(10)]

print

(l)l1 = ['

選項%s

'%i for i in range(10)]

print(l1)

1.把列表推導式的換成()就得到了生成器表示式(generator)

2.列表推導式與生成器表示式都是一種便利的程式設計方式,只不過生成器表示式更節省記憶體

3.python不但使用迭代器協議,讓for迴圈變得更加通用。大部分內建函式,也是使用迭代器協議訪問物件的。例如,sum函式是python的內建函式,該函式使用迭代器協議訪問物件,而生成器實現了迭代器協議,所以我們可以直接這樣計算一系列值的和:

sum(x ** 2 for x in range(4))

2.字典推導式

字典推導和列表推導的使用方法十分類似,只不過把改成了{}。上**:

dic_old = 

dic_new = # 變key和value的位置

print

(dic_new)

#執行結果

#

3.集合推導式

集合推導式有十分類似,唯一的區別就是集合使用{},上**:

set_test= 

print

(set_test)

#執行結果##

好像有問題哦,怎麼6個元素求冪之後丟了兩個,往下看↓

#請不要忘記集合是無序的並且會自動去重哦

生成器,生成器推導式和列表推導式

python社群,大部分生成器和迭代器是一種 生成器的本質是迭代器 唯一區別 生成器是我們自己用python 構建的資料結構 迭代器都是提供的,或者轉化得來的 生成器函式 生成器表示式 python提供的 yield 乙個next 對應乙個yield yield和下乙個yield中間有 的話只執行乙...

python生成器推導式

1.生成器推導式是繼列表推導式後的有一中python推導式,他比列表推導式速度更快,占用的記憶體也更少。2.使用生成器物件時,可以根據需要將他轉化為列表或者元組,也可以是喲個生成器對像 next 方法或內建函式next 進行遍歷,其具有惰性求值的特點,進行一次遍歷後便不能再次方位內部元素,即訪問一次...

python 生成器 推導式 遞迴

目錄3 遞迴 判斷乙個函式是否是生成器函式 只需看函式內部是否有yield 生成器函式 內部是否包含yield def func print f1 yield 1 print f2 yield 2 print f3 yield 100 print f4 只要有yield 函式內部 不會執行,返回乙個...