推导式, 生成器表达式

推导式

列表推导式:

语法: [结果 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 同理
posted on 2018-08-13 17:22  KD_131  阅读(190)  评论(0编辑  收藏  举报