+++++++++++++++++++++++++++++++++++ 生成器经典题 ++++++++++++++++++++++++++++++
def add(a, b): # 相加
return a + b
def test(): # 生成器函数 0 1 2 3
for i in range(4):
yield i
g = test() # 创建生成器
# 惰性机制
# 只能向前. 不能反复
# 节省内存
# 生成器记录的是代码
for n in [2, 10]:
g = (add(n, i) for i in g)
print(list(g)) # [20, 21, 22, 23]
------------------------------ 题解思路 ---------------
# 解题思路:惰性机制(#有人要值才执行);生成器记录的是代码(#只有在执行的时候才会带入变量的值)
# 1,拆分for循环
n = 2
g = (add(n, i) for i in g) # 这里没有人跟外部的 g=生成器表达式要值,整个生成器表达式只是内存中的一堆代码,所以内部的for循环也只是一堆代码一个摆设,也就没有人跟内部的 g=test()生成器函数要值
n = 10
g = (add(n, i) for i in g)
# 2,将g = test()代入,并层层带入
n = 2
g = (add(n, i) for i in test())
n = 10
g = (add(n, i) for i in (add(n, i) for i in test()))
# 3,拿值的时候带入变量的值去执行
print(list(g)) # 拿值list==>for==>__next__
# 此时的
g = (add(n, i) for i in (add(n, i) for i in test()))
# 代入变量的值
# n = 10
# test()的取值范围是[0,1,2,3]
# 所以
# list(g) == [(add(10, i) for i in (add(10, i) for i in [0,1,2,3]))]==10*2+[0,1,2,3]
# == [(add(10, i) for i in [10,11,12,13]]
# == [20,21,22,23]
# 小结规律:
# test()的取值范围是初始范围 [0,1,2,3]
# 要拿值时候的n的值是要带入的值 n=10
# for循环决定循环的次数,循环几次就累加几次,也就是要加几个n的值 for n in [2, 10]:pass
+++++++++++++++++++++++++++++++++++ 改变1 ++++++++++++++++++++++++++++++
# 改变1
def add(a, b): # 相加
return a + b
def test(): # 生成器函数 0 1 2 3
for i in range(4):
yield i
g = test() # 创建生成器
for n in [2, 10]:
g = (add(n, i) for i in g)
n = 5
print(list(g))
-------------------------------------
# 解题思路同上,最终拿到
# g = (add(n, i) for i in (add(n, i) for i in test()))
# 而此时n=5,带入得到 5*2+[0,1,2,3]=[10,11,12,13]
+++++++++++++++++++++++++++++++++++ 改变2 ++++++++++++++++++++++++++++++
# 改变2
def add(a, b): # 相加
return a + b
def test(): # 生成器函数 0 1 2 3
for i in range(4):
yield i
g = test() # 创建生成器
for n in [2, 10, 5]:
g = (add(n, i) for i in g)
print(list(g))
------------------------------------------
# 解题思路同上,最终拿到
n = 2
g = (add(n, i) for i in g)
n = 10
g = (add(n, i) for i in g)
n = 5
g = (add(n, i) for i in g)
# 层层代入得到:
n = 2
g = (add(n, i) for i in test())
n = 10
g = (add(n, i) for i in (add(n, i) for i in test()))
n = 5
g = (add(n, i) for i in (add(n, i) for i in (add(n, i) for i in test())))
# 代入数据得到:
# list(g) = (add(5, i) for i in (add(5, i) for i in (add(5, i) for i in [0,1,2,3])))=5*3+[0,1,2,3]=[15,16,17,18]
+++++++++++++++++++++++++++++++++++ 改变3 ++++++++++++++++++++++++++++++
# 改变3===>自行改变
def add(a, b): # 相加
return a + b
def test(): # 生成器函数 0 1 2 3
for i in range(4):
yield i
g = test() # 创建生成器
# # 惰性机制
# # 只能向前. 不能反复
# # 节省内存
# # 生成器记录的是代码
for n in [2, 10]:
g1 = (add(n, i) for i in g)
print(list(g1))
-------------------------------------------
# 解题思路
# 1,拆分for循环
n = 2
g1 = (add(n, i) for i in g)
n = 10
g1 = (add(n, i) for i in g)
# 2,将g = test()代入,并层层带入
n = 2
g = (add(n, i) for i in test())
n = 10
g = (add(n, i) for i in test())
# 3,拿值的时候带入变量的值去执行
print(list(g)) # 拿值list==>for==>__next__
# 此时的
g = (add(n, i) for i in (add(n, i) for i in test()))
# 代入变量的值
# n = 10
# test()的取值范围是[0,1,2,3]
# 所以
# list(g) == [(add(10, i) for i in [0,1,2,3]]==10+[0,1,2,3]==[10,11,12,13]
+++++++++++++++++++++++++++++++++++ 改变4 ++++++++++++++++++++++++++++++
# 变体4 ==> 将g变成列表生成式
def add(a, b): # 相加
return a + b
def test(): # 生成器函数 0 1 2 3
for i in range(4):
yield i
g = test() # 创建生成器
# 惰性机制
# 只能向前. 不能反复
# 节省内存
# 生成器记录的是代码
for n in [2, 10, 5]:
g = [add(n, i) for i in g]
--------------------------------------
# 题解思路:
# n = 2
# g = [add(n, i) for i in test()] # ==2 + [0,1,2,3] == [2,3,4,5]
#
# n = 10
# g = [add(n, i) for i in g] # == 10 + [2,3,4,5] == [12,13,14,15]
# n = 5
# g = [add(n, i) for i in g] # == 5 + [12,13,14,15] == [17,18,19,20]
# 投机的计算方法: == 2+10+5+[0,1,2,3] == [17,18,19,20]
print(list(g))