生成器的面试题
请运行一下代码说出结果
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])
浙公网安备 33010602011771号