python基础---面向过程编程
????????????????????????????????????????????????????面向過程編程
? ? ? ?核心是過程二字,過程即解決問題的步驟,基于面向過程去設(shè)計程序就像是在設(shè)計一條工業(yè)流水線,是一種機械式的思維方式
優(yōu)點:程序結(jié)構(gòu)清晰可以把復(fù)雜的問題簡單化,流程化
缺點:可擴展性差,一條流線只是用來解決一個問題
應(yīng)用場景:linux內(nèi)核,git,httpd,shell腳本
練習:過濾目錄下文件內(nèi)容包含error的文件
grep –rl ‘error’ /dir
使用os模塊walk方法:
os.walk會把目錄下的二級目錄和文件做成一個迭代器,多次使用實現(xiàn)文件路徑的拼接
#grep?-rl?'error'?/dir/ import?os def?init(func):def?wrapper(*args,**kwargs):g=func(*args,**kwargs)next(g)return?greturn?wrapper#第一階段:找到所有文件的絕對路徑 @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)#第二階段:打開文件 @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#第四階段:過濾 @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)用一個函數(shù)的過程中,直接或間接地調(diào)用了函數(shù)本身
Python中的遞歸在進行下一次遞歸時必須要保存狀態(tài),效率低,沒有優(yōu)化手段,所以對遞歸層級做了限制(其他編程語言中有尾遞歸方式進行優(yōu)化)
1. 必須有一個明確的結(jié)束條件
2. 每次進入更深一層遞歸時,問題規(guī)模相比上次遞歸都應(yīng)有所減少
3. 遞歸效率不高,遞歸層次過多會導(dǎo)致棧溢出(在計算機中,函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,每當進入一個函數(shù)調(diào)用,棧就會加一層棧幀,每當函數(shù)返回,棧就會減一層棧幀。由于棧的大小不是無限的,所以,遞歸調(diào)用的次數(shù)過多,會導(dǎo)致棧溢出)
尾遞歸優(yōu)化:http://egon09.blog.51cto.com/9161406/1842475
?
如果遞歸層級過多,會報如上錯誤
#間接 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對象時的最大遞歸深度超過了限制修改遞歸層級限制(默認1000)
>>>?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
?
遞歸的執(zhí)行分為兩個階段:
1 遞推
2 回溯
遞歸和循環(huán)功能差不多,但在不知道循環(huán)次數(shù)時適合使用遞歸
練習:
取出列表中所有的元素
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、二分法
方法:
判斷一個數(shù)值是否存在于一個特別大的列表中,如果使用in方法會遍歷列表,占內(nèi)存過多,使用二分法每次會平分列表,占用內(nèi)存較少
?
練習:
#二分法 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基础---面向过程编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在QT搭建的播放器外壳中嵌入SDL的窗口
- 下一篇: Docker容器固定IP分配