生成器面试题

生成器相关的面试题

生成器在编程中发生了很多的作用,善用生成器可以帮助我们解决很多复杂的问题

除此之外,生成器也是面试题中的重点,在完成一些功能之外,人们也想出了很多魔性的面试题。
接下来我们就来看一看~

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

 

posted @ 2018-12-14 13:09  Lewis姜  阅读(180)  评论(0)    收藏  举报