第一:协程

初步了解协程

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. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)

    前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并 ...

  2. 【Android】Android 代码判断当前设备是否为模拟器

    [Android]Android 代码判断当前设备是否为模拟器 方法比较简单,直接粘贴代码 //判断当前设备是否是模拟器.如果返回TRUE,则当前是模拟器,不是返回FALSE public stati ...

  3. 浅谈Rsync+Inotify实时同步

    Rsync是Unix/Linux旗下的一款应用软件,利用它可以是多台服务器数据保持同步一致性,第一次同步时rsync会复制全部内容,但在下次只传输修改过的文件 Rsync在传输数据的过程中可以实行压缩 ...

  4. zTree实战

    1.实体 public class UserDataZTreeVo { private String id; private String pid; private String name; priv ...

  5. plink命令

    用plink远程登陆link主机执行脚本,但是无法执行sudo命令 完成后自己关闭 plink   -l  root   192.168.1.21  df -h plink.exe  -ssh  -p ...

  6. Azkaban

    Azkaban安装部署 https://azkaban.github.io/azkaban/docs/2.5/ 安装Azkaban ) 在/opt/module/目录下创建azkaban目录 [kri ...

  7. 根据cookie记录跟踪ID来确定分享对象

    一 :思路分析 1:用户注册的时候标记推客 2:推客生成分享链接 分享链接构成   (环境前缀+(此链接打开时需要调用的接口+推客的标记+&url=(商品的链接))) 3:需要写一个分享链接调 ...

  8. jsonp突破浏览器同源策略

    jsonp突破浏览器同源策略 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  9. Django初识 学习笔记一

    Django初识 学习笔记一 mvcviewsmodelstemplate. 一 MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(c ...

  10. Xamarin Essentials教程数据处理传输数据

    Xamarin Essentials教程数据处理传输数据 在移动应用程序中,除了常规的数据处理,还涉及数据存储.数据传输.版本数据多个方面.Xamarin.Essentials组件提供了多个数据处理相 ...