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


面向过程编程


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


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

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

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


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

grep –rl ‘error’ /dir

使用os模块walk方法:

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

技术分享

#grep-rl‘error‘/dir/importosdefinit(func):defwrapper(*args,**kwargs):g=func(*args,**kwargs)next(g)returngreturnwrapper#第一阶段:找到所有文件的绝对路径@initdefsearch(target):whileTrue:filepath=yieldg=os.walk(filepath)forpardir,_,filesing:forfileinfiles:abspath=r‘%s\%s‘%(pardir,file)target.send(abspath)#第二阶段:打开文件@initdefopener(target):whileTrue:abspath=yieldwithopen(abspath,‘rb‘)asf:target.send((abspath,f))#第三阶段:循环读出每一行内容@initdefcat(target):whileTrue:abspath,f=yield#(abspath,f)forlineinf:res=target.send((abspath,line))ifres:break#第四阶段:过滤@initdefgrep(pattern,target):tag=FalsewhileTrue:abspath,line=yieldtagtag=Falseifpatterninline:target.send(abspath)tag=True#第五阶段:打印该行属于的文件名@initdefprinter():whileTrue:abspath=yieldprint(abspath)g=search(opener(cat(grep(‘error‘.encode(‘utf-8‘),printer()))))g.send(r‘D:\pythonlocation\python36\day05\a‘)

3、递归

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

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

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

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

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

#直接deffunc():print(‘fromfunc‘)func()func()输出:fromfuncfromfunc…fromfuncTraceback(mostrecentcalllast):File"D:/pythonlocation/python36/day05/递归.py",line8,in<module>func()[Previouslinerepeated993moretimes]RecursionError:maximumrecursiondepthexceededwhilecallingaPythonobject#调用Python对象时的最大递归深度超过了限制

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

#间接deffoo():print(‘fromfoo‘)bar()defbar():print(‘frombar‘)foo()foo()输出:RecursionError:maximumrecursiondepthexceededwhilecallingaPythonobject#调用Python对象时的最大递归深度超过了限制


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

>>>importsys>>>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

defage(n):ifn==1:return18returnage(n-1)+2print(age(5))

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

1 递推

2 回溯

技术分享



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


练习:

取出列表中所有的元素

l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15,[16,[17,]],19]]]]]]]#defsearch(l):foriteminl:iftype(item)islist:search(item)else:print(item)search(l)

4、二分法

方法:

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

练习:

#二分法l=[1,2,5,7,10,31,44,47,56,99,102,130,240]defbinary_search(l,num):print(l)#[10,31]iflen(l)>1:mid_index=len(l)//2#1ifnum>l[mid_index]:#intherightl=l[mid_index:]#l=[31]binary_search(l,num)elifnum<l[mid_index]:#intheleftl=l[:mid_index]binary_search(l,num)else:print(‘findit‘)else:ifl[0]==num:print(‘findit‘)else:print(‘notexist‘)returnbinary_search(l,32)


本文出自 “lyndon” 博客,请务必保留此出处http://lyndon.blog.51cto.com/11474010/1953169

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

评论关闭