第一:协程

初步了解协程

def eater():
print('start to eat')
while True:
food=yield
print('is eating food:%s'%food) def producer():
dog=eater()
next(dog) # 先next一次唤醒协程函数
#然后下面的操作都是dog.send(值)
food1='北京烤鸭'
food2='鱼香肉丝'
dog.send(food1)
dog.send(food2)
producer() 输出结果:
start to eat
is eating food:北京烤鸭
is eating food:鱼香肉丝

如果有多个多个协程函数都需要初始化的话,我们用装饰器

def init(func):
def warpper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return warpper @init #eater=init(eater) #eater=warpper
def eater():
print('start to eat')
while True:
food=yield
print('is eating food:%s' % food) e=eater()#e=warpper()
e.send('北京烤鸭') 输出结果:
start to eat
is eating food:北京烤鸭

如果我们在写项目的时候,并且有多个协程函数,我们需要写注释,该怎么写:

错误示例:

def init(func):
def warpper(*args,**kwargs):
'我是warpper函数'
g=func(*args,**kwargs)
next(g)
return g
return warpper @init #eater=init(eater) #eater=warpper
def eater():
'我是eater函数'
print('start to eat')
while True:
food=yield
print('is eating food:%s' % food) print(help(eater)) 输出结果:
Help on function warpper in module __main__: warpper(*args, **kwargs)
我是warpper函数 None 我们看的是eater函数的帮助信息,返回的却是warpper函数信息的帮助

正确示例:

import functools
def init(func):
@functools.wraps(func) #让warpper的帮助信息同eater相同
def warpper(*args,**kwargs):
'我是warpper函数'
g=func(*args,**kwargs)
next(g)
return g
return warpper @init #eater=init(eater) #eater=warpper
def eater():
'我是eater函数'
print('start to eat')
while True:
food=yield
print('is eating food:%s' % food) print(help(eater)) 输出结果:
Help on function eater in module __main__: eater()
我是eater函数 None

第二:面向过程编程

#实现grep -rl 'python' /root/

import os

import functools
def init(func):
@functools.wraps(func) #让warpper的帮助信息同eater相同
def warpper(*args,**kwargs):
'我是warpper函数'
g=func(*args,**kwargs)
next(g)
return g
return warpper #面向过程的编程
#扩展性差
def get_file(abs_path,target):
'''
生产一个个文件
:param abs_path:传进来的决对路径
:param target: 下一个目标
:return: 返回绝对文件的路径
'''
g=os.walk(abs_path)
for top_dir,current_dir,files in g:
for file in files:
abs_file_path=r'%s\%s' %(top_dir,file)
target.send(abs_file_path) @init
def opener(target):
'''
打开文件
:return: 返回句柄
:param target 下一个目标
'''
while True:
abs_file_path=yield
with open(abs_file_path) as f:
target.send((f,abs_file_path)) @init
def get_lines(target):
'''
读取每一行的内容
:param target: 下一个目标
:return:返回每一行的内容
'''
while True:
f,abs_file_path=yield
for line in f:
target.send((line,abs_file_path)) @init
def grep(pattern,target):
'''
过滤关键字
:param pattern:匹配关键字
:param target: 下一个目标
:return: 返回文件
'''
while True:
line,abs_file_path=yield
if pattern in line:
target.send(abs_file_path) @init
def printer():
'''
打印功能
:return:输出信息
'''
while True:
abs_file_path=yield
print(abs_file_path) get_file(r'D:\test',opener(get_lines(grep('zzl',printer()))))

python函数之协程与面向过程编程的更多相关文章

  1. python函数:匿名函数、函数递归与二分法、面向过程编程

    今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...

  2. python之迭代器、生成器、面向过程编程

    一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...

  3. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

  4. python基础之协程函数、列表表达式、生成器表达式

    一.协程函数 协程函数的定义?如果在一个函数内部yield的使用方式是表达式形式的话,如x=yield,那么该函数称为协程函数 协程函数补充: def init(func): def wrapper( ...

  5. Python 进程线程协程 GIL 闭包 与高阶函数(五)

    Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 ​ 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...

  6. 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程

    目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...

  7. Python之路【第六篇】:Python迭代器、生成器、面向过程编程

    阅读目录 一.迭代器 1.迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 代码如下: while True: ...

  8. python基础知识14---迭代器、生成器、面向过程编程

    阅读目录 一 迭代器 二 生成器 三 面向过程编程 一 迭代器 1 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初 ...

  9. python之旅:迭代器、生成器、面向过程编程

    1.什么是迭代器? 1.什么是迭代器 迭代的工具 什么是迭代? 迭代是一个重复的过程,每一次重复都是基于上一次结果而进行的 # 单纯的重复并不是迭代 while True: print('=====& ...

随机推荐

  1. Tarjan算法【强连通分量】

    转自:byvoid:有向图强连通分量的Tarjan算法 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树.搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断 ...

  2. cmake与autoconf+automake

    cmake与autoconf+automakes是同类的编译工具,本人常用的是cmake. 这有一篇对比的文章,记录一下. cmake与autoconf+automake的对比

  3. mySql中SUBSTRING_INDEX函数用法

    SUBSTRING_INDEX(str,delim,count) 返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串.如果 count 是一个正数,返回从最后的(从左边开始 ...

  4. mongodb输错命令后不能删除问题

    在用crt连接Linux操作MongoDB时,命令输错了,想删除的时候,却删除不了,原因是crt的配置有问题,解决办法如下 第一步:选项-->会话选项

  5. Filebeat6.31整合Kafka集群消息队列(三)

    wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.3.2-linux-x86_64.tar.gz [root@ ...

  6. js读取cookie,并利用encrypt和decrypt加密和解密方法

    以下为支持encrypt和decrypt加密和解密方法 eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a ...

  7. Webmin详细安装过程及问题解决

    管理系统是件艰巨的任务,创建用户账户,配置服务,检查日志,还有系统管理员必须面对的所有其他的职责,都使系统管理工作成为一个不小的负担.下面介绍一个叫webmin的软件,webmin软件安装后能让读者从 ...

  8. 关于使用jmeter函数助手生成随机数的使用方法

    记录自己的生活!   1.使用jmeter函数助手的生成随机数的方法,主要包含以下几个函数:     [_Random]     [_RandomString]   2.关于[_Random]函数的说 ...

  9. 【基础】链表的储存结构说明(python)

    [实现链表的添加] class aNode(): def __init__(self,data=None,nxt=None): self.data=data self.nxt=nxt class ru ...

  10. hdu1285 确定比赛名次【拓扑排序】

    题目链接 确定比赛名次                                         Time Limit: 2000/1000 MS (Java/Others)    Memory ...