推导式
列表推导式:
语法: [结果 for循环 条件]
lst = ["python"+str(i) for i in range(1,16)] #for i in range(10), 取到的i是int,所以要转成str print(lst)
对列表中的数据进行筛选
lst = [i for i in range(1,10) if i % 2 == 0] print(lst) #[2, 4, 6, 8]
字典推导式
把原字典里的k,v 互换一下 dic = {"jj":"林俊杰","jay":"周杰伦","zs":"赵四"} dic1 = {v:k for k,v in dic.items()} print(dic1)
生成器表达式
tu = (i for i in range(10)) # 没有元组推导式. 生成器表达式 print(tu) # 生成器 print(tu.__next__()) # 取值 print(tu.__next__()) print(tu.__next__()) print(tu.__next__()) print(tu.__next__()) print(tu.__next__()) print(tu.__next__()) print(tu.__next__()) print(tu.__next__()) print(tu.__next__())
生成器表达式: 和列表推导式语法基本一样, 只是把[]换成()
gen = (i for i in range(10)) #生成器 print(gen) #<generator object <genexpr> at 0x01392660>
结果是一个生成器.可以使用for循环来遍历这个生成器
gen = (i for i in range(10)) #生成器 for i in gen: print(i) # 0-9
生成器也可以进行筛选
gen = (i for i in range(1,100) if i % 3 == 0) for num in gen: print(num)
寻找名字中带有两个e的的名字
常规的for 循环 names = [["Tom", "Jefferson", "Wesley", "Steven", "Joe"],["Alice", "Ana", "Wendy", "Jennifer", "Eva"]] lst2 =[] for lst in names: for name in lst: if name.count("e") == 2: lst2.append(name) print(lst2)
#['Jefferson', 'Wesley', 'Steven', 'Jennifer']
推导式
gen = (name for lst in names for name in lst if name.count("e")==2)
for name in gen: #在生成器中循环
print(name)
生成器表达式 和列表推导式的区别
1. 列表推导式比较耗内存,一次性加载. 生成器表达式几乎不占用内存,用的时候才分配
2. 得到的值不一样. 列表推导式得到的是一个列表, 生成器表达式得到的是一个生成器
3. 生成器的惰性机制:生成器只有在访问的时候才取值.
def func(): print(111) yield 222 g = func() #生成器 g1 = (i for i in g) #生成器 g2 = (i for i in g1)#生成器 print(list(g)) #获取g中的数据. 这时func()才会被执行. 打印111.获取到222. g完毕. 因为list中有__next__()方法所以可取到g里的值. print(list(g1)) #获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1 也就没有数据 print(list(g2)) #和g1 同理