入門與進階:掌握了之前學(xué)的(枚舉之前)基礎(chǔ)的語法,就可以完成一般的應(yīng)用程序了牧抽。
靠基礎(chǔ)語法可以寫出代碼嘉熊,帶不能寫出優(yōu)質(zhì)的、可維護的代碼扬舒。
這包括開發(fā)包或者類庫阐肤,需要提供給別人用,才需要考慮封裝性讲坎。
開發(fā)包或者類庫孕惜,也是基于開發(fā)了很多業(yè)務(wù)邏輯相同的程序之后,有實際需要才有的晨炕。
一衫画、一切皆對象
- 函數(shù)式編程:當(dāng)自己認為寫的代碼別扭,繁瑣時嘗試使用函數(shù)式編程瓮栗。
- 閉包:閉包和函數(shù)關(guān)系很大削罩。
函數(shù):只是一段可執(zhí)行的代碼,并不是對象费奸。
python中一切皆對象弥激,函數(shù)也是對象。
python中的函數(shù)不僅可以賦值給變量货邓,還可以作為另外一個函數(shù)的參數(shù)傳遞秆撮,也可以作為另外一個函數(shù)的返回結(jié)果。
二换况、閉包
- Python在函數(shù)內(nèi)部還可以定義函數(shù)职辨,但該函數(shù)的作用域只在外部函數(shù)的內(nèi)部有效盗蟆,除非作為外部函數(shù)的返回值被返回,在外部函數(shù)的外部用一個變量接收后就可以調(diào)用它了舒裤。
- 閉包定義:由函數(shù)及其在定義時外部的環(huán)境變量(不能是全局變量)構(gòu)成的整體喳资。
閉包 = 函數(shù) + 環(huán)境變量(函數(shù)定義時)
- 如圖,可以通過函數(shù)的內(nèi)置變量 __ closure __ 來訪問函數(shù)的環(huán)境變量
閉包的意義在于保存了一個環(huán)境腾供。
尤其是函數(shù)調(diào)用函數(shù)時仆邓,如果沒有閉包,很容易被外部變量所影響伴鳖。
閉包必須滿足兩個條件:
- 函數(shù)嵌套函數(shù)
內(nèi)部函數(shù)需要引用父類函數(shù)的變量
def f1():
a = 10
def f2():
a = 20 # 這時的a被python認為是局部變量节值,局部變量是不可能影響外部的變量
print(a)
print(a)
f2()
print(a)
f1()
輸出結(jié)果:此時的f1() 并不是閉包函數(shù)。因為內(nèi)部函數(shù)有局部變量榜聂,并沒有引用外部函數(shù)的變量搞疗。
10
20
10
三、旅行者行走的問題
(一)非閉包的方式解決問題
ps:
一個容易犯的關(guān)于變量認識上的錯誤
origin = 0
def go(step):
new_pos = origin + step
origin = new_pos
return origin
此時會報錯說origin在函數(shù)內(nèi)未被定義
而把origin = new_pos去掉之后則不會報錯须肆。
關(guān)于兩者的不同匿乃,在一般情況下,根據(jù)變量的作用域鏈豌汇,origin在函數(shù)內(nèi)未被定義時會去找上一級的同名變量幢炸。
但是一旦在函數(shù)內(nèi)origin出現(xiàn)了賦值語句的左側(cè),則會被認為是函數(shù)內(nèi)被定義拒贱,
成為了一個局部變量宛徊,不會再去尋找上一級。結(jié)果執(zhí)行語句時就報錯了柜思。
ps: global