码迷,mamicode.com
首页 > 其他好文 > 详细

推导式, 生成器表达式

时间:2018-08-13 18:01:34      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:[]   obj   for   加载   gen   names   访问   一个   数据   

推导式

列表推导式:

语法: [结果 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)

生成器表达式

生成器表达式: 和列表推导式语法基本一样, 只是把[]换成()
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 同理

推导式, 生成器表达式

标签:[]   obj   for   加载   gen   names   访问   一个   数据   

原文地址:https://www.cnblogs.com/kenD/p/9469591.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!