生成器的调用和定义
def add(a, b): # 普通求和函数
return a + b
def test(): # 生成器函数
for r in range(4):
yield r
g = test()
for n in [2,10]:
#生成器的定义出 # 仅仅是定义了2次生成器
g=(add(n,i) for i in g)
# 生成器的调用
print(list(g))
生成器的定义
for n in [2, 10]:
# 循环内只是定义了两次生成器, 并不会去执行他
# 等待调用的时候再去执行
# 调用的时候执行, 会去寻找变量n
# n已经被for循环到最后一个, n==10
# 第一次循环不会调用g, 只是定义了一个g生成器
# 第二次循环才会调用g
# 等调用g的时候, n已经循环两次=10
# 第一次调用g, g里面是0, 1, 2, 3(test函数产生)
# 第二次调用g, g里面是10+0, 10+1, 10+2, 10+3, 10+4
g = (add(n, i) for i in g)
print(list(g))
生成器的调用
'''
第二次循环才会调用g
g=(add(n,i) for i in g)
首先调用第一个g创建第二个g
第一次调用g
第一个g: 0, 1, 2, 3 (test产生)
吧元素传入add,
n为10(循环最后的结果)
传入第二个g的元素是:(n+g)
10+0, 10+1, 10+2, 10+3
此时g的取值范围是(10~13)
第二次调用g:
首先调用上一个g生成器(10~13)
然后add(n=10, g=(10~13))
此时g的取值范围是(20~23)
list强转g, 把g的元素取出
[20, 21, 22, 23]
'''