一 函數是第一類對象,即函數能夠看成數據傳遞 1 能夠被引用 2 能夠看成參數傳遞 3 返回值能夠是函數 3 能夠看成容器類型的元素 def foo(): return len f = foo print(foo) [foo, ] 函數嵌套(把大問題細分紅小問題,把小問題平道一塊兒解決) 函數的嵌套定義: 在函數內部又定義了其餘函數 函數的嵌套調用:在一個函數內部又調用其餘函數2.名稱空間與做用域: 什麼是名稱空間? 名稱空間:存放名字的地方,三種名稱空間, (以前遺留的問題x=1,1存放於內存中,那名字x存放在哪裏呢?名稱空間正是存放名字x與1綁定關係的地方) 名稱空間Namespaces:指的就是存放名字與內存地址綁定關係的地方(內存空間) 名稱空間分爲三大類 內置名稱空間: 存放的是python解釋器自帶的名字 產生:python解釋器的啓動則產生 銷燬:python解釋器關閉則銷燬 全局名稱空間: 在頂級定義的名字 產生:執行python程序時產生 銷燬:python程序執行完畢後則銷燬 局部名稱空間: 在函數內定義的名字 產生: 在函數調用時臨時產生 銷燬: 在函數調用完畢後則銷燬 三種名稱空間的產生的前後順序: 內置->全局->局部 查找名字的順序:從當前位置往外一層一層查找 若是當前在局部名稱空間: 局部->全局->內置 若是當前在全局名稱空間: 全局->內置 須要注意的是:在全局沒法查看局部的,在局部能夠查看全局的,以下示例 # max=1 def f1(): # max=2 def f2(): # max=3 print(max) f2() f1() print(max)做用域: #一、做用域即做用範圍 - 全局範圍(內置名稱空間與全局名稱空間屬於該範圍):全局存活,全局有效 - 局部範圍(局部名稱空間屬於該範圍):臨時存活,局部有效 全局做用域:包含內置與全局名稱空間的名字 特色:全局存活,全局有效 局部做用域:包含局部名稱空間的名字 特色:臨時存活,局部有效 #二、!!!!!做用域關係是在函數定義階段就已經固定的,與函數的調用位置無關,以下 x=1 def f1(): def f2(): print(x) return f2 x=100 def f3(func): x=2 func() x=10000 f3(f1()) #三、查看做用域:globals(),locals() locals 是函數內的名字空間,包括局部變量和形參 globals 全局變量,函數定義所在模塊的名字空間global與nonlocal關鍵字 global 適用於函數內部修改全局變量的值 nonlocal 適用於嵌套函數中內部函數修改外部變量的值 若是沒有使用以上關鍵字,對全局變量或者外部變量進行修改,python會默認將全局變量隱藏起來4.閉包函數 = 函數對象 + 函數嵌套定義 + 做用域 閉包函數指的是定義在函數內部的函數, 而且該內部函數包含對外層函數做用域名字的引用 def outter(x): def inner(): print(x) return inner f = outter(10) #閉包的意義:返回的函數對象,不單單是一個函數對象,在該函數外還包裹了一層做用域, 這使得,該函數不管在何處調用,優先使用本身外層包裹的做用域 #應用領域:延遲計算(原來咱們是傳參,如今咱們是包起來) from urllib.request import urlopen def index(url): def get(): return urlopen(url).read() return get baidu=index('http://www.baidu.com') print(baidu().decode('utf-8'))