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