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

简介:

           面向过程编程


       核心是过程二字,过程即解决问题的步骤,基于面向过程去设计程序就像是在设计一条工业流水线,是一种机械式的思维方式


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

缺点:可扩展性差,一条流线只是用来解决一个问题

应用场景:linux内核,githttpdshell脚本


练习:过滤目录下文件内容包含error的文件

grep –rl ‘error’ /dir

使用os模块walk方法:

os.walk会把目录下的二级目录和文件做成一个迭代器,多次使用实现文件路径的拼接

wKiom1mCAsCj8FMCAAFWif5hlXI802.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#grep -rl 'error' /dir/
import  os
def  init(func):
     def  wrapper( * args, * * kwargs):
         g = func( * args, * * kwargs)
         next (g)
         return  g
     return  wrapper
 
#第一阶段:找到所有文件的绝对路径
@init
def  search(target):
     while  True :
         filepath = yield
         g = os.walk(filepath)
         for  pardir,_,files  in  g:
             for  file  in  files:
                 abspath = r '%s\%s'  % (pardir, file )
                 target.send(abspath)
 
#第二阶段:打开文件
@init
def  opener(target):
     while  True :
         abspath = yield
         with  open (abspath, 'rb' ) as f:
             target.send((abspath,f))
 
#第三阶段:循环读出每一行内容
@init
def  cat(target):
     while  True :
         abspath,f = yield  #(abspath,f)
         for  line  in  f:
             res = target.send((abspath,line))
             if  res: break
 
#第四阶段:过滤
@init
def  grep(pattern,target):
     tag = False
     while  True :
         abspath,line = yield  tag
         tag = False
         if  pattern  in  line:
             target.send(abspath)
             tag = True
 
#第五阶段:打印该行属于的文件名
@init
def  printer():
     while  True :
         abspath = yield
         print (abspath)
 
=  search(opener(cat(grep( 'error' .encode( 'utf-8' ), printer()))))
g.send(r 'D:\python location\python36\day05\a' )

 

3、递归

递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身

Python中的递归在进行下一次递归时必须要保存状态,效率低,没有优化手段,所以对递归层级做了限制(其他编程语言中有尾递归方式进行优化)

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#直接
def  func():
     print ( 'from func' )
     func()
 
func() 
输出:
from  func
from  func
from  funcTraceback (most recent call last):
   File  "D:/python location/python36/day05/递归.py" , line  8 in  <module>
     func()
   [Previous line repeated  993  more times]
RecursionError: maximum recursion depth exceeded  while  calling a Python  object               #调用Python对象时的最大递归深度超过了限制

 

如果递归层级过多,会报如上错误

1
2
3
4
5
6
7
8
9
10
11
12
#间接
def  foo():
     print ( 'from foo' )
     bar()
 
def  bar():
     print ( 'from bar' )
     foo()
 
foo() 
输出:
RecursionError: maximum recursion depth exceeded  while  calling a Python  object               #调用Python对象时的最大递归深度超过了限制


修改递归层级限制(默认1000

1
2
3
4
5
6
>>>  import  sys
>>> sys.getrecursionlimit()
1000
>>> sys.setrecursionlimit( 2000 )
>>> sys.getrecursionlimit()
2000


练习:

已知:

age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=18

首先做判断:

age(n)=age(n-1)+2        #n>1
age(1)=18               #n=1

1
2
3
4
5
6
def  age(n):
     if  = =  1 :
         return  18
     return  age(n - 1 ) + 2
 
print (age( 5 ))

 

递归的执行分为两个阶段:

递推

回溯

wKioL1mCA-azEeaZAABbE7nPVcM799.png



递归和循环功能差不多,但在不知道循环次数时适合使用递归


练习:

取出列表中所有的元素

1
2
3
4
5
6
7
8
9
10
= [ 1 2 , [ 3 , [ 4 5 6 , [ 7 8 , [ 9 10 , [ 11 12 13 , [ 14 , 15 ,[ 16 ,[ 17 ,]], 19 ]]]]]]]              #
 
def  search(l):
     for  item  in  l:
         if  type (item)  is  list :
             search(item)
         else :
             print (item)
 
search(l)

 

4、二分法

方法:

判断一个数值是否存在于一个特别大的列表中,如果使用in方法会遍历列表,占内存过多,使用二分法每次会平分列表,占用内存较少

 

练习:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#二分法
=  [ 1 , 2 , 5 , 7 , 10 , 31 , 44 , 47 , 56 , 99 , 102 , 130 , 240 ]
 
 
def  binary_search(l,num):
     print (l)  #[10, 31]
     if  len (l) >  1 :
         mid_index = len (l) / / 2  #1
         if  num > l[mid_index]:
             #in the right
             l = l[mid_index:]  #l=[31]
             binary_search(l,num)
         elif  num < l[mid_index]:
             #in the left
             l = l[:mid_index]
             binary_search(l,num)
         else :
             print ( 'find it' )
     else :
         if  l[ 0 = =  num:
             print ( 'find it' )
         else :
             print ( 'not exist' )
         return
 
binary_search(l, 32 )

本文转自lyndon博客51CTO博客,原文链接http://blog.51cto.com/lyndon/1953169如需转载请自行联系原作者

迟到的栋子

相关文章
|
7天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
7天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
11天前
|
缓存 监控 Python
解密Python中的装饰器:优雅而强大的编程利器
Python中的装饰器是一种强大而又优雅的编程工具,它能够在不改变原有代码结构的情况下,为函数或类添加新的功能和行为。本文将深入解析Python装饰器的原理、用法和实际应用,帮助读者更好地理解和利用这一技术,提升代码的可维护性和可扩展性。
|
28天前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
157 0
|
1天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
8 0
|
2天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
22 0
|
21天前
|
程序员 C语言 Python
Python列表推导式:简洁与高效的编程利器
在Python编程中,列表推导式(List Comprehension)是一种强大且优雅的工具,它允许我们以简洁的方式创建新的列表。列表推导式在Python程序员中广受欢迎,因为它能够将复杂的循环和条件语句简化为一行代码,提高代码的可读性和执行效率。
|
28天前
|
Java 编译器 Shell
【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)
【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)
43 0
|
28天前
|
缓存 分布式计算 自然语言处理
Python语言的函数编程模块
Python语言的函数编程模块
|
30天前
|
存储 JavaScript 编译器
这款国产中文编程火了!通过文言文编译生成Python、JS、Ruby代码!
这款国产中文编程火了!通过文言文编译生成Python、JS、Ruby代码!

热门文章

最新文章