生成器表达式和各种推导式
1.生成器表达式
#生成器表达式(几乎不占内存) g=(i for i in range(10)) print(g) #<generator object <genexpr> at 0x0000019DFFFAC408> for i in g: print(i)
2.列表推导式
#列表推导式 ex_list=['第%s个'%(i+1) for i in range(5)] print(ex_list) #['第1个', '第2个', '第3个', '第4个', '第5个'] #相当于 ex_list=[] for i in range(5): ex_list.append("第%s个"%(i+1)) print(ex_list)
3.列表推导式和生成器表达式的区别
#列表推导式和生成器表达式的区别 ret1=(i*2 for i in range(5)) print(ret1) #此时拿到一个生成器,内存占用少 #<generator object <genexpr> at 0x0000019DFFFAC408> ret2=[i*2 for i in range(5)] print(ret2) #[0, 2, 4, 6, 8]
4.字典推导式
#将一个字典中key和value的值对调 dic1={"1":11,"2":12} dic1_reverse={dic1[k]:k for k in dic1} print(dic1_reverse) #11: '1', 12: '2'} #合并大小写对应的value值,,将k统一成小写 dic2={"a":10,"b":21,"A":20,"K":44} dic2_f={k.lower():dic2.get(k.lower(),0)+dic2.get(k.upper(),0) for k in dic2} print(dic2_f) #dic2.get('a',0) 获取a的值,如果没有就返回0(不写0就返回None) #{'a': 30, 'b': 21, 'k': 44}
5.集合推导式(自带去重)
#集合推导式 #计算列表中每一个值的平方(自带去重) squaredx={x**2 for x in [1,-1,2,-2,3,4,7]} print(squaredx) #{1, 4, 9, 16, 49}
6.没有元祖推导式
#没有元祖推导式,因为毕竟还是用小括号,但是可以前面加tuple,强制类型转换 retx=((i*2 for i in range(5) if i%2==0)) print(retx) #<generator object <genexpr> at 0x000001ADF3FCC5E8> #强制类型转换之后就是(0, 4, 8)
7.其他示例
#嵌套列表中有'e'的值(复杂,不建议用) names=[['google','facebook','youtube','amazon'],['baidu','alibaba','tencent','bilibili']] neme=[name for lst in names for name in lst if name.count('e')>=1] print(neme) #['google', 'facebook', 'youtube', 'tencent']
#python3可以用中文作为变量名 示例=(i for i in range(10)) print(g) #<generator object <genexpr> at 0x0000019DFFFAC408> for 元素 in 示例: print(元素,end="*") #0*1*2*3*4*5*6*7*8*9*
总结:
语法:
[每一个元素或者和元素相关的表达式操作 for 元素 in 可迭代类型] #遍历之后挨个处理
[满足条件的元素相关的操作 for 元素 in 可迭代数据类型if 元素相关的操作] #筛选功能
#一些笔记:
生成器和迭代器都是惰性运算(不找它拿值就不工作),生成器中的值取一次就没有了,但是可以有多个生成器
可迭代对象都有__iter__方法