python基础---面向过程编程
????????????????????????????????????????????????????面向過(guò)程編程
? ? ? ?核心是過(guò)程二字,過(guò)程即解決問(wèn)題的步驟,基于面向過(guò)程去設(shè)計(jì)程序就像是在設(shè)計(jì)一條工業(yè)流水線,是一種機(jī)械式的思維方式
優(yōu)點(diǎn):程序結(jié)構(gòu)清晰可以把復(fù)雜的問(wèn)題簡(jiǎn)單化,流程化
缺點(diǎn):可擴(kuò)展性差,一條流線只是用來(lái)解決一個(gè)問(wèn)題
應(yīng)用場(chǎng)景:linux內(nèi)核,git,httpd,shell腳本
練習(xí):過(guò)濾目錄下文件內(nèi)容包含error的文件
grep –rl ‘error’ /dir
使用os模塊walk方法:
os.walk會(huì)把目錄下的二級(jí)目錄和文件做成一個(gè)迭代器,多次使用實(shí)現(xiàn)文件路徑的拼接
#grep?-rl?'error'?/dir/ import?os def?init(func):def?wrapper(*args,**kwargs):g=func(*args,**kwargs)next(g)return?greturn?wrapper#第一階段:找到所有文件的絕對(duì)路徑 @init def?search(target):while?True:filepath=yieldg=os.walk(filepath)for?pardir,_,files?in?g:for?file?in?files:abspath=r'%s\%s'?%(pardir,file)target.send(abspath)#第二階段:打開(kāi)文件 @init def?opener(target):while?True:abspath=yieldwith?open(abspath,'rb')?as?f:target.send((abspath,f))#第三階段:循環(huán)讀出每一行內(nèi)容 @init def?cat(target):while?True:abspath,f=yield?#(abspath,f)for?line?in?f:res=target.send((abspath,line))if?res:break#第四階段:過(guò)濾 @init def?grep(pattern,target):tag=Falsewhile?True:abspath,line=yield?tagtag=Falseif?pattern?in?line:target.send(abspath)tag=True#第五階段:打印該行屬于的文件名 @init def?printer():while?True:abspath=yieldprint(abspath)g?=?search(opener(cat(grep('error'.encode('utf-8'),?printer())))) g.send(r'D:\python?location\python36\day05\a')?
3、遞歸
遞歸調(diào)用:在調(diào)用一個(gè)函數(shù)的過(guò)程中,直接或間接地調(diào)用了函數(shù)本身
Python中的遞歸在進(jìn)行下一次遞歸時(shí)必須要保存狀態(tài),效率低,沒(méi)有優(yōu)化手段,所以對(duì)遞歸層級(jí)做了限制(其他編程語(yǔ)言中有尾遞歸方式進(jìn)行優(yōu)化)
1. 必須有一個(gè)明確的結(jié)束條件
2. 每次進(jìn)入更深一層遞歸時(shí),問(wèn)題規(guī)模相比上次遞歸都應(yīng)有所減少
3. 遞歸效率不高,遞歸層次過(guò)多會(huì)導(dǎo)致棧溢出(在計(jì)算機(jī)中,函數(shù)調(diào)用是通過(guò)棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回,棧就會(huì)減一層棧幀。由于棧的大小不是無(wú)限的,所以,遞歸調(diào)用的次數(shù)過(guò)多,會(huì)導(dǎo)致棧溢出)
尾遞歸優(yōu)化:http://egon09.blog.51cto.com/9161406/1842475
?
如果遞歸層級(jí)過(guò)多,會(huì)報(bào)如上錯(cuò)誤
#間接 def?foo():print('from?foo')bar()def?bar():print('from?bar')foo()foo()? 輸出: RecursionError:?maximum?recursion?depth?exceeded?while?calling?a?Python?object??????????????#調(diào)用Python對(duì)象時(shí)的最大遞歸深度超過(guò)了限制修改遞歸層級(jí)限制(默認(rèn)1000)
>>>?import?sys >>>?sys.getrecursionlimit() 1000 >>>?sys.setrecursionlimit(2000) >>>?sys.getrecursionlimit() 2000練習(xí):
已知:
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
?
遞歸的執(zhí)行分為兩個(gè)階段:
1 遞推
2 回溯
遞歸和循環(huán)功能差不多,但在不知道循環(huán)次數(shù)時(shí)適合使用遞歸
練習(xí):
取出列表中所有的元素
l?=[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、二分法
方法:
判斷一個(gè)數(shù)值是否存在于一個(gè)特別大的列表中,如果使用in方法會(huì)遍歷列表,占內(nèi)存過(guò)多,使用二分法每次會(huì)平分列表,占用內(nèi)存較少
?
練習(xí):
#二分法 l?=?[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?#1if?num?>?l[mid_index]:#in?the?rightl=l[mid_index:]?#l=[31]binary_search(l,num)elif?num?<?l[mid_index]:#in?the?leftl=l[:mid_index]binary_search(l,num)else:print('find?it')else:if?l[0]?==?num:print('find?it')else:print('not?exist')returnbinary_search(l,32)轉(zhuǎn)載于:https://blog.51cto.com/lyndon/1953169
總結(jié)
以上是生活随笔為你收集整理的python基础---面向过程编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在QT搭建的播放器外壳中嵌入SDL的窗口
- 下一篇: Docker容器固定IP分配