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

 

posted @ 2017-08-05 22:26  liqianlong  阅读(1453)  评论(0编辑  收藏  举报