1. 推導式
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# ### 推導式 : 通過一行循環判斷遍歷出一些列數據的方法叫做推導式 """ 語法: val for val in iterable """ # 1.推導式基本語法 lst = [] for i in range ( 1 , 51 ): lst.append(i) print (lst) # 改寫推導式 lst = [ i for i in range ( 1 , 51 ) ] print (lst) # 小練習 # 1.[1,2,3,4,5] => [2,4,6,8,10] lst = [ i * 2 for i in range ( 1 , 6 ) ] print (lst) # 2.帶有判斷條件的推導式 """注意點:for后面緊跟的判斷條件只能是單項分支.""" """[1,2,3,4,5,6,7,8,9,10] => [1,3,5,7,9 ... ]""" lst = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] lst_new = [] for i in lst: if i % 2 = = 1 : lst_new.append(i) print (lst_new) # 改寫推導式 lst = [ i for i in lst if i % 2 = = 1 ] print (lst) # 3.多循環推導式 # 誰???♠誰 lst1 = [ "孫杰龍" , "陳露" , "曹靜怡" ] lst2 = [ "王志國" , "鄧鵬" , "合理" ] lst_new = [] for i in lst1: for j in lst2: lst_new.append(i + "???♠" + j) print (lst_new) # 改寫推導式 lst = [ i + "???♠" + j for i in lst1 for j in lst2 ] print (lst) # 4.帶有判斷條件的多循環推導式 lst_new = [] for i in lst1: for j in lst2: if lst1.index(i) = = lst2.index(j): lst_new.append(i + "???♠" + j) print (lst_new) # 改寫推導式 lst = [i + "???♠" + j for i in lst1 for j in lst2 if lst1.index(i) = = lst2.index(j)] print (lst) |
2. 推導式練習
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
# ### 推導式練習題 # (1).{'x': 'A', 'y': 'B', 'z': 'C' } 把字典寫成x=A,y=B,z=C的列表推導式 dic = { 'x' : 'A' , 'y' : 'B' , 'z' : 'C' } lst = [] for k,v in dic.items(): res = k + "=" + v lst.append(res) print (lst) # 推導式 lst = [ k + "=" + v for k,v in dic.items() ] print (lst) # (2).把列表中所有字符變成小寫 ["ADDD","dddDD","DDaa","sss"] lst = [ "ADDD" , "dddDD" , "DDaa" , "sss" ] lst_new = [] for i in lst: lst_new.append(i.lower()) print (lst_new) # 推導式 lst = [ i.lower() for i in lst ] print (lst) # (3).x是0-5之間的偶數,y是0-5之間的奇數 把x,y組成一起變成元組,放到列表當中 # 方法一 lst = [] for x in range ( 6 ): for y in range ( 6 ): if x % 2 = = 0 and y % 2 = = 1 : lst.append( (x,y) ) print (lst) # 推導式 lst = [ (x,y) for x in range ( 6 ) for y in range ( 6 ) if x % 2 = = 0 and y % 2 = = 1 ] print (lst) # 方法二 lst = [] for x in range ( 6 ): if x % 2 = = 0 : for y in range ( 6 ): if y % 2 = = 1 : lst.append( (x,y) ) print (lst) # 推導式 lst = [ (x,y) for x in range ( 6 ) if x % 2 = = 0 for y in range ( 6 ) if y % 2 = = 1 ] print (lst) # (4).使用列表推導式 制作所有99乘法表中的運算 for i in range ( 1 , 10 ): for j in range ( 1 ,i + 1 ): print ( "{:d}*{:d}={:2d} " . format (i,j,i * j) , end = "") print () lst = [ "{:d}*{:d}={:2d} " . format (i,j,i * j) for i in range ( 1 , 10 ) for j in range ( 1 ,i + 1 )] print (lst) # (5)求M,N中矩陣和元素的乘積 # M = [ [1,2,3], # [4,5,6], # [7,8,9] ] # N = [ [2,2,2], # [3,3,3], # [4,4,4] ] M = [ [ 1 , 2 , 3 ] ,[ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] N = [ [ 2 , 2 , 2 ] ,[ 3 , 3 , 3 ] , [ 4 , 4 , 4 ] ] """ M[0][0] * N[0][0] = 2 M[0][1] * N[0][1] = 4 M[0][2] * N[0][2] = 6 M[1][0] * N[1][0] = 12 M[1][1] * N[1][1] = 15 M[1][2] * N[1][2] = 18 M[2][0] * N[2][0] = 12 M[2][1] * N[2][1] = 15 M[2][2] * N[2][2] = 18 """ # =>實現效果1 [2, 4, 6, 12, 15, 18, 28, 32, 36] """雙層循環,外層循環動的慢,內層循環動的快,正好符號M N 矩陣的下標""" lst = [] for i in range ( 3 ): for j in range ( 3 ): lst.append( M[i][j] * N[i][j] ) print (lst) # =>實現效果2 [ [2, 4, 6], [12, 15, 18], [28, 32, 36] ] # 遍歷出三個空的列表 lst = [ [] for i in range ( 3 )] print (lst) lst = [ [ M[i][j] * N[i][j] for j in range ( 3 ) ] for i in range ( 3 )] print (lst) """ [ M[i][j] * N[i][j] for j in range(3) ] [ [2, 4, 6] [12, 15, 18] [28, 32, 36] ] """ |
3. 集合_字典推導式
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# ### 集合推導式 """ 案例: 滿足年齡在18到21,存款大于等于5000 小于等于5500的人, 開卡格式為:尊貴VIP卡老x(姓氏),否則開卡格式為:摳腳大漢卡老x(姓氏) 把開卡的種類統計出來 """ lst = [ { "name" : "趙沈陽" , "age" : 18 , "money" : 3000 }, { "name" : "趙萬里" , "age" : 19 , "money" : 5200 }, { "name" : "趙蜂擁" , "age" : 20 , "money" : 100000 }, { "name" : "趙世超" , "age" : 21 , "money" : 1000 }, { "name" : "王志國" , "age" : 18 , "money" : 5500 }, { "name" : "王永飛" , "age" : 99 , "money" : 5500 } ] setvar = set () for i in lst: print (i) # {'name': '趙沈陽', 'age': 18, 'money': 3000} if 18 < = i[ "age" ] < = 21 and 5000 < = i[ "money" ] < = 5500 : res = "尊貴VIP卡老{}" . format (i[ "name" ][ 0 ]) else : res = "摳腳大漢卡老{}" . format (i[ "name" ][ 0 ]) # 添加到集合中 setvar.add(res) print (setvar) # { 三元運算符 + 推導式 } # 三運運算符 + 推導式 setvar = { "尊貴VIP卡老{}" . format (i[ "name" ][ 0 ]) if 18 < = i[ "age" ] < = 21 and 5000 < = i[ "money" ] < = 5500 else "摳腳大漢卡老{}" . format (i[ "name" ][ 0 ]) for i in lst } print (setvar) # ### 字典推導式 ### 一.enumerate """ enumerate(iterable,[start=0]) 功能:枚舉 ; 將索引號和iterable中的值,一個一個拿出來配對組成元組,通過迭代器返回 參數: iterable: 可迭代性數據 (常用:迭代器,容器類型數據,可迭代對象range) start: 可以選擇開始的索引號(默認從0開始索引) 返回值:迭代器 """ # 基本語法 from collections import Iterator,Iterable lst = [ "王文" , "呂洞賓" , "何仙姑" , "鐵拐李" , "張國老" , "曹國舅" , "藍采和" , "韓湘子" ] it = enumerate (lst) it = enumerate (lst,start = 100 ) print ( isinstance (it,Iterator)) # next print ( next (it) ) # for + next (推薦,數據較大時使用) for i in range ( 3 ): print ( next (it)) # for for i in it: print (i) # list 強轉迭代器 print ( list (it)) # (1) 字典推導式 配合 enumerate 來實現 dic = {k:v for k,v in enumerate (lst,start = 100 )} print (dic) """ (100, '王文') (101, '呂洞賓') (102, '何仙姑') (103, '鐵拐李') (104, '張國老') (105, '曹國舅') (106, '藍采和') (107, '韓湘子') """ # (2) 使用dict強轉迭代器,瞬間得到字典 dic = dict ( enumerate (lst,start = 100 ) ) print (dic) ### 二.zip """ 特點:按照索引配對 zip(iterable, ... ...) 功能: 將多個iterable中的值,一個一個拿出來配對組成元組,通過迭代器返回 iterable: 可迭代性數據 (常用:迭代器,容器類型數據,可迭代對象range) 返回: 迭代器 """ # 基本語法 # lst1 = ["孫開啟","王永飛","于朝志"] # lst2 = ["薛宇健","韓瑞曉","上朝氣"] # lst3 = ["劉文博","歷史園","張光旭"] # 在索引下標同時存在時,才會進行配對,否則舍棄. lst1 = [ "孫開啟" , "王永飛" , "于朝志" ] lst2 = [ "薛宇健" , "韓瑞曉" ] lst3 = [ "劉文博" ] it = zip (lst1,lst2,lst3) print ( list (it)) # (1) 字典推導式 配合 zip 來實現 lst_key = [ "ww" , "axd" , "yyt" ] lst_val = [ "王維" , "安曉東" , "楊元濤" ] # ('ww', '王維'), ('axd', '安曉東'), ('yyt', '楊元濤') dic = {k:v for k,v in zip (lst_key , lst_val) } print (dic) # (2) 使用dict強轉迭代器,瞬間得到字典 dic = dict ( zip (lst_key , lst_val) ) print (dic) |
4. 生成器
4.1 生成器表達式
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
|
# ### 生成器 """ #生成器本質是迭代器,允許自定義邏輯的迭代器 #迭代器和生成器區別: 迭代器本身是系統內置的.重寫不了. 而生成器是用戶自定義的,可以重寫迭代邏輯 #生成器可以用兩種方式創建: (1)生成器表達式 (里面是推導式,外面用圓括號) (2)生成器函數 (用def定義,里面含有yield) """ # (1) 生成器表達式 (里面是推導式,外面用圓括號) gen = ( i for i in range ( 10 ) ) print (gen) # 判斷類型 from collections import Iterator,Iterable print ( isinstance (gen,Iterator)) # 1.next 調用生成器 print ( next (gen)) print ( next (gen)) # 2.for + next 調用生成器 for i in range ( 3 ): print ( next (gen)) # 3.for 調用生成器所有數據 for i in gen: print (i) # 4.list強轉生成器,瞬間得到所有數據 gen = ( i for i in range ( 10 ) ) print ( list (gen)) # print(next(gen)) error # StopIteration |
4.2 生成器函數
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
# ### 生成器函數 """ # yield 類似于 return 共同點在于:執行到這句話都會把值返回出去 不同點在于:yield每次返回時,會記住上次離開時執行的位置 , 下次在調用生成器 , 會從上次執行的位置往下走 而return直接終止函數,每次重頭調用. yield 6 和 yield(6) 2種寫法都可以 yield 6 更像 return 6 的寫法 推薦使用 """ # (1) 基本語法 def mygen(): print ( "111" ) yield 1 print ( "222" ) yield 2 print ( "333" ) yield 3 # 初始化生成器函數 => 返回生成器對象 => 簡稱生成器 gen = mygen() # 第一次調用 res = next (gen) print (res) # 第二次調用 res = next (gen) print (res) # 第三次調用 res = next (gen) print (res) # 第四次調用 """ StopIteration error res = next(gen) print(res) """ """ # 第一次調用 print("111") yield 1 保存當前第13行代碼的狀態,把1返回,并且等待下一次調用 # 第二次調用 從上一次保存的位置13行往下走, print("222") yield 2 保存當前第16行代碼的狀態,把2返回,并且等待下一次調用 # 第三次調用 從上一次保存的位置16行往下走, print("333") yield 3 保存當前第19行代碼的狀態,把3返回,并且等待下一次調用 # 第四次調用 因為沒有更多的yield 返回數據,所有停止迭代.出現報錯異常. """ # (2) 優化生成器代碼 """生成器應用的場景是在大數據的范圍中使用,切記不可直接用for遍歷所有,可能無法短時間內獲取所有數據""" def mygen(): for i in range ( 1 , 101 ): yield i # 初始化生成器函數 => 生成器 gen = mygen() print ( "<=====>" ) for i in range ( 30 ): num = next (gen) print ( "我的球衣號碼是{}" . format (num)) print ( "<=====>" ) for i in range ( 40 ): num = next (gen) print ( "我的球衣號碼是{}" . format (num)) # (3) send的使用方式 (給上一個yield發送數據) """ # next和send區別: next 只能取值 send 不但能取值,還能發送值 # send注意點: 第一個 send 不能給 yield 傳值 默認只能寫None 最后一個yield 接受不到send的發送值 """ def mygen(): print ( "start" ) res = yield "內部1" print (res, "<==內部==>" ) res = yield "內部2" print (res, "<==內部==>" ) res = yield "內部3" print (res, "<==內部==>" ) print ( "end" ) # 初始化生成器函數 => 生成器 gen = mygen() # 第一次調用生成器 """ 第一次調用生成器時,因為沒有遇到yield保存的代碼位置, 無法發送數據,默認第一次只能發送None """ res = gen.send( None ) print (res, "<==外部==>" ) # 第二次調用生成器 res = gen.send( "100" ) print (res, "<==外部==>" ) # 第三次調用生成器 res = gen.send( "200" ) print (res, "<==外部==>" ) # 第四次調用生成器 """ error res = gen.send("300") print(res,"<==外部==>") """ """ 使用send調用生成器,第一次發送時必須是None,因為還沒有遇到yield保存的代碼位置 res = gen.send(None) 走到mygen生成器函數中 print("start") res = yield "內部1" 執行第80行 ,保存退出,記錄當前代碼位置,將 "內部1" 返回 在98行接受數據 res = "內部1" print(內部1,"<==外部==>") 第二次調用生成器 res = gen.send("100") 把100這個數據發送給上一次代碼保存的位置80行進行接受. => 導致 80行 res = 100 打印81行 print(100 ,"<==內部==>") 執行83行 res = yield "內部2" 保存退出,記錄當前代碼位置,將 "內部2" 返回 執行102行 res = gen.send("100") => "內部2" print("內部2","<==外部==>") .... 依次類推 ... 到第四次調用時, 因為沒有更多的yield 返回數據,gen.send(300)無法接受到返回值,所以出現停止迭代 StopIteration的報錯,程序終止; """ # (4) yield from 的使用 """將一個可迭代對象變成一個迭代器返回 """ def mygen(): lst = [ "張磊" , "李亞峰" , "劉一峰" , "王同培" ] yield from lst # 初始化生成器函數 gen = mygen() print ( next (gen)) print ( next (gen)) print ( next (gen)) print ( next (gen)) # print(next(gen)) # StopIteration # (5) 斐波那契數列 """使用生成器分段獲取所有內容,而不是一股腦的把所有數據全部打印""" """1 1 2 3 5 8 13 21 34 .... """ def mygen(maxval): a,b = 0 , 1 i = 0 while i < maxval: # print(b) yield b a,b = b,a + b i + = 1 # mygen(10) gen = mygen( 10 ) # 第一次獲取 for i in range ( 3 ): print ( next (gen)) # 第二次獲取 for i in range ( 5 ): print ( next (gen)) |
5. 小練習
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# 1.用推導式寫如下程序 # (1)構建如下列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] lst = [i * 2 for i in range(10)] lst = [i for i in range(0,19,2) ] print(lst) # (2)lst = ['alex', 'WuSir', '老男孩', '神秘男孩'] 將lst構建如下列表:['alex0', 'WuSir1', '老男孩2', '神秘男孩3'] lst = ['alex', 'WuSir', '老男孩', '神秘男孩'] # 方法一 # lst = [i + str(lst.index(i)) for i in lst] # 方法二 lst = [lst[i] + str(i) for i in range(len(lst)) ] print(lst) # (3)構建如下列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)] lst = [ (j,i) for j in range(0,6) for i in range(1,7) if i-j == 1] print(lst) lst = [(i,i+1) for i in range(6)] print(lst) # (4)求出50以內能被3整除的數的平方,并放入到一個列表中。 lst = [i ** 2 for i in range(51) if i % 3 == 0] print(lst) # (5)M = [[1,2,3],[4,5,6],[7,8,9]], 把M中3,6,9組成新列表 M = [[1,2,3],[4,5,6],[7,8,9]] lst = [ i[-1] for i in M ] print(lst) # (6)構建如下列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期'] lst = [ "python{}期".format(i) for i in range(1,11) if i != 5 ] print(lst) # (7)過濾掉長度小于3的字符串列表 , 并轉換成大寫字母 lst = ["sdfsdfsdfsdf","234","你說的符號是","a","ab"] lst = [ i.upper() for i in lst if len(i) >=3 ] print(lst) # (8)除了大小王,里面有52項,每一項是一個元組,請返回如下撲克牌列表[('紅心','2'),('草花','J'), …('黑桃','A')] lst1 = ["紅心","草花","黑桃","方片"] lst2 = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"] lst = [(i,j) for i in lst1 for j in lst2] print(lst) # 2.用推導式寫如下程序 lst1 = { 'name':'alex', 'Values':[ {'timestamp': 1517991992.94,'values':100,}, {'timestamp': 1517992000.94,'values': 200,}, {'timestamp': 1517992014.94,'values': 300,}, {'timestamp': 1517992744.94,'values': 350}, {'timestamp': 1517992800.94,'values': 280} ] } # 將lst1 轉化成如下 lst2: lst2 = [ [1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280] ] # 方法一 lst2 = [ [i["timestamp"] , i["values"]] for i in lst1["Values"] ] print(lst2) # 方法二 lst2 = [ list(i.values()) for i in lst1["Values"]] print(lst2) # 3.讀取一個文件所有內容,通過生成器調用一次獲取一行數據. def mygen(filename): with open(filename,mode="r+",encoding="utf-8") as fp: for i in fp: yield i gen = mygen("ceshi111.txt") for i in range(3): print(next(gen)) for i in range(6): print(next(gen)) # 4.將普通求和函數改寫成yield寫法 print("<====>") def add(a,b): yield a + b mygen = add(34,5) for i in mygen: print(i) |
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!
原文鏈接:https://blog.csdn.net/weixin_46818279/article/details/121091719