生成器典型例题

# 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(g2))
# print(list(g1))

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)

# # g=(add(n,i) for i in g)
# n = 10
# g=(add(n,i) for i in (add(n,i) for i in g))
# print(list(g))

# for i in [1,2]:
# pass
#
# print(i)


import os

def init(func): #预激活生成器的一个装饰器
def wrapper(*args,**kwargs):
g=func(*args,**kwargs) #func是一个生成器函数,返回的g是一个生成器
next(g) #预激活生成器
return g #返回激活后的生成器g
return wrapper

@init #list_files = init(list_files) == wrapper
def list_files(target): #target = opener_g
while 1:
dir_to_search=yield
for top_dir,dir,files in os.walk(dir_to_search): #os.walk (路径,文件夹,文件)
for file in files: #从文件列表中获取一个一个的文件
target.send(os.path.join(top_dir,file)) #把文件的绝对路径传给了opener_g
@init #opener = init(opener) == wrapper
def opener(target): #target = cat_g
while 1:
file=yield #拿到了一个文件的路径
fn=open(file,encoding='utf-8') #打开文件获取了一个文件句柄
target.send((file,fn)) #cat_g发送了一个文件的路径和句柄
@init #cat = init(cat) == wrapper
def cat(target): #target = grep_g
while 1:
file,fn=yield #文件路径和文件的句柄
for line in fn:
target.send((file,line)) #文件路径,文件中的一行
@init #grep = init(grep) == wrapper
def grep(pattern,target): #要搜索的关键字,printer_g
lst = []
while 1:
file,line=yield #文件的路径和每一行
if pattern in line and file not in lst: #判断关键字是否在当前行
lst.append(file)
target.send(file) #printer_g.send文件路径
@init #printer = init(printer) == wrapper
def printer():
while 1:
file=yield #获取一个文件路径
if file:
print(file) #打印文件的路径:文件里包含了要搜索的关键字

g=list_files(opener(cat(grep('python',printer()))))
# g=list_files(opener(cat(grep('python',printer_g))))
# g=list_files(opener(cat(grep_g)))
# g=list_files(opener(catg)))
# g=list_files(opener_g)
g.send('D:\Python代码文件存放目录\S6\day18')

#用户给一个路径和关键字
#可以从一个文件路径中找到所有包含关键字的文件

转载于:https://www.cnblogs.com/jingjing12/p/7302406.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值