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

生成器习题1

时间:2018-01-03 16:02:51      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:asc   二次   out   sed   display   lis   没有   def   charm   

预热

li = [x * x for x in range(10)]
print(li)

li = (x * x for x in range(10))
print(li)
print(list(li))

输出结果:

技术分享图片
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x0000021F541CBC50>
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
output

写出下面的代码的执行结果

def add(s, x):
    return s + x


def gen():
    for i in range(4):
        yield i


base = gen()
for n in [1, 10]:
    base = (add(i, n) for i in base)

print(list(base))

输出结果

技术分享图片
[20, 21, 22, 23]
output

分析:

技术分享图片
base = gen()
这句是将生成器赋值给变量base

for n in [1, 10]:
这句是两次循环,第一次循环n=1,第二次循环n=10


base = (add(i, n) for i in base)
这句是生成器表达式,也是此处括号里面的base在第一次循环时候是上面定义的变量base,第二次循环的时候是第一次循环后的结果base
可拆分为:base = (add(i, 10) for i in (add(i, 10) for i in gen()))

因为在print(list(base))执行之前,整个过程只是定义生成器并没有执行,循环结束后n=10,然后打印的时候执行了(add(i, 10) for i in (add(i, 10) for i in gen()))
具体过程可根据pycharm里面的Debug功能查看......
View Code

 

生成器习题1

标签:asc   二次   out   sed   display   lis   没有   def   charm   

原文地址:https://www.cnblogs.com/0bug/p/8183629.html

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