@
xyxc0673 整理如下,看理解对吗?
#总结:推导式有,列表推导式、字典推导式、集合推导式,没有元组推导式
#生成器表达式:(结果 for 变量 in 可迭代对象 if 条件) 生成器表达式可直接获取其对象,对象可直接使用 for 循环,生成器具有惰性机制
def add(a, b):
return a + b
def test():
for r_i in range(4):
yield r_i
g = test()
#0 1 2 3
# g = (add(2, i) for i in g)
#g 的值是
# (
# add(2, 0),
# add(2, 1),
# add(2, 2),
# add(2, 3)
# )
# g = (add(10, i) for i in g)
#g 的值是
# (
# add(10, add(2, 0)),
# add(10, add(2, 1)),
# add(10, add(2, 2)),
# add(10, add(2, 3))
# )
#遍历生成器开始运算输出结果
# print(list(g))
#输出[12, 13, 14, 15]
for n in [2, 10]:
# g = [add(n, i) for i in g] #列表生成式会一次性进行所有的运算
# 第一次循环 n=2,i 第一次循环 0 相加结果 2 3 4 5
# 第二次循环 n=10,i 第一次循环 2 相加结果 12 13 14 15
g = (add(n, i) for i in g) # 生成器表达式只有在被遍历时才会进行运算
#第一次循环 n=2,i 从 0 1 2 3 循环,因生成器具有惰性机制,n 并没有取对应值,只是指向对应内存地址,g 的值是
# (
# add(n, 0),
# add(n, 1),
# add(n, 2),
# add(n, 3)
# )
#第二次循环 n=10,i 从 add(2, 0) add(2, 1) add(2, 2) add(2, 3)循环,同理,g 的值是
# (
# add(n, add(n, 0)),
# add(n, add(n, 1)),
# add(n, add(n, 2)),
# add(n, add(n, 3))
# )
#for 循环完,系统会释放 n,释放之前 n 先取值,g 的值是
# (
# add(10, add(10, 0)),
# add(10, add(10, 1)),
# add(10, add(10, 2)),
# add(10, add(10, 3))
# )
#遍历生成器开始运算输出结果
print(list(g))
#输出[20, 21, 22, 23]