生成器的面试题

请运行一下代码说出结果

def demo():
    for i in range(4):
        yield i

g=demo()

g1=(i for i in g)
g2=(i for i in g1)

print(list(g1))
print(list(g2))
def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)

print(list(g))

题目解答

def demo():
    for i in range(4):
        yield i

g=demo()

g1=(i for i in g)
print(g1)
# 拆解
# g1获取到的是一个生成器
# 当使用强转数据类型的时候,才开始调用生成器
g2=(i for i in g1)
# 因为g1 已经被取值了一次,根据生成器得值只能取一次,相当于g1 已经执行到最后了,,当g2再去取值得时候,会从g1最后开始接着读,问题时g1后面已经没值了,所以获取的时空列表
g3 =(i for i in list(g1)) print(list(g1)) print(list(g2))

 

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test() # 产生一个生成器
for n in [1,10]:
    g=(add(n,i) for i in g)
# 当 n = 1 时:
#g=(add(n,i) for i in g)
# 当n=10时:
#g=(add(n,i) for i in g)
#继续拆解
# 当n=10时:g等于n=1的时候的g
#g=(add(n,i) for i in (add(n,i) for i in g))
#g=(add(n,i) for i in (add(n,i) for i in test()))
#g=(add(n,i) for i in (add(n,i) for i in [0,1,2,3]))
#因为已经到n=10所以n赋值为10
#g=(add(10,i) for i in (add(10,i) for i in [0,1,2,3]))
#g=(add(10,i) for i in [10,11,12,13])
#g=([20,21,22,23])
print(list(g))

进阶练习

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i
g=test() # 产生一个生成器
for n in [1,10,5]:
    g=(add(n,i) for i in g)

print(list(g))

解答

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test() # 产生一个生成器
for n in [1,10,5]:
    g=(add(n,i) for i in g)

#当n=1时
#g=(add(n,i) for i in g)
#当n=10时
#g=(add(n,i) for i in (add(n,i) for i in g))
#当n=5时
#g=(add(n,i) for i in (add(n,i) for i in (add(n,i) for i in g)))

print(list(g))
#因为进行强转,所以开始调用生成器g
#g=(add(5,i) for i in (add(5,i) for i in (add(5,i) for i in test())))
#g=(add(5,i) for i in (add(5,i) for i in (add(5,i) for i in [0,1,2,3])))
#g=(add(5,i) for i in (add(5,i) for i in [5,6,7,8]))
#g=(add(5,i) for i in [10,11,12,13])
#g=([15,16,17,18])

 

posted on 2019-02-14 22:29  Jerry-Wang  阅读(198)  评论(0)    收藏  举报