Day5_协程函数_面向过程
def func(count):
while True:
yield count
count +=1
#这是一个生成器,需要利用next()来执行。
func(10)
#yield:
#1.把函数的执行结果封装好_iter_ 和_next_,即得到一个迭代器。
#2.与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值。
#3.函数暂停与再继续运行的状态是由yield保存。
#yield的表达式应用:
#用法:
def eater(name):
print('%s 说:我开动啦' %name)
food_list=[]
while True:
food=yield food_list
food_list.append(food) #['骨头','菜汤']
print('%s eat %s' %(name,food))
#
# alex_g=eater('alex')
# #第一阶段:初始化
# next(alex_g) #等同于alex_g.send(None)
# print('===========>')
#
# #第二阶段:给yield传值
# print(alex_g.send('骨头')) #1 先给当前暂停位置的yield传骨头 2 继续往下执行,直到再次碰到yield,然后暂停并且把yield后的返回值当做本次调用的返回值
# # print('===========>')
# print(alex_g.send('菜汤'))
# print(alex_g.send('狗肉包子'))
#将吃的部分定义成模块,实现模块交互
def producer():
alex_g=eater('alex')
#初始化
next(alex_g)
#第二阶段:给yield传值
while True:
food=input('>>:').strip()
if not food:continue
print(alex_g.send(food))
producer()
面向过程:核心即过程二字,过程即解决问题的步骤,基于面向过程去设计程序,就是设计一条工业流水线,是一种机械式的思维方式。
优点:程序结构清晰,可以把复杂的文件简单化,流程化。
缺点:可扩展性差,一条流水线只是用来解决一个问题。
应用场景:linux内核,git,httpd,shell脚本。
实现一个小程序: tail -f access.log | grep 'error'
第一阶段:找到所有文件的绝对路径
第二阶段:打开文件
第三阶段:循环读出每一行内容
第四阶段:过滤
第五阶段:打印该行属于的文件名
#遍历检索目录下的文件,需要用到os这个模块。
import os
#装饰器
def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper
#找到所有文件的绝对路径
@init
def search(target):
while True:
filepath=yield
g=os.walk(filepath) for pardir,_,files in g: print(pardir,files) for file in files: abspath=r'%s\%s' %(pardir,file) print(abspath)
target.send(abspath)
#第二阶段:打开文件
@init
def opener(target):
while true:
abspath=yield
with open(abspath) as f:
print(f)
#第三阶段:循环读取文件的每一行内容
@init
def cat(target):
while True:
abspath,f=yield
for line in f:
target.send(abspath,line)
if res:break
#第四阶段,过滤
@init
def grep(pattern,target):
tag=False
while True:
abspath,line=yield tag
tag=False
if pattern in line:
target.send(abspath)
tag=True
#第五阶段,打印该行属于的文件名
@init
def print():
while True:
abspath=yield
print(abspath)
g=search(opener(cat(grep('error',print()))))
g.send(r'路径')

浙公网安备 33010602011771号