一、yield表达式形式

 1 #装饰器,初始化含yield表达式的生成器
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)
list=[]
while True:
food=yield list
list.append(food)
print('%s had eaten %s'%(name,food)) e=eater('alex')
print(e.send('鲍鱼'))
print(e.send('鱼翅'))

含yield表达式的生成器,在使用之前需要初始化,即执行一次net(g),将函数执行停留在yield处

send的效果:
   1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
   2:与next的功能一样,如果yield后面有返回值,则返回该值,没有,返回值为None

二、os模块,递归取文件绝对路径

 import os
g=os.walk(r'D:\Pycharm Workspace') #g为生成器
for par_dir,_,files in g:
for file in files:
file_path=r'%s\%s'%(par_dir,file)
print(file_path)

三、面向过程编程

面向过程编程又叫函数式编程:

  函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

核心:是过程,过程即流程

优点:思路清晰,复杂的问题简单化,流程化

缺点:扩展性差

应用:linux内核,httpd,git

 #模拟 grep ‘root’ /etc功能
import os
def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper
#阶段一:递归地找文件的绝对路径,把路径发给阶段二
@init
def search(target):
'search file abspath'
while True:
start_path=yield
g = os.walk(start_path)
for par_dir, _, files in g:
# print(par_dir,files)
for file in files:
file_path = r'%s\%s' % (par_dir, file)
target.send(file_path)
#阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
@init
def opener(target):
'get file obj: f=open(filepath)'
while True:
file_path=yield
with open(file_path,encoding='utf-8') as f:
target.send((file_path,f)) #阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):
'read file'
while True:
filepath,f=yield
for line in f:
res=target.send((filepath,line))
if res:
break #阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target,pattern):
'grep function'
tag=False
while True:
filepath,line=yield tag #target.send((filepath,line))
tag=False
if pattern in line:
target.send(filepath)
tag=True
#阶段五:收到文件名,打印结果
@init
def printer():
'print function'
while True:
filename=yield
print(filename) start_path = r'D:\Pycharm Workspace\Day10'
g=search(opener(cat(grep(printer(),'root')))) print(g)
# g.send(start_path1)
g.send(start_path)

面向过程编程核心是过程,缺点是扩展性差

from峰哥:  

  函数的参数传入,是函数吃进去的食物,而函数return的返回值,是函数拉出来的结果,面向过程的思路就是,把程序的执行当做一串首尾相连的函数,一个函数吃,拉出的东西给另外一个函数吃,另外一个函数吃了再继续拉给下一个函数吃。。。

例如:
  用户登录流程:前端接收处理用户请求-》将用户信息传给逻辑层,逻辑词处理用户信息-》将用户信息写入数据库
  验证用户登录流程:数据库查询/处理用户信息-》交给逻辑层,逻辑层处理用户信息-》用户信息交给前端,前端显示用户信息


Python基础(9)_生成器(yield表达式形式)、面向过程编程的更多相关文章

  1. Day06:迭代器,生成器,生成表达式,面向过程编程,包及常用模块

    今日内容:1.迭代器(****)2.生成器(***)3.生成器表达式(*****)4.面向过程编程(*****)5.包的使用(***)6.常用模块    logging (*****)    re ( ...

  2. python函数式编程之yield表达式形式

    先来看一个例子 def foo(): print("starting...") while True: res = yield print("res:",res ...

  3. python基础语法9 生成器,面向对象编程思想,三元表达式,列表生成式,生成器表达式(生成式),匿名函数,内置函数

    生成器 1.什么是生成器? 生成的工具. 生成器是一个 "自定义" 的迭代器, 本质上是一个迭代器. 2.如何实现生成器 但凡在函数内部定义了的yield, 调用函数时,函数体代码 ...

  4. Python入门之迭代器/生成器/yield的表达方式/面向过程编程

    本章内容 迭代器 面向过程编程 一.什么是迭代 二.什么是迭代器 三.迭代器演示和举例 四.生成器yield基础 五.生成器yield的表达式形式 六.面向过程编程 ================= ...

  5. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  6. python基础--迭代器、生成器、内置函数、面向对象编程

    迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...

  7. day22 yield的表达式的应用,面向过程编程,内置函数前几个

    Python之路,Day10 = Python基础10 生成器表达式: (i for i in range(10) if i > 5)os.walk(r'文件路径')返回一个迭代器, 第一次ne ...

  8. Python 迭代器-生成器-面向过程编程

    上节课复习:1. 函数的递归调用 在调用一个函数的过程中又直接或者间接地调用了函数本身称之为函数的递归 函数的递归调用有两个明确的阶段: 1. 回溯 一层一层地调用本身 注意: 1.每一次调用问题的规 ...

  9. 迭代器,for循环本质,生成器,常用内置方法,面向过程编程

    一.迭代器 1.迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 2.迭代器给你提供了一种不依赖于索引取值的方式 3.可以迭代取值的对象:字符串,列表,元组,字典 ...

随机推荐

  1. stylelint — css书写规范

    sass lint guidance 一.安装:npm intsall -g stylelint 二.配置:http://stylelint.io/user-guide/rules/ (以下规则文件配 ...

  2. layui表格渲染中模板的使用举例

    实例一: { field: 'status', align: 'center', title: '活动状态', templet: function (d) { if (d.status == &quo ...

  3. c++ 宏 #val 在unicode下的使用。

    #define CHECK(condition) cout<<check failed:<<#condition<<endl; 上面这句宏,当你 CHECK(myf ...

  4. codeblocks设置当前行高亮

    默认是不开启当前行高亮的. 如果想打开,选择:Settings>Editor>Editor Settings>Other options> 勾选Highlight line u ...

  5. php之curl设置超时实例

    本文实例讲述了php中curl超时设置方法.分享给大家供大家参考.具体实现方法如下: 访问HTTP方式很多,可以使用curl, socket, file_get_contents() 等方法. 在访问 ...

  6. 配置LANMP环境(5)-- 安装NGINX与配置

    安装nginx yum install nginx 若提示找不到nginx,则在软件源中添加nginx的软件源文件: vim /etc/yum.repos.d/nginx.repo 添加如下内容: [ ...

  7. Eclipse 重构菜单

    Eclipse 重构菜单 使用Eclipse重构 在项目开发中我们经常需要修改类名,但如果其他类依赖该类时,我们就需要花很多时间去修改类名. 但 Eclipse 重构功能可以自动检测类的依赖关系并修改 ...

  8. mac与phy怎样实现网络自适应

    这两天改动网卡驱动以实现10/100/1000M自适应,因此研究了下phy芯片和emac驱动怎样兼容10/100/1000M网络环境,记录在此. 网络中设备端数据链路层由mac芯片和phy芯片组成.p ...

  9. 12个十分实用的JavaScript小技巧

    12个非常实用的JavaScript小技巧 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候 ...

  10. ASP.NET MVC 使用dataTable(3)--更多选项参考

    ASP.NET MVC 使用dataTable(3)--更多选项参考 jQuery  dataTables 插件是一个优秀的表格插件,是后台工程师的福音!它提供了针对数据表格的排序.浏览器分页.服务器 ...