生成器表达式和各种推导式

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__方法
posted @ 2019-06-09 18:28  玉石非玉  阅读(141)  评论(0编辑  收藏  举报