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