列表推导式
列表推导式,生成器表达式以及其他推导式,首先我们先看一下这样的代码,给出一个列表,通过循环,想列表中添加1~10:
li = []
for i in range(10):
li.append(i)
print(li)
列表推导式的常⽤语法:
[结果 for 变量 in 可迭代对象]
ls = [i for i in range(10)]
print(ls)
列表推导式是通过⼀行来构建你要的列表, 列表推导式看起来代码简单. 但是出现错误之后很难排查.
lst = ['python%s' % i for i in range(1,19)]
print(lst)
筛选模式
语法:
[结果 for 变量 in 可迭代对象 if 条件]
lst = [i for i in range(100) if i %2 == 0]
print(lst)
生成器推导式
生成器表达式和列表推导式的语法基本上一样的,只是把[]换成()
gen = (i for i in range(10))
print(gen)
# 结果: <generator object <genexpr> at 0x0000026046CAEBF8>
打印的结果就是一个生成器,我们可以使用for循环来循环这个生成器
gen = ("第%s次" % i for i in range(10))
for i in gen:
print(i)
生成器表达式也可以进行筛选
# 获取1-100内能被3整除的数
gen = (i for i in range(1,100) if i % 3 == 0)
for num in gen:
print(num)
# 100以内能被3整除的数的平⽅
gen = (i * i for i in range(100) if i % 3 == 0)
for num in gen:
print(num)
# 寻找名字中带有两个e的人的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# 不用推导式和表达式
result = []
for first in names:
for name in first:
if name.count("e") >= 2:
result.append(name)
print(result)
# 推导式
gen = (name for first in names for name in first if name.count('e') >= 2)
for i in gen:
print(i)
可以把生成器里面的值通过某些方法变成一个容器
li = []
gen = (i for i in range(1, 100) if i % 3 == 0)
for num in gen:
# print(num)
li.append(num)
print(li)
生成器表达式和列表推导式的区别:
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
# list的底层有for循环,for就是一直执行__next__() 所以可以将生成器放到list中
print(list(g)) # 获取g中的数据. 这时func()才会被执行. 打印111.获取到222. g完毕.
print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1 也就没有数据了
print(list(g2)) # 和g1同理理
print(next(g))
print(next(g1))
print(next(g2)) # 可以用next来验证 其实list就是将内容迭代了转换成了列表
每次对生成器调用 next()
时,它会从上次离开位置恢复执行(它会记住上次执行语句时的所有数据值)。
字典推导式
根据名字应该也能猜到,推到出来的是字典
lst1 = ['jay','jj','meet']
lst2 = ['周杰伦','林俊杰','郭宝元']
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
升级版:
{key:value for key value in d.iterms()}
集合推导式
集合推导式可以帮我们直接生成一个集合,集合的特点;无序,不重复 所以集合推导式自带去重功能
lst = [1,2,3,-1,-3,-7,9]
s = {abs(i) for i in lst}
print(s)
总结:
推导式有, 列表推导式, 字典推导式, 集合推导式, 没有元组推导式
生成器表达式: (结果 for 变量 in 可迭代对象 if 条件筛选)
生成器表达式可以直接获取到⽣成器对象. ⽣成器对象可以直接进行for循环. ⽣成器具有惰性机制.
集合推导式和字典推导式很是类似,记住一个小技巧能够快速区分那个是字典那个是集合
字典推导式前面的结果是有个冒号,而集合的前面结果就是单纯的结果