迴圈後面也可以跟判斷,這樣就可以進行簡單的資料過濾了# 列表推導式就是使用乙個簡單的方法建立乙個列表
# 列表裡元素的型別是根據for前面的資料型別而定的
a =[m for m in
range(31
(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列表
(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)]
(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]
(d)# [4, 5, 6]
e =[i[j]
[j]for j in
range
(len
(i))
(e)# [1, 5, 9]
f =[i[j][2
-j]for j in
range
(len
(i))
(f)# [7, 5, 3]
看下面的演示:
求100以內的偶數和,求100以內所有能被3整除的且個位為2的數,還有很多相同型別的,同樣可以使用這種方式得出:num3 =[1
,-1,
2,-2
,-10,
3,4]
([x for x in num3 if x >0]
)# [1, 2, 3, 4]
(雖然說這種也可以通過修改步長得出,但講還是要講一下的)
還可以對列表中的值進運算,就比如進行冪運算num1 =
[x for x in
range
(101
)if x %2==
0]# 這裡我就不去列印了
(sum
(num1)
)# 2550
([i for i in
range
(101
)if i %3==
0and i %
10==2]
)# [12, 42, 72]
求乙個數的所有因子,這個可以對判斷乙個數是否是完數有幫助,只需要把n+1換成n就好了,然後在求和進行比較([i **
2for i in
range(5
)])# [0, 1, 4, 9, 16]
(所謂完數就是該數恰好等於除自身外的因子之和。例如:6=1+2+3)
有列表推導式,那有元組、字典、集合推導式嗎?這是我們應該去想的n =
6print
([i for i in
range(1
,n+1
)if n % i ==0]
)# [1, 2, 3, 6]
那我們現在就來嘗試一下,無非就是換下包裝而已
用()包裹的其實就是乙個生成器表示式,在 python 中,使用了 yield 的函式被稱為生成器,跟普通函式不同的是,生成器是乙個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是乙個迭代器num =
(i for i in
range(5
(num)
# at 0x09aeee30>
(type
(num))#
# 顯然好像不是元組
# 這是乙個生成器物件
# 我們可以對他進行遍歷,也可以使用next()方法去呼叫它
# 但是這樣生成器只能使用一次,也不能說是使用一次吧,
# 就是當生成器裡的資料被迭代完時,裡面的資料就為空了
# 看下面的演示
for i in num :
(i)# 0
# 1# 2
# 3# 4
(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))#
當生成器表示式作為乙個單獨引數傳遞給函式時候的外面de()是可以省略的# 定義乙個返回前n個斐波那契數列生成器函式
deffeibo
(n):
a,b =0,
1for i in
range
(n):
a,b = b ,a+b
yield a
(feibo(10)
(list
(feibo(10)
))# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
使用乙個生成器表示式作為引數會比先建立乙個臨時列表更加高效
讓我們看下{}s1 =
sum(
(x for x in
range
(101))
)# 顯示的傳遞乙個生成器表示式物件
s2 =
sum(x for x in
range
(101))
# 更加優雅的實現方式,省略了括號
(s1)
# 5050
(s2)
# 5050
# min()、max()函式也是同理
person =[,
,,,]
(min
(p['age'
]for p in person)
)# 16
(min
(person,key=
lambda p:p[
'age'])
)#
感覺沒什麼用,就乙個對字典進行反轉還有那麼一點用a =
(a)#
(type
(a))
# student =
b =print
(b)#
(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 進行遍歷,其具有惰性求值的特點,進行一次遍歷後便不能再次方位內部元素,即訪問一次...