python全棧開發-Day9 函數對象、函數嵌套、名稱空間與範圍,python-day9

來源:互聯網
上載者:User

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()

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.