预热
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]
写出下面的代码的执行结果
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]
分析:
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功能查看......