一、解释

面向过程:核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计,流水线式的编程思想,在设计程序时,需要把整个流程设计出来, 一条工业流水线,是一种机械式的思维方式

二、优缺点

优点:程序体系结构清晰,可以把复杂的问题简单化,流程化

缺点:可扩展性差,一条流线只是用来解决一个问题,所以说面向过程的应用多为不需要经常变化的软件

应用场景:linux内核,git,httpd,shell脚本

三、实例(利用协程函数进行面向过程编程)

过滤一个文件下的子文件、字文件夹的内容中的相应的内容,在Linux中的命令就是 grep -rl 'python' /etc

使用了Python的包os 里面的walk(),能够把参数中的路径下的文件夹打开并返回一个元组

>>> import os
>>> os.walk('D:\test')
generator object walk at 0x0000000002ADB3B8 >>> os.walk('D:\\test') # 以后使用这种路径方式,win下
>>> os.walk(r'D:\test') # 使用r 是让字符串中的符号没有特殊意义,针对的是转义

出现错误,是因为路径的原因,但是在不同的机器上有的是可以的

>>> g=os.walk('D:\test')
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

以后推荐是用\

>>> g=os.walk('D:\\test')
>>> next(g)
('D:\\test', ['a', 'b'], ['test.txt'])

返回的是一个元组第一个元素是文件的路径,第二个是文件夹,第三个是该路径下的文件

1.2.1 程序流程

  1. 找文件路径 --os.walk
  2. 然后打开文件 --open
  3. 读取文件的每一行内容 -- for line in f
  4. 过滤一行内容中是否有Python if 'python' in line
  5. 打印包含Python的文件路径

程序是从上往下执行的,1产生的路径作为参数给2,2产生的给3...

上面产生的结果是下面的输入参数

1 找文件的路径

g是一个生成器,就能够用next()执行,每次next就是运行一次,这里的运行结果是依次打开文件的路径

>>> g=os.walk('D:\\test')
>>> next(g)
('D:\\test', ['a', 'b'], ['test.txt'])
>>> next(g)
('D:\\test\\a', ['a1'], ['a.txt'])
>>> next(g)
('D:\\test\\a\\a1', [], ['a1.txt'])
>>> next(g)
('D:\\test\\b', ['b1'], ['b.txt'])
>>> next(g)
('D:\\test\\b\\b1', [], ['b1.txt'])

我们在打开文件的时候需要找到文件的绝对路径,现在可以通过字符串拼接的方法把第一部分和第三部分进行拼接

用循环打开:

import os
# def serach():
g = os.walk('D:\\test')
for i in g:
print(i)
结果:
('D:\test', ['a', 'b'], ['test.txt'])
('D:\test\a', ['a1'], ['a.txt'])
('D:\test\a\a1', [], ['a1.txt'])
('D:\test\b', ['b1'], ['b.txt'])
('D:\test\b\b1', [], ['b1.txt'])

将查询出来的文件和路径进行拼接,拼接成绝对路径

import os
# def serach():
g = os.walk('D:\\test')
for i in g:
# print(i)
for j in i[-1]: # 对最后一个元素进行遍历,这些都是文件
file_path= '%s\\%s' %(i[0],j)
print(file_path)
结果:
D:\test\test.txt
D:\test\a\a.txt
D:\test\a\a1\a1.txt
D:\test\b\b.txt
D:\test\b\b1\b1.txt

这样就把文件的所有的绝对路径找出来了

用函数实现:

def search():
while True:
file_name = yield # 通过white循环能够循环接收
g = os.walk(file_name) # 这里就换成了参数
for i in g:
for j in i[-1]: # 对最后一个元素进行遍历,这些都是文件
file_path= '%s\\%s' %(i[0],j)
print(file_path) g=search() # g就是生成器函数
next(g) # 初始化
g.send('D:\\test') # 通过send传递的是路径

2 然后打开文件

写程序中,在这里遇到的问题是 with open(file_path) as f: AttributeError: enter,不明白是为什么,然后想到open可能是系统已经用了的,所以修改名字后执行成功。

@init   # 初始化生成器
def opener(target):
"打开文件,操作句柄"
while True:
file_path=yield #  接收search传递的路径
with open(file_path) as f:
target.send((file_path,f)) # send多个用元组的方式,为了把文件的路径传递下去

3 读取文件的每一行内容

@init
def cat(target):
while True:
file_path,f=yield
for line in f:
target.send((file_path,line)) # 同时传递文件路径和每一行的内容

4 过滤一行内容中是否有

@init
def grep(pattern,target): # patter是过滤的参数
while True:
file_path,line=yield
if pattern in line:
target.send(file_path) # 传递有相应内容的文件路径

5 打印包含Python的文件路径

@init
def printer():
while True:
file_path=yield
print(file_path)

上面的是函数的定义阶段,下面是函数的执行阶段:

g=search(opener(cat(grep('python',printer()))))
g.send('D:\\test')

target这个生成器:
opener(cat(grep('python',printer())))

 
 
 

Python函数之面向过程编程的更多相关文章

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

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

  2. Python基础之面向过程编程

    要求:在文件里递归找到关于包含“Python”内容的文件的绝对路径并打印出来 #定义阶段 import os,time def init(func): #装饰器的作用是使下面的生成器初始化,yield ...

  3. python基础之面向过程编程,模块

    面向过程编程 面向过程的核心是过程,指的是解决问题的步骤,即先干什么再干什么,就好像设计一条流水线. 优点:复杂的问题流程化,进而简单化 缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身 ...

  4. python-迭代器、生成器、内置函数及面向过程编程

    一.迭代器 迭代器是迭代取值的工具,迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的. 为什么要用迭代器呢? 1.可以不依赖索引取值 2.同一时刻在内存中只有一个值,不会过多的占用内存 如何 ...

  5. day14-二分法、匿名函数、内置函数以及面向过程编程

    目录 二分法 匿名函数 内置函数 面向过程编程 二分法 二分法查找适用于数据量较大时,但是数据需要先排好顺序.主要思想是:(设查找的数组区间为array[low, high]) (1)确定该区间的中间 ...

  6. 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程

    目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...

  7. python函数:匿名函数、函数递归与二分法、面向过程编程

    今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...

  8. Python基础(9)_生成器(yield表达式形式)、面向过程编程

    一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...

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

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

随机推荐

  1. php不用第三个变量,交换两个数的值

    //字符串版本 结合使用substr,strlen两个方法实现 $a="a"; $b="b"; echo '交换前 $a:'.$a.',$b:'.$b.'< ...

  2. 精通HTML DOM

    DOM 1. 属性方法 类型/返回类型 说明 nodeName String 节点名称,根据节点的类型而定义 nodeValue string 节点的值,同样根据节点的类型而定义 nodeType s ...

  3. SpringBoot入门系列(七)Spring Boot整合Redis缓存

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查,.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/ ...

  4. Spring MVC系列-(2) Bean的装配

    2. Bean的装配 Spring容器负责创建应用程序中的bean,并通过DI来协调对象之间的关系.Spring提供了三种主要的装配机制: XML显式配置: Java配置类进行显式配置: 隐式的bea ...

  5. TCP断开连接(四次挥手)

    四次挥手 ACK建立连接之后都为1. 1.A发送释放连接报文段,FIN=1. 2.B收到并回复确认,TCP进入半关闭状态,即此时B能向A发送,但是A无法向B发送数据. 3.当B传输完所有数据之后,发送 ...

  6. python的C扩展调用,使用原生的python-C-Api

    1.在文件第一行包含python调用扩展的头文件 #include <Python.h> 2.用原生C写好需要调用的函数 int add_one(int a){ ; } 3.用python ...

  7. Natas22 Writeup(header重定向、burp截取抓包)

    Natas22: 打开页面是一个空白页面,查看源码,看起来好像是需要我们在url中添加“revelio”参数即可,然而实验了之后发现浏览器跳转回了原来的页面. 再次仔细审计源码,会看到页面开头有一个重 ...

  8. 小白学 Python 数据分析(20):pyecharts 概述

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  9. VMware Tools失效的处理方案

    VMware Tools是一个实现主机与虚拟机文件分享,具有可支持自由拖拽的功能的工具,如果没有VM tools,那么没有了复制粘贴切换的虚拟机是很不方便的. 长时间未开的虚拟机,一次尝试拖拽Wind ...

  10. 2000字读懂Java的来源

    title: Java的来源 blog: CSDN data: Java学习路线及视频 1.Java市场 截至2020-03: Java的市场份额为17.78% 2. Java语言简介 是SUN(St ...