# yield表达式形式的应用 def func(): while True: x=yield 1 print(x) g=func() next(g)#初始化操作,返回值为1 g.send(2)#功能一:将2传值给yield,由yield赋值给x 功能二:与next的功能一样
yield的表达式形式要做一个初始化的操作next(g)或g.send(None)
下面用一个装饰器实现初始化操作
def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init #foo=init(foo) def foo(): print('starting') while True: x=yield None print('value : ',x) g=foo() #wrapper() g.send(2)
面向过程的程序设计思想:
核心是:过程,过程就是流程
优点:思路清晰,复杂的问题简单化,流程化
缺点:扩展性差
应用:linux内核,httpd,git
# 应用:grep -rl 'root' /etc import os # 用来初始化的装饰器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper #阶段一:递归的找文件的绝对路径,把路径发给阶段二 def search(target,start_path):#start_path 传入文件的绝对路径 g=os.walk(start_path)#解析出文件路径 for par_dir,_,files in g: # print(par_dir,files):#文件和路径拼接 for file in files: file_path=r'%s\%s' %(par_dir,file) # print(file_path) target.send(file_path)#把值传给阶段二,得到目标文件路径file_path # 阶段一的另一种写法,目的是为了方便传文件路径 # @init # def search(target): # while True: # start_path=yield # g=os.walk(start_path) # for par_dir,_,files in g: # for file in files: # file_path=r'%s\%s' %(par_dir,file) # target.send(file_path) # 阶段二:收到文件路径,打开文件获取获取对象,把文件路径发给阶段三 @init def opener(target): while True: file_path=yield #接收阶段一发来的文件路径 with open(file_path,encoding='utf-8')as f: target.send((file_path,f)) # 阶段三:收到文件对象,for循环读取文件的每一行内容,每一行内容传给阶段四 @init def cat(target): while True: filepath,f=yield for line in f: res=target.send((filepath,line)) if res: break # 阶段四;判断root是否在这一行中,如果在,把文件名发送给阶段五 @init def grep(target,pattern):#patter相当于root,(不让内容写死) tag = False while True: filepath,line=yield tag#yield会有一个返回值 返回给上一个阶段 tag=False if pattern in line: target.send(filepath) tag=True # 阶段五:收到文件名,打印结果 @init def printer(): while True: filename=yield print(filename) start_path=r'D:py3.6保存代码py_fullstack_s5a' search(opener(cat(grep(printer(),'root'))),start_path) #对应第一种写法的另一种写法,文件路径的参数的传入 # start_path1=r'D:py3.6保存代码py_fullstack_s5a' # start_path2=r'D:py3.6保存代码py_fullstack_s5a' # g=search(opener(cat(grep(printer(),'root'))))#g是一个生成器 # # g.send(start_path1) # g.send(start_path2)
生产者消费者模型
import time import random def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper def producer(target,count): for i in range(count): time.sleep(random.randrange(1,4)) x='baozi%s' % i print('



