当前位置:
首页 > temp > 简明python教程 >
-
python基础(14):生成器、列表推导式(3)
") >= 2:
result.append(name)
print(result)
# 推导式
gen = (name for first in names for name in first if name.count("e") >= 2)
for name in gen:
print(name)
⽣成器表达式和列表推导式的区别:
1. 列表推导式比较耗内存,⼀次性加载,⽣成器表达式⼏乎不占⽤内存,使⽤的时候才分配和使⽤内存。2. 得到的值不⼀样,列表推导式得到的是⼀个列表,⽣成器表达式获取的是⼀个⽣成器。
举个栗⼦。
同样⼀篮⼦鸡蛋,列表推导式: 直接拿到⼀篮⼦鸡蛋。⽣成器表达式: 拿到⼀个老⺟鸡,需要鸡蛋就给你下鸡蛋。
⽣成器的惰性机制: ⽣成器只有在访问的时候才取值,说⽩了,你找他要他才给你值,不找他要,他是不会执⾏的。
- def func():
- print(111)
- yield 222
- g = func() # ⽣成器g
- g1 = (i for i in g) # ⽣成器g1. 但是g1的数据来源于g
- g2 = (i for i in g1) # ⽣成器g2. 来源g1
- print(list(g)) # 获取g中的数据. 这时func()才会被执⾏. 打印111.获取到222. g完毕.
- print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1 也就没有数据了
- print(list(g2)) # 和g1同理
深坑==> ⽣成器,要值得时候才拿值。
字典推导式:
根据名字应该也能猜到,推到出来的是字典。
- # 把字典中的key和value互换
- dic = {'a': 1, 'b': '2'}
- new_dic = {dic[key]: key for key in dic}
- print(new_dic)
- # 在以下list中. 从lst1中获取的数据和lst2中相对应的位置的数据组成⼀个新字典
- lst1 = ['jay', 'jj', 'sylar']
- lst2 = ['周杰伦', '林俊杰', '邱彦涛']
- dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
- print(dic)
集合推导式:
集合推导式可以帮我们直接⽣成⼀个集合。集合的特点: ⽆序,不重复,所以集合推导式⾃带去重功能。
- lst = [1, -1, 8, -8, 12]
- # 绝对值去重
- s = {abs(i) for i in lst}
- print(s)
总结: 推导式有,列表推导式,字典推导式,集合推导式,没有元组推导式。