Lyf凤

靡不有初,鲜克有终

扩大
缩小

生成器经典题

+++++++++++++++++++++++++++++++++++ 生成器经典题 ++++++++++++++++++++++++++++++

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))

 

posted on 2021-02-04 18:00  Lyf凤  阅读(83)  评论(0)    收藏  举报

导航

levels of contents