Python學習:函數進階
阿新 • • 發佈:2017-07-30
eva hide con span money 技術分享 from 內部 size ,在整個文件的任意位置都能被引用、全局有效。
本節要點:命名空間及作用域,函數嵌套,函數名本質,閉包
命名空間:
命名空間的本質:存放名字與值的綁定關系。
三種命名空間:
全局命名空間
局部命名空間
內置命名空間
三種命名空間之間的加載與取值順序:
加載順序:內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)
取值:
在局部調用:局部命名空間->全局命名空間->內置命名空間
在全局調用:全局命名空間->內置命名空間
作用域:
作用域就是作用範圍,按照生效範圍可以分為全局作用域和局部作用域。
全局作用域:包含內置名稱空間、全局名稱空間
局部作用域:局部名稱空間,只能在局部範圍內生效。
globals和locals一個是全局,一個是局部。
函數的嵌套調用:
def max2(x,y): m = x if x>y else y return m def max4(a,b,c,d): res1 = max2(a,b) res2 = max2(res1,c) res3 = max2(res2,d) return res3 # max4(23,-7,31,11)函數的嵌套調用
def f1():函數的嵌套定義(一)print("in f1") def f2(): print("in f2") f2() f1()
def f1(): def f2(): def f3(): print("in f3") print("in f2") f3() print("in f1") f2() f1()函數的嵌套定義(二)
函數的作用域鏈:
def f1(): a = 1 def f2(): print(a) f2() f1()作用域鏈(一)
def f1(): a = 1 def f2(): def f3(): print(a) f3() f2() f1()作用域鏈(二)
def f1(): a = 1 def f2(): a = 2 f2() print(‘a in f1 : ‘,a) f1()作用域鏈(三)
nonlocal關鍵字
# 1.外部必須有這個變量
# 2.在內部函數聲明nonlocal變量之前不能再出現同名變量
# 3.內部修改這個變量如果想在外部有這個變量的第一層函數中生效
def f1(): a = 1 def f2(): nonlocal a a = 2 f2() print(‘a in f1 : ‘,a) f1()nonlocal關鍵字
函數名的本質:
函數名的本質就是存函數的內存地址
1.可以被引用
2.可以被當作容器類型的元素
3.可以當作函數的參數和返回值
小總結:就當變量用就行了。
閉包:
內部函數包含對外部作用域而非全局作用域名字的引用,該內部函數稱為閉包函數。
def func(): name = ‘eva‘ def inner(): print(name) return inner f = func() f()閉包函數常見用法
#輸出的__closure__有cell元素 :是閉包函數 def func(): name = ‘eva‘ def inner(): print(name) print(inner.__closure__) return inner f = func() f() #輸出的__closure__為None :不是閉包函數 name = ‘egon‘ def func2(): def inner(): print(name) print(inner.__closure__) return inner f2 = func2() f2()判斷是否是閉包
def wrapper(): money = 1000 def func(): name = ‘eva‘ def inner(): print(name,money) return inner return func f = wrapper() i = f() i()閉包嵌套
from urllib.request import urlopen def index(): url = "http://www.cnblogs.com/Eva-J/articles/7156261.html" def get(): return urlopen(url).read() return get xiaohua = index() content = xiaohua() print(content)用閉包獲取網頁內容
閉包引出下一課,裝飾器。。。。。。
總結:
略
Python學習:函數進階