python 生成式和生成器

2021-10-02 18:24:44 字數 2274 閱讀 8202

python的生成式(推導式)和等價的for迴圈完成的是相同的工作,不同的是生成式執行速度快,**更加整潔。

python的四個基礎資料結構(列表、集合、元組、字典)除了元組因為其資料特點沒有生成式,其餘三個都有,集合的生成式不太常見。

生成式這個名字就知道是生成列表的

我們也可以用for來生成列表

用for生成

list=[

]for x in

range(10

):list

print

(list

)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

用生成式

list

=[x for x in

range(10

)]print

(list

)#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

其實可以看到生成式和for迴圈的作用是一樣的,但明顯可以看到用生成式的**比用for迴圈的**量要小很多。

這只是乙個簡單的小例子,生成式還可以更複雜一點,可以加上判斷,也可以巢狀。

#用for迴圈

list=[

]for x in

range(1

,5):

for y in

range(1

,20):

if x*x == y:

list

"%d的平方:%d"

%(x,y)

)print

(list

)#['1的平方:1', '2的平方:4', '3的平方:9', '4的平方:16']

集合生成式不太常見,但道理也很簡單,套路都一樣

s =

print

(s)#

字典生成式與列表生成式沒有本質上的區別,就簡單的舉個例子。

#dict.items()

d1 =

d2 =

print

(d2)

##用for遍歷列表,將元組中的key,value作為dict的key,value

d1 =[(

'name'

,'nan'),

('age'

,'21'),

('gender'

,'male')]

d2 =

print

(d2)

#

生成式也可以巢狀,這個就不舉例了,留您慢慢探索了。

#生成式

for y in

[x for x in

range(10

)]:print

(y, end=

' ')

# 0 1 2 3 4 5 6 7 8 9

#生成器

for y in

(x for x in

range(10

)):print

(y, end=

' ')

# 0 1 2 3 4 5 6 7 8 9

#生成式

print

([x for x in

range(10

)])#生成器

print

(x for x in

range(10

))#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#at 0x00ac2e28>

從上述**可以看到生成式和生成器輸出是一樣的,那他們有什麼區別呢,我們可以看到生成式和生成器的返回有所不同,生成式返回的是列表內容,而生成器返回的是generator object,乙個生成器物件,還有這個物件的記憶體位址。

生成式直接返回表示式的結果列表,而生成式則返回乙個物件,該物件包含對計算結果的引用,可以迴圈輸出結果列表。正因為生成器不會一次性返回結果列表而是在用到是乙個乙個列出來,所以生成器比生成式更加節約空間。

def

fib(n)

: a, b =0,

1for _ in

range

(n):

a, b = b, a + b

yield a

defmain()

:for val in fib(10)

:print

(val,end=

' ')

#1 1 2 3 5 8 13 21 34 55

Python生成器和列表生成式

生成器 在python中,這種一邊迴圈一邊計算的機制,稱為生成器 generator 列表生成式 l list x x for x in range 10 生成器 g generator x x for x in range 10 呼叫該generator時,首先要生成乙個generator物件,然...

列表生成式和生成器生成式

列表生成式 也就是用一對中括號括起來將生成列表的語句放入括號內來生成乙個列表。例如我想建立乙個100個雞蛋的列表 在其中還可以加判斷條件 下面這個例題可以將列表生成式和正常的for迴圈語句建立列表進行鮮明的對比 for迴圈寫法 經過上面的對比我們發現,其優點就是語法簡潔。生成器生成式 生成器生成式的...

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

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