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'路径')