一,生成器表達式
#生成器表達式比列表解析更省內存,因為惰性運算
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 new_2 = (i*i for i in range(100)) #生成器表達式 5 print(list(new_2)) 6 #注意括號是小括號
對比
#!/usr/bin/env python #_*_coding:utf-8_*_ # egg_list=['雞蛋%s' %i for i in range(10)] 列表推倒式 # print(egg_list) # laomuji = ('雞蛋%s' %i for i in range(1,11)) 生成器表達式 # print(laomuji) # print(next(laomuji)) # print(next(laomuji))
小知識
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #小知識 5 def func(): 6 yield from 'ABC' #相當於下面的for i in 7 # for i in 'ABC': 8 # yield i 9 g = func() 10 print(next(g))
二,各種推導式
#推導式套路
# variable = [out_exp_res for out_exp in input_list if out_exp == 2]
# out_exp_res: 列表生成元素表達式,可以是有返回值的函數。
# for out_exp in input_list: 迭代input_list將out_exp傳入out_exp_res表達式中。
# if out_exp == 2: 根據條件過濾哪些值可以。
1.列表推導式
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #列表推導式 5 #普通版本 6 new_l = [] 7 for i in range(100): 8 new_l.append(i*i) 9 list(range(100)) 10 #進階版本 11 new_l = [i*i for i in range(100)] #列表推倒式 12 print(new_l) 13 14 print(len([ i+5 for i in range(100) if i % 3 == 0 ])) 15 #執行過程 for >> if >> i+5 >> append[i+5] 16 #詳解過程 17 # new_l = [] 18 # for i in range(100): 19 # if i % 3 == 0: 20 # new_l.append(i+5) 21 22 print(len([i//2 if i%2==0 else i for i in range(100) if i % 3 == 0 ])) #三元運算肯定要返回個值 23 #執行過程 for >> 后if >> 前if >> append[i//2] 24 #詳解過程 25 # for i in range(100): 26 # if i % 3 == 0: 27 # if i%2 == 0: 28 # new_l.append(i//2) 29 # else: 30 # new_l.append(i) 31 32 33 # 30以內的數字,所有能被3整除的整數 34 print([i for i in range(30) if i%3 == 0]) 35 # 30以內的數字,所有能被3整除的整數的平方 36 print([i*i for i in range(30) if i%3 == 0]) 37 # 找到嵌套列表中名字含有2個'e'的所有名字 38 # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], 39 # ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] 40 # print([name for lst in names for name in lst if name.count('e') >=2]) 從前往后看 41 # 執行過程 42 # 第一個for >> 第二個for >> if >> append[name]
2.字典推導式
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #字典推導式 5 # 將一個字典的key和value對調 6 mcase = {'a': 10, 'b': 34} 7 for i in mcase: 8 print(i) 9 #[i for i in mcase] #列表推導式 10 print({key:key+'1' for key in mcase}) #更改k 11 print({key:mcase[key] for key in mcase}) #取values 12 print({mcase[key]:key for key in mcase}) #kv 對調 13 14 #合並大小寫對應的value值,將k統一成小寫 15 mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} 16 mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase} 17 print(mcase_frequency) 18 # 執行過程 19 # for k in mcase >> k.lower() : values >> mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) >> {} 20 # mcase.get# (k.lower(), 0) get 到了就返回值,get不到就返回0
3.集合推導式
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #集合推導式,自帶去重功能 5 l = [-1,1,2,1] 6 print({i for i in l}) 7 print({i*i for i in l})
小結:練習題
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #練習題 5 # 例1: 過濾掉長度小於3的字符串列表,並將剩下的轉換成大寫字母 6 str_l = ['a','ab','abc','abcd','abcde'] 7 print([i.upper() for i in str_l if len(i) > 3]) 8 # 例2: 求(x,y)其中x是0-5之間的偶數,y是0-5之間的奇數組成的元祖列表 9 print([(x,y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]) 10 # 例3: 求M中3,6,9組成的列表M = [[1,2,3],[4,5,6],[7,8,9]] 11 M = [[1,2,3],[4,5,6],[7,8,9]] 12 print([i[2] for i in M])