Python 列表推導式 生成器表示式

2021-10-14 16:35:53 字數 3998 閱讀 2964

# 列表推導式就是使用乙個簡單的方法建立乙個列表

# 列表裡元素的型別是根據for前面的資料型別而定的

a =[m for m in

range(31

)]print

(a)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

b =[a[m:m +3]

for m in

range(0

,31,3

)]# 這裡的a就是上面定義的a列表

print

(b)# [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29], [30]]

c =[

(a, b)

for a in

range(0

,2)for b in

range(3

,5)]

print

(c)# [(0, 3), (0, 4), (1, 3), (1, 4)]

i =[[1

,4,7

],[2

,5,8

],[3

,6,9

]]d =[row[1]

for row in i]

print

(d)# [4, 5, 6]

e =[i[j]

[j]for j in

range

(len

(i))

]print

(e)# [1, 5, 9]

f =[i[j][2

-j]for j in

range

(len

(i))

]print

(f)# [7, 5, 3]

迴圈後面也可以跟判斷,這樣就可以進行簡單的資料過濾了

看下面的演示:

num3 =[1

,-1,

2,-2

,-10,

3,4]

print

([x for x in num3 if x >0]

)# [1, 2, 3, 4]

求100以內的偶數和,求100以內所有能被3整除的且個位為2的數,還有很多相同型別的,同樣可以使用這種方式得出:

(雖然說這種也可以通過修改步長得出,但講還是要講一下的)

num1 =

[x for x in

range

(101

)if x %2==

0]# 這裡我就不去列印了

print

(sum

(num1)

)# 2550

print

([i for i in

range

(101

)if i %3==

0and i %

10==2]

)# [12, 42, 72]

還可以對列表中的值進運算,就比如進行冪運算

print

([i **

2for i in

range(5

)])# [0, 1, 4, 9, 16]

求乙個數的所有因子,這個可以對判斷乙個數是否是完數有幫助,只需要把n+1換成n就好了,然後在求和進行比較

(所謂完數就是該數恰好等於除自身外的因子之和。例如:6=1+2+3)

n =

6print

([i for i in

range(1

,n+1

)if n % i ==0]

)# [1, 2, 3, 6]

有列表推導式,那有元組、字典、集合推導式嗎?這是我們應該去想的

那我們現在就來嘗試一下,無非就是換下包裝而已

num =

(i for i in

range(5

))print

(num)

# at 0x09aeee30>

print

(type

(num))#

# 顯然好像不是元組

# 這是乙個生成器物件

# 我們可以對他進行遍歷,也可以使用next()方法去呼叫它

# 但是這樣生成器只能使用一次,也不能說是使用一次吧,

# 就是當生成器裡的資料被迭代完時,裡面的資料就為空了

# 看下面的演示

for i in num :

print

(i)# 0

# 1# 2

# 3# 4

print

(list

(num))#

# print(next(num))# 0

# print(next(num))# 1

# print(next(num))# 2

# print(next(num))# 3

# print(next(num))# 4

# print(list(num))#

用()包裹的其實就是乙個生成器表示式,在 python 中,使用了 yield 的函式被稱為生成器,跟普通函式不同的是,生成器是乙個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是乙個迭代器

# 定義乙個返回前n個斐波那契數列生成器函式

deffeibo

(n):

a,b =0,

1for i in

range

(n):

a,b = b ,a+b

yield a

print

(feibo(10)

)# print

(list

(feibo(10)

))# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

當生成器表示式作為乙個單獨引數傳遞給函式時候的外面de()是可以省略的

使用乙個生成器表示式作為引數會比先建立乙個臨時列表更加高效

s1 =

sum(

(x for x in

range

(101))

)# 顯示的傳遞乙個生成器表示式物件

s2 =

sum(x for x in

range

(101))

# 更加優雅的實現方式,省略了括號

print

(s1)

# 5050

print

(s2)

# 5050

# min()、max()函式也是同理

person =[,

,,,]

print

(min

(p['age'

]for p in person)

)# 16

print

(min

(person,key=

lambda p:p[

'age'])

)#

讓我們看下{}
a =

print

(a)#

print

(type

(a))

# student =

b =print

(b)#

print

(type

(b))

#

感覺沒什麼用,就乙個對字典進行反轉還有那麼一點用

需要重點掌握的還是列表推導式和生成器表示式

啦啦啦

又到了叫大家點讚的時候了

也可以一鍵三連o

qaq

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

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

生成器及列表推導式

迭代器 內部含有 iter next 方法的物件 可迭代物件不能取值,因為內部沒有 next 的方法 迭代器的優點 1 節省記憶體 2 惰性機制 3 單向 不可逆 如何判斷可迭代物件 迭代器 1 iter in dir obj 2 引用乙個模組 from collections import ite...

python生成器推導式

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