python全棧開發-Day9 函數對象、函數嵌套、名稱空間與範圍,python-day9
一 、函數對象
一 、函數是第一類對象,即函數可以當作資料傳遞
1 可以被引用2 可以當作參數傳遞3 傳回值可以是函數4 可以當作容器類型的元素
二、 利用該特性,優雅的取代多分支的if
1 def foo(): 2 print('foo') 3 4 def bar(): 5 print('bar') 6 7 dic={ 8 'foo':foo, #foo是記憶體位址 9 'bar':bar, #bar是記憶體位址10 }11 while True:12 choice=input('>>: ').strip()13 if choice in dic:14 dic[choice]() 二 、函數嵌套
一 、函數的嵌套調用
在函數內又調用了其他函數
1 def max(x,y):2 return x if x > y else y3 4 def max4(a,b,c,d):5 res1=max(a,b)6 res2=max(res1,c)7 res3=max(res2,d)8 return res39 print(max4(1,2,3,4))
二 、函數的嵌套定義
在函數內又定義其他函數
1 def f1():2 def f2():3 def f3():4 print('from f3')5 f3()6 f2()7 8 f1()9 f3() #報錯,外部無法調用,可以考慮如何在外面使用函數裡面的功能三 、名稱空間與範圍
一 、什麼是名稱空間?
名稱空間:存放名字的地方,三種名稱空間,(之前遺留的問題x=1,1存放於記憶體中,那名字x存放在哪裡呢?名稱空間正是存放名字x與1綁定關係的地方)
二、名稱空間的分類
#1、內建名稱空間:#存放python解譯器內建的名字,在解譯器啟動時就生效,解譯器關閉就失效.#2、全域名稱空間:#檔案層級的名字,在執行檔案的時候生效,在檔案結束或者檔案執行期間被刪除則失效#3、局部名稱空間:#在函數內定義的名字,(函數的參數以及函數內的名字都存放與局部名稱空間),在函數調用時臨時生效,函數結束則失效
三 、名稱空間的載入順序(內建>全域>局部)
python test.py#1、python解譯器先啟動,因而首先載入的是:內建名稱空間#2、執行test.py檔案,然後以檔案為基礎,載入全域名稱空間#3、在執行檔案的過程中如果調用函數,則臨時產生局部名稱空間
四 、名字的尋找順序 (局部>全域>內建)
#局部名稱空間--->全域名稱空間--->內建名稱空間#需要注意的是:在全域無法查看局部的,在局部可以查看全域的,如下樣本# max=1def f1(): # max=2 def f2(): # max=3 print(max) f2()f1()print(max)
五 、範圍
#1、範圍 #全域範圍(包含的是內建名稱空間與全域名稱空間的名字): #特點: #1、在任何位置都能夠訪問的到 #2、該範圍內的名字會伴隨程式整個生命週期 #(全域存活,全域有效) # 局部範圍(局部名稱空間的名字): #特點: #1、只能在函數內使用 #2、調用函數時生效,調用結束失效 #(臨時存活,局部有效)#2、範圍關係是在函數定義階段就已經固定的,與函數的調用位置無關,如下x=1def f1(): def f2(): print(x) return f2x=100def f3(func): x=2 func()x=10000f3(f1())#3、查看範圍:globals(),locals()LEGB 代表名字尋找順序: locals -> enclosing function -> globals -> __builtins__locals 是函數內的名字空間,包括局部變數和形參enclosing 外部嵌套函數的名字空間(閉包中常見)globals 全域變數,函數定義所在模組的名字空間builtins 內建模組的名字空間
四、 閉包函數
一、 什麼是閉包?
#定義在函數內部的函數,並且該函數包含對外部函數範圍中名字的引用該函數就是閉包函數#提示:之前我們都是通過參數將外部的值傳給函數,閉包提供了另外一種思路,包起來嘍,包起呦,包起來哇def outter(): x=2 def inner(): # x=1 print("from inner",x) return innerf =outter()f() #x值為2
二 、閉包的意義與應用
#閉包的意義:返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層範圍,這使得,該函數無論在何處調用,優先使用自己外層包裹的範圍#應用領域:“爬蟲“(原來我們是傳參,現在我們是包起來)import requests def outter(url): #url='https://www.baidu.com' def get(): response=requests.get(url) if response.status_code == 200: print(response.text) return getbaidu=outter('https://www.baidu.com')python=outter('https://www.python.org')baidu() python()