yield的表达式形式、面向过程编程(grep -rl 'root' /etc)
一、yield的表达形式
def foo():
print('starting')
while True:
x=yield None#return 2
print('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 g
return wrapper @init #foo=init(foo)
def foo():
print('starting')
while True:
x=yield
print('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 g
return wrapper
@init
def eater(name):
print('%s ready to eat'%name)
food_list=[]
while True:
food=yield food_list
food_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 g
return wrapper
#j阶段一:递归地找出目录下所有文件的绝对路径,把路径发给阶段二
@init
def search(target):
'search file abspath'
while True:
start_path=yield
g = 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 = yield
with open(file_path,encoding = 'utf-8') as f:
target.send((file_path,f))
#阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):
while True:
file_path,f = yield
for line in f:
res=target.send((file_path,line))
if res:
break
#阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target,pattern):
tag=False
while True:
filepath,line=yield tag
tag=False
if pattern in line:
target.send(filepath)
tag=True
#阶段五:收到文件名,打印结果
@init
def printer():
while True:
filename = yield
print(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)
yield的表达式形式、面向过程编程(grep -rl 'root' /etc)的更多相关文章
- yield的表达式形式与内置函数
yield的功能: 1. 与return类似,都可以返回值,不一样在于,yield可以返回多个值而且可暂停,再次执行可继续下一步操作,return到了就停止不在继续运行. 2.为封装好的的函数能够使用 ...
- yield的表达式形式的应用(待补充)
1.yield的表达式形式应用的定义: 在一个生成器函数内,将yield赋值给一个变量,这就是yield的表达式形式.也叫生成器的表达式形式 2.send方法的定义: (1)定义: yield的表达式 ...
- 面向过程编程实例------grep-rl 'root 路径
#应用:grep -rl 'root' /etc import os def deco(func): def wrapper(*args): g=func(*args) next(g) return ...
- Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分
生成器表达式形式 直接上代码 # yield的表达式形式 def foo(): print('starting') while True: x=yield #默认返回为空,实际上为x=yield No ...
- python基础之生成器表达式形式、面向过程编程、内置函数部分
生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...
- python--表达式形式的yield、面向过程编程、内置函数
yield的表达式形式 def init(func): def wrapper(*args, **kwargs): g = func(*args, **kwargs) next(g) return g ...
- Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化
一.装饰器 一.装饰器的知识储备 1.可变长参数 :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...
- 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式
一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数 :*args和**kwargs def index(name,age): print(na ...
- yield表达式形式
首先了解 1.iterator iterator叫做迭代器,用来遍历可以序列化的数据,比如一个list,set 等,当然如果对象想要能够使用迭代器来遍历,只要在该对象的类中添加__iter__()方法 ...
随机推荐
- 关于UNIX/Linux下安装《UNIX环境高级编程》源代码的问题
<UNIX环境高级编程(第三版)>是一本广为人知的unix系统编程书籍. 但是,书中的代码示例,要想正确的编译运行,要先做好准备工作: 1.下载源代码 传送门:http://apueboo ...
- iOS-回收键盘的几种方法
在开发过程中,为了实现点击屏幕其它位置收起键盘的目的,我们使用过许多的方法. 如果是在UIViewController中收起键盘,除了通过调用控件的resignFirstResponder方法外,还有 ...
- apache ab测试
网站并发测试,网站服务使用的是apache2.4 因此使用ab来测试网站性能. windows使用cms 打开apache/bin 运行ab.exe (......../apache/bin/ab), ...
- 数据库设计(三)11 important database designing rules which I follow
原文地址:https://www.codeproject.com/Articles/359654/important-database-designing-rules-which-I-fo 麻辣个
- ARP-Address Resolution Protocol-地址解析协议
主要内容摘自:图解TCP/IP ARP是一种解决地址问题的协议.以目标IP地址为线索,用来定位下一个应该接受数据分包的网络设备的mac地址. 如果目标主机不在同一个链路上时,可以通过ARP查找下一跳路 ...
- 缓存数据库redis、memcached。 MongoDB 资源集锦
Redis学习资源: 1.Redis学习手册 http://www.cnblogs.com/stephen-liu74/archive/2012/03/14/2349815.html 2.c#连接Re ...
- R语言安装openxl包报错解决办法
在R语言中使用openxlsx包,会报错 解决办法就是: 下载安装Set-Rtool,安装时注意勾选对话框 然后在R中运行以下代码: Sys.setenv("R_ZIPCMD" = ...
- 第二百二十八节,jQuery EasyUI,TreeGrid(树形表格)组件
jQuery EasyUI,TreeGrid(树形表格)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 TreeGrid(树形表格)组件的使 ...
- JSP页面之间传递参数的方法有哪些?
JSP页面之间传递参数的方法有哪些? 解答: 1)request 2)session 3)application 4)提交表单 5)超链接
- <!>表格语法
<table aling=left>...</table>表格位置,置左 <table aling=center>...</table>表格位置,置中 ...