第一:协程

初步了解协程

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. 记JS一个错误,

    在定义变量时候,如果直接定义 var obj=null;那么,在转码时候,比如转为base64,此时或出现特殊的文字(也是汉字,只是很少见少用的文字,而且,出现的文字是根据你给obj赋值决定的,) 由 ...

  2. Codeforces 348D Turtles LGV

    Turtles 利用LGV转换成求行列式值. #include<bits/stdc++.h> #define LL long long #define fi first #define s ...

  3. 51Nod1253 Kundu and Tree 容斥原理

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1253.html 题目传送门 - 51Nod1253 题意 树包含 N 个点和 N-1 条边.树的边有 ...

  4. python线程池ThreadPoolExecutor与进程池ProcessPoolExecutor

    python中ThreadPoolExecutor(线程池)与ProcessPoolExecutor(进程池)都是concurrent.futures模块下的,主线程(或进程)中可以获取某一个线程(进 ...

  5. Machine Learning 算法可视化实现1 - 线性回归

    一.原理和概念 1.回归 回归最简单的定义是,给出一个点集D,用一个函数去拟合这个点集.而且使得点集与拟合函数间的误差最小,假设这个函数曲线是一条直线,那就被称为线性回归:假设曲线是一条二次曲线,就被 ...

  6. day 35 协程与gil概念

    博客链接: http://www.cnblogs.com/linhaifeng/articles/7429894.html 今日概要: 1 生产者消费者模型(补充) 2 GIL(进程与线程的应用场景) ...

  7. JS变量声明方式

    在JavaScript中有三种声明变量的方式:const  var let const:用于声明常量.注意:定义的变量的时候,必须同时初始化,且其值之后不可以修改. var:最常用的声明变量关键字.  ...

  8. Linux学习之RPM包管理-rpm命令管理(十六)

    Linux学习之RPM包管理-rpm命令管理 目录 简介 RPM包依赖性 包全名与包名 rpm软件包安装 rpm软件包卸载 升级降级rpm软件包 rpm软件包的查询 rpm软件包校验 简介 RPM是R ...

  9. Wan Android 项目总结

    Wan Android 项目总结 项目的由来 这个项目也算是自己学习了一段时间的Android以后的一个总结和学习吧,项目采用了Kotlin语言,Api采用的hongyang大神的WanAndroid ...

  10. PAT (Advanced Level) Practise 1003 解题报告

    GitHub markdownPDF 问题描述 解题思路 代码 提交记录 问题描述 Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题 ...