一.yield的表达式

def foo():print('starting')while True:x=yield None#return 2print('value :',x)
g=foo()
print(next(g))
print(g.send(2))运行结果:
starting  #运行函数,打印starting后碰到yield停住
None    #next()触发后 yield将None赋值给x,打印None后循环碰到yield停住
value : 2  #g.send(2)将2赋值给yield,yield将2赋值给x,继续循环打印出2碰到yield停住
None      #碰到yield停住并返回None,print的结果就是None

以上将yield接受到的值赋值给了x,这样形式就叫做yield的表达式形式。

函数foo中有yield,那它就是迭代器。可以使用next()。yield可以返回结果,默认为None。

g.send()前生成器必须先next一次才能发送值。所以写一个装饰器,让foo自动next一次。

def init(func):def wrapper(*args,**kwargs):g=func(*args,**kwargs)next(g)return greturn wrapper@init #foo=init(foo)
def foo():print('starting')while True:x=yieldprint('value :',x)
g=foo() #wrapper()
g.send(2)运行结果:
starting
value :2

send的效果:
1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
2:与next的功能一样

# _*_ coding:utf-8 _*_
def init(func):def wrapper(*args,**kwargs):g=func(*args,**kwargs)next(g)return greturn wrapper
@init
def eater(name):print('%s ready to eat'%name)food_list=[]while True:food=yield food_listfood_list.append(food)print('%s start to eat %s'%(name,food))e=eater('alex')
print(e.send('food1'))
print(e.send('food2'))
print(e.send('food3'))运行结果:
alex ready to eat
alex start to eat food1
['food1']
alex start to eat food2
['food1', 'food2']
alex start to eat food3
['food1', 'food2', 'food3']

二.面向过程编程

应用:grep -rl 'root'  /etc

实现打印出/etc目录下所有包含‘root’的文件的文件路径

分析完成功能的阶段:

阶段一:递归地找出目录下所有文件的绝对路径,把路径发给阶段二

阶段二:收到文件路径,打开文件获取文件对象,把文件对象发给阶段三

阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四

阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五

阶段五:收到文件名,打印结果

import os
#装饰器,自动next()
def init(func):def wrapper(*args,**kwargs):g = func(*args,**kwargs)next(g)return greturn wrapper
#j阶段一:递归地找出目录下所有文件的绝对路径,把路径发给阶段二
@init
def search(target):'search file abspath'while True:start_path=yieldg = os.walk(start_path)for par_dir,_,files in g:for file in files:file_path = r'%s\%s' %(par_dir,file)target.send(file_path)
#阶段二:收到文件路径,打开文件获取文件对象,把文件对象发给阶段三
@init
def opener(target):while True:file_path = yieldwith open(file_path,encoding = 'utf-8') as f:target.send((file_path,f))
#阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):while True:file_path,f = yieldfor line in f:res=target.send((file_path,line))if res:break
#阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target,pattern):tag=Falsewhile True:filepath,line=yield tagtag=Falseif pattern in line:target.send(filepath)tag=True
#阶段五:收到文件名,打印结果
@init
def printer():while True:filename = yieldprint(filename)
start_path = r'E:\PycharmProjects\qz5\day9'
# search(opener(cat(grep(printer(),'Jack'))),start_path)
g=search(opener(cat(grep(printer(),'Jack'))))
g.send(start_path)

转载于:https://www.cnblogs.com/Vee-Wang/p/7050410.html

Day9:yield的表达式形式、面向过程编程(grep -rl 'root' /etc)相关推荐

  1. 迭代器、生成器、面向过程编程思想

    一.迭代器了解迭代器之前要先了解一个概念:什么是可迭代对象? 在python中但凡有__iter__方法的对象都是可迭代对象在我们之前学习的数据类型中除了int类型其余的都是可迭代对象! 可迭代的对象 ...

  2. python3之协程(2)---yield与send实现协程操作

    原文链接:https://www.cnblogs.com/vipchenwei/p/7049404.html yield与send实现协程操作 之前我们说过,在函数内部含有yield语句即称为生成器. ...

  3. python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05...

    迭代器 迭代器 迭代: # 更新换代(其实也是重复)的过程,每一次的迭代都必须基于上一次的结果(上一次与这一次之间必须是有关系的) 迭代器: # 迭代取值的工具 为什么用迭代器: # 迭代器提供了一种 ...

  4. yield表达式形式的应用

    基本格式 如何给yield传值 yield表达式形式的应用 栗子一吃货函数 栗子二模拟linux中的命令 grep -rl 查找内容 目录 基本格式 x = yield 把yield的接收值,赋值给x ...

  5. Golang面向过程编程-函数

    Golang面向过程编程-函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是函数 简单的说函数的作用就是把程序里多次调用的相同的代码部分定义成一份,然后起个名字,所有的 ...

  6. 关于面向过程编程的一些思考

    2019独角兽企业重金招聘Python工程师标准>>> 关于面向过程编程与指针的一些思考 长期以来,虽然有C语言的基础,但对C的使用主要停留在书面例子的基础上,没有复杂的功能和调用关 ...

  7. 面向对象编程 面向过程编程_面向对象的编程真的是死定了

    面向对象编程 面向过程编程 重点(Top highlight) Programming in the 1960s had a big problem: computers weren't that p ...

  8. 什么是面向接口编程、面向过程编程、面向对象编程?

    1.什么是面向接口编程?(IOP) 面向接口编程(Interface Oriented Programming:IOP)是一种编程思想,接口作为实体抽象出来的一种表现形式,用于抽离内部实现进行外部沟通 ...

  9. java面向过程编程怎么写_从面向过程到面向对象,我的编程之路

    也许现在新一代的程序员一开始涉足的就是c++,C#,Java这类面向对象的语言,如果这样,这篇文章可能得不到他们的认同. 这里,我只想写写我从面向过程到面向对象开发成长中的一些感想而已. 我最初学习的 ...

最新文章

  1. Spring中@Autowired注解、@Resource注解的区别
  2. 云职教课堂计算机文化基础,2020智慧职教云课堂计算机文化基础答案最新最全单元测试答案...
  3. Linux之make的用法讲解
  4. UVa1346 - Songs(贪心算法)
  5. JavaScript观察者模式
  6. iTunes 降级安装 12.6
  7. Struts1.2配置详解
  8. P8实战(一):架构概论,从过去到未来
  9. hdu 3864 素数分解
  10. kettle系列-6.kettle实现多字段字典快速翻译
  11. spring实战三装配bean之Bean的作用域以及初始化和销毁Bean
  12. java step1:基础知识1
  13. 【修改R语言的安装包路径】
  14. CorelDRAWX4的VBA插件开发{一}前言及最简单的小程序写法
  15. XSD 文件本地加载
  16. 如何批量压缩图片大小?
  17. 参考文献编号[9]之后出现空格解决方法
  18. 计算机网络应用答题卡,计算机软考中高级答题卡填涂注意事项
  19. 黑白棋——C语言设计
  20. Raspberry Pi Pico实践系列1-Windows环境下树莓派Pico迷你开发板MicroPython快速上手实践

热门文章

  1. 14个最常见的Kafka面试题及答案【转】
  2. Linux系统CentOS下mysql的安装日志
  3. Husband的忏悔书(IT攻城狮)
  4. selenium中的对文本进行全选,复制,粘贴,剪切和删除的操作
  5. 金蝶清空日志数据库脚本
  6. 分布式系统用户登录路由
  7. jquery实现停留半秒后再选择
  8. flv文件转换,完美解决
  9. SQLCLR(五)聚合
  10. it专员职责_网络IT专员岗位职责