# 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('