一,生成器表达式
#生成器表达式比列表解析更省内存,因为惰性运算
1 #!/usr/bin/env python2 #_*_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}) #更改k11 print({key:mcase[key] for key in mcase}) #取values12 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 python2 #_*_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])