1、处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕。
1 def files(filename): 2 with open(filename,mode='r',encoding='utf-8') as f: 3 for line in f: 4 if "python" in line: 5 yield line.strip() 6 7 g=files("python") 8 for i in g: 9 print(i) 10 11 12 #修改 13 14 def files(filename,aim): 15 with open(filename,mode='r',encoding='utf-8') as f: 16 for line in f: 17 if aim in line: 18 yield line.strip() 19 20 g=files("python","python") 21 for i in g: 22 print(i)
2、写生成器,从文件中读取内容,在每一次读取到的内容之前加上‘***’之后再返回给用户。
1 def files(filename): 2 with open(filename,mode='r',encoding='utf-8') as f: 3 for line in f: 4 yield "***"+line.strip() 5 6 g=files("python") 7 for i in g: 8 print(i)
3、生成器相关面试题
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(g1) #<generator object <genexpr> at 0x000002A9BB6FB410> 11 print(list(g1)) 12 print(list(g2)) 13 14 15 结果: 16 [0, 1, 2, 3] 17 [] 18 19 分析: 20 代码从上到下执行,执行到g2=(i for i in g1)时,生成器并没有开始调用,因为生成器的惰性。当到print(list(g1))时,生成器才开始执行,
这时g1强转为列表,所以g1为[0, 1, 2, 3]。当g2取值的时候,g1的值已经被list取出来了(生成器只能被取一次),g1已经空了,所以g2为空。
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 10 for n in [1,10]: 11 g=(add(n,i) for i in g) 12 13 14 print(list(g)) 15 16 结果: 17 [21, 22, 23, 24] 18 19 20 # 分析: 21 # 22 # n = 1 23 # g1 = (add(n, i) for i in g) 24 # n = 10 25 # g2 = (add(n, i) for i in g) 26 # 27 # (1)替换:g替换成了g1, n = 10 28 # g2 = (add(n, i) for i in (add(n, i) for i in g)) 29 # 30 # (2)g又替换成了test(), n = 10 31 # g2 = (add(n, i) for i in (add(n, i) for i in test())) 32 # 33 # (3)test() == > (1, 2, 3, 4), n = 10 34 # g2 = (add(n, i) for i in (add(n, i) for i in (1, 2, 3, 4))) 35 # 36 # (4)(add(n, i) for i in (1, 2, 3, 4) == > (11, 12, 13, 14), n=10 37 # g2 = (add(n, i) for i in (11, 12, 13, 14)) 38 # 39 # (5)结果: 40 # g2 = (21, 22, 23, 24)