生成器面试题
生成器相关的面试题
生成器在编程中发生了很多的作用,善用生成器可以帮助我们解决很多复杂的问题
除此之外,生成器也是面试题中的重点,在完成一些功能之外,人们也想出了很多魔性的面试题。
接下来我们就来看一看~
1.
1 def demo():
2 for i in range(4):
3 yield i
4
5 g=demo()
6
7 g1=(i for i in g)
8 g2=(i for i in g1)
9
10 print(list(g1))
11 print(list(g2))
12
13
14 #[0,1,2,3]
15 #[]
解析:由题可得g、g1、g2都是生成器,生成器的特点是具有惰性运算,即在不调用的情况下是不进行任何操作的。
在print(list(g1))时,其实时将g1生成器强制转换数据类型,相当于是list在调用g1,因此g1开始进行取值操作。
g1向g索取结果,最终将结果传递个g1,g1再传递给列表,返回[0,1,2,3]
我们知道生成器只能被调用一次,因此当g2被调用,此时的g1已经被调用过了,故传递给g2的值为空,返回[]
2.
1 def add(n,i):
2 return n+i
3
4 def test():
5 for i in range(4):
6 yield i
7
8 g=test()
9 for n in [1,10]:
10 g=(add(n,i) for i in g)
11
12 print(list(g))
1 #n = 1 2 #g=(add(n,i) for i in g) 3 4 #n = 10 5 #g=(add(n,i) for i in g) 6 7 ##以上代码没有执行 8 9 #执行 10 #g=(add(10,i) for i in add(10,i) for i in g)) ---> 11 #g=(add(10,i) for i in add(10,i) for i in text())) ---> 12 #g =(add(10,i) for i in [10,11,12,13]) ---> 13 #g = 20,21,22,23
3.
1 import os
2
3 def init(func):
4 def wrapper(*args,**kwargs):
5 g=func(*args,**kwargs)
6 next(g)
7 return g
8 return wrapper
9
10 @init
11 def list_files(target):
12 while 1:
13 dir_to_search=yield
14 for top_dir,dir,files in os.walk(dir_to_search):
15 for file in files:
16 target.send(os.path.join(top_dir,file))
17 @init
18 def opener(target):
19 while 1:
20 file=yield
21 fn=open(file)
22 target.send((file,fn))
23 @init
24 def cat(target):
25 while 1:
26 file,fn=yield
27 for line in fn:
28 target.send((file,line))
29
30 @init
31 def grep(pattern,target):
32 while 1:
33 file,line=yield
34 if pattern in line:
35 target.send(file)
36 @init
37 def printer():
38 while 1:
39 file=yield
40 if file:
41 print(file)
42
43 g=list_files(opener(cat(grep('python',printer()))))
44
45 g.send('/test1')
46
47 协程应用:grep -rl /dir

浙公网安备 33010602011771号