python開發函數進階:生成器表達式&各種推導式


一,生成器表達式

#生成器表達式比列表解析更省內存,因為惰性運算

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])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM