Python函数之面向过程编程

一、解释

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

二、优缺点

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

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

应用场景: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())))

原文地址:https://www.cnblogs.com/yinxin/p/8451835.html

时间: 2024-10-05 11:44:46

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

第五章---面向过程编程

编程范式(流派): 面向对象编程,面向过程编程 各有用处!! 编程:语法+数据结构(list dict)+算法(逻辑) 1.面向过程编程:核心是过程二字,过程指得是解决问题的步骤,相当于设计一条流水线,机械式的思维方式 优点:复杂的问题流程化,进而简单化       缺点:可扩展性差       运用场景:系统监控脚本,自动部署脚本之类的,eg:软件包解压安装(不再需要扩展了)就可以使用面向过程的思维编写代码 1 ''' 2 面向过程实例:用户登录注册 3 第一步:用户输入用户名密码 4 第二步

Python 面向过程编程

一.解释 面向过程:核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计,流水线式的编程思想,在设计程序时,需要把整个流程设计出来, 一条工业流水线,是一种机械式的思维方式 二.优缺点 优点:程序体系结构清晰,可以把复杂的问题简单化,流程化 缺点:可扩展性差,一条流线只是用来解决一个问题,所以说面向过程的应用多为不需要经常变化的软件 应用场景:linux内核,git,httpd,shell脚本 三.实例(利用协程函数进行面向过程编程) 过滤一个文件下的子文件.字文件夹的内容中

python学习第四节 迭代器 生成器 面向过程编程

1:什么是迭代 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. 对迭代器来讲,有一个__next()就够了.在你使用for 和 in 语句时,程序就会自动调用即将被处理的对象的迭代器对象,然后使用它的next__()方法,直到监测到一个StopIteration异常. >>> L = [1,2,3]>

Python面向过程编程

目录 面向过程编程 面向过程编程 "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想.这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响.与面向对象明显的不同就是封装.继承.类. 在python中就一句花,可以流水线的编程,调用返回值 面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法.它考虑的是实际地实现.一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想

python基础---面向过程编程

面向过程编程 核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计一条工业流水线,是一种机械式的思维方式 优点:程序结构清晰可以把复杂的问题简单化,流程化 缺点:可扩展性差,一条流线只是用来解决一个问题 应用场景:linux内核,git,httpd,shell脚本 练习:过滤目录下文件内容包含error的文件 grep –rl 'error' /dir 使用os模块walk方法: os.walk会把目录下的二级目录和文件做成一个迭代器,多次使用实现文件路径的拼接 #grep 

函数递归及面向过程编程

函数递归及面向过程编程 一.函数递归 1.1什么是递归 递归就是函数调用函数本身,然后有结束条件. 一般解决无法求解但不断靠近的值,比如利用二分法找具体的数字,汉诺塔等 让我们举个栗子,比如要实现0-99的和,用while循环为: num = 0 count = 0 while count<100: print(count) count += 1 num +=count print(num) 接下来我们用递归函数对他进行一个实现 count = 0 def f1(): global count

python 3 面向过程编程

python 3 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就像设计好一条工业流水线,是一种机械式的思维方式. 1.优点:程序结构清晰,可以把复杂的问题简单化,流程化. 2.缺点:可扩展性差,改动一个地方很可能要改多个地方,牵一发而动全身. 3.应用场景:linux内核,git,httpd,shell脚本. grep -rl 'error' /dir/ def init(func): def wrapper(*args,**kwargs): g=func(*a

迭代器、生成器、面向过程编程

一 迭代器 1.迭代的概念 #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭代 print('===>') l=[1,2,3] count=0 while count < len(l): #迭代 print(l[count]) count+=1 2.为何要有迭代器?什么是可迭代对象?什么是迭代器对象? #1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但

Python 面向对象和面向过程对比

# 大象装冰箱 # 脚本, 此时代码是最简单的. 不需要构思整个程序的概况 print("开门") print("装大象") print("关门") # 函数式编程. 比脚本麻烦. 对功能有了概况. def kai(): print('开门') def zhuang(): print("装大象") def guan(): print('关门') kai() zhuang() guan() # 面向对象编程, 对整个系统进行分析