一、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)

最新文章

  1. [LeetCode] Merge Sorted Array
  2. log4j.xml 配置参数属性level使用心得
  3. Bzoj1115 石子游戏Kam
  4. ios开发值json数据文件的存取
  5. 【转帖】ios上取得设备唯一标志的解决方案
  6. 精通iOS开发(第5版)
  7. C++服务器设计(四):超时管理机制设计
  8. Java集成开发环境--Eclipse for J2EE配置JRE运行环境
  9. Java通过Axis2发布WebService
  10. Python垃圾回收机制 总结
  11. mysql中整数类型后面的数字,比如int(11),11代表11个字节吗?
  12. table自适应大小,以及内容换行
  13. overlay 文件系统
  14. MySQL入门(参考官网)
  15. 20165228《网络对抗技术》Exp0 Kali安装 Week1
  16. python 一次创建多级目录
  17. c语言const和c++const
  18. 解决 SQL Server 所有帐号无 sysadmin 权限,且未启用 SQL Server 身份验证,sa 帐号也未启用的问题
  19. Bean Life Cycle
  20. Bayes' theorem (贝叶斯定理)

热门文章

  1. matplotlib之设置极坐标起点的位置
  2. js----Navigator对象,查看浏览器信息,Screen对象,查看屏幕信息
  3. C预编译宏
  4. ubuntu下SVN使用
  5. FastDFS 常见问题
  6. nginx调用php-fpm出错解决方法和nginx配置详解
  7. Zookeeper中的选举机制
  8. Shell面试题4:扫描网络内存活主机案例
  9. 第二百二十六节,jQuery EasyUI,Tree(树)组件
  10. C# 路径的使用