python函数之协程与面向过程编程
第一:协程
初步了解协程
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函数之协程与面向过程编程的更多相关文章
- python函数:匿名函数、函数递归与二分法、面向过程编程
今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...
- python之迭代器、生成器、面向过程编程
一 迭代器 一 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不 ...
- python之迭代器、生成器与面向过程编程
目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...
- python基础之协程函数、列表表达式、生成器表达式
一.协程函数 协程函数的定义?如果在一个函数内部yield的使用方式是表达式形式的话,如x=yield,那么该函数称为协程函数 协程函数补充: def init(func): def wrapper( ...
- Python 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程
目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...
- Python之路【第六篇】:Python迭代器、生成器、面向过程编程
阅读目录 一.迭代器 1.迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 代码如下: while True: ...
- python基础知识14---迭代器、生成器、面向过程编程
阅读目录 一 迭代器 二 生成器 三 面向过程编程 一 迭代器 1 迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初 ...
- python之旅:迭代器、生成器、面向过程编程
1.什么是迭代器? 1.什么是迭代器 迭代的工具 什么是迭代? 迭代是一个重复的过程,每一次重复都是基于上一次结果而进行的 # 单纯的重复并不是迭代 while True: print('=====& ...
随机推荐
- 记JS一个错误,
在定义变量时候,如果直接定义 var obj=null;那么,在转码时候,比如转为base64,此时或出现特殊的文字(也是汉字,只是很少见少用的文字,而且,出现的文字是根据你给obj赋值决定的,) 由 ...
- Codeforces 348D Turtles LGV
Turtles 利用LGV转换成求行列式值. #include<bits/stdc++.h> #define LL long long #define fi first #define s ...
- 51Nod1253 Kundu and Tree 容斥原理
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1253.html 题目传送门 - 51Nod1253 题意 树包含 N 个点和 N-1 条边.树的边有 ...
- python线程池ThreadPoolExecutor与进程池ProcessPoolExecutor
python中ThreadPoolExecutor(线程池)与ProcessPoolExecutor(进程池)都是concurrent.futures模块下的,主线程(或进程)中可以获取某一个线程(进 ...
- Machine Learning 算法可视化实现1 - 线性回归
一.原理和概念 1.回归 回归最简单的定义是,给出一个点集D,用一个函数去拟合这个点集.而且使得点集与拟合函数间的误差最小,假设这个函数曲线是一条直线,那就被称为线性回归:假设曲线是一条二次曲线,就被 ...
- day 35 协程与gil概念
博客链接: http://www.cnblogs.com/linhaifeng/articles/7429894.html 今日概要: 1 生产者消费者模型(补充) 2 GIL(进程与线程的应用场景) ...
- JS变量声明方式
在JavaScript中有三种声明变量的方式:const var let const:用于声明常量.注意:定义的变量的时候,必须同时初始化,且其值之后不可以修改. var:最常用的声明变量关键字. ...
- Linux学习之RPM包管理-rpm命令管理(十六)
Linux学习之RPM包管理-rpm命令管理 目录 简介 RPM包依赖性 包全名与包名 rpm软件包安装 rpm软件包卸载 升级降级rpm软件包 rpm软件包的查询 rpm软件包校验 简介 RPM是R ...
- Wan Android 项目总结
Wan Android 项目总结 项目的由来 这个项目也算是自己学习了一段时间的Android以后的一个总结和学习吧,项目采用了Kotlin语言,Api采用的hongyang大神的WanAndroid ...
- PAT (Advanced Level) Practise 1003 解题报告
GitHub markdownPDF 问题描述 解题思路 代码 提交记录 问题描述 Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题 ...