使用装饰器来装饰生成器
由于生成器要使用next方法才会进入里面执行,假如生成器多每次都要使用next方法进入十分繁琐,因此可以把next方法放在装饰器里来装饰生成器。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16def foo():
x=[]
while True:
n =yield x
x.append(n)
print(x)
a = foo()
a.__next__()
q = 1
while True:
if q == 6:
break
a.send(q)
q+=1
next方法放进装饰器里1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24def zhuang(fun):
def wrapper():
k = fun()
next(k)
return k
return wrapper
@zhuang ##foo =zhaung(foo)
def foo():
x=[]
while True:
n =yield x
x.append(n)
print(x)
a = foo()
foo()
q = 1
while True:
if q == 6:
break
a.send(q)
q+=1
使用生成器和装饰器实现grep命令搜寻Python并打印出该文件路径的功能1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73import os
def init(func): ##实现next方法进入生成器
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
next(res)
return res
return wrapper
@init
def search(target): ##得到路径下的各个文件的绝对路径
while True:
search_path=yield
g=os.walk(search_path) ##os.walk(路径) 得三个值 1)路径本身 2)空列表 3)路径下的各个文件
for par_dir,_,files in g:
#par_dir 目录的路径
#files 文件名字列表
for file in files: ##遍历各个文件的列表
file_abs_path=r'%s\%s' %(par_dir,file)
# print(file_abs_path)
target.send(file_abs_path) ##把路径的值传给生成器4opener()
#E:\python\讲课\实战一期\串讲\基础\12.5\lib\1.txt
#E:\python\讲课\实战一期\串讲\基础\12.5\lib\dsfds
#E:\python\讲课\实战一期\串讲\基础\12.5\lib\have_python
@init
def opener(target): ##打开各个文件
while True:
file_abs_path=yield
# print('opener func==>',file_abs_path)
with open(file_abs_path,encoding='utf-8') as f:
target.send((file_abs_path,f)) ##值是元祖 (文件路径,文件句柄)
@init
def cat(target): ##遍历各个文件内容
while True:
file_abs_path,f=yield #(file_abs_path,f)
for line in f:
tag=target.send((file_abs_path,line))
if tag:
break
@init
def grep(target,pattern): ##判断文件内容是否有python
#pattern= python
tag=False
while True:
file_abs_path,line=yield tag
tag=False
if pattern in line:
tag=True
target.send(file_abs_path)
@init ##打印出有内容有Python的路径
def printer():
while True:
file_abs_path=yield
print(file_abs_path)
#生成器5
#生成器4
#生成器3
#生成器2
#生成器1
g=search(opener(cat(grep(printer(),'python'))))
print(g)
x=r'E:\python\讲课\实战一期\串讲\基础\bak\lib'
g.send(x)
流程:
1)装饰器@init作用就是next方法 进入生成器内部 进入生成器1printer() 遇到yield跳出来 继续走装饰器@init并执行装饰器2grep(printer(),’python’ 遇到yield跳出来 …直到最外层执行生成器5 search() 遇到yield又跳出来并赋值给g
2)g通过send传值进入生成器5search()的yield中继续执行得到文件的绝对路径 给生成器4opener() 打开各个文件 传值给生成器3cat() 遍历各个文件内容 传值给生成器2grep()判断文件内容是否有python 传值给生成器1printer()打印出该路径 继续重复 1)2)
printer –> grep –> cat –> opener –> search–> opener –> cat –> grep –> printer –>grep….
使用os.walk方法得文件的绝对路径1
2
3
4
5
6
7
8
9
10
11
12import os
d = r'E:\12.5\12.5\lib'
g = os.walk(d)
for a,b,c in g: #a是路径 c是路径下的各个文件的列表
for files in c: #遍历列表得各个文件 并打印出各个文件的绝对路径
print(r'%s\%s' %(a,files))
E:\12.5\12.5\lib\1.txt
E:\12.5\12.5\lib\dsfds
E:\12.5\12.5\lib\have_python