函数进阶
命名空間一共分為三種:
全局命名空間
局部命名空間
內(nèi)置命名空間
*內(nèi)置命名空間中存放了python解釋器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過(guò)來(lái)就可以用的方法。
三種命名空間之間的加載與取值順序:
加載順序:內(nèi)置命名空間(程序運(yùn)行前加載)->全局命名空間(程序運(yùn)行中:從上到下加載)->局部命名空間(程序運(yùn)行中:調(diào)用時(shí)才加載)
取值:
在局部調(diào)用:局部命名空間->全局命名空間->內(nèi)置命名空間
x = 1 def f(x):print(x)print(10)在全局調(diào)用:全局命名空間->內(nèi)置命名空間
x = 1 def f(x):print(x)f(10) print(x) print(max)?
?
作用域
作用域就是作用范圍,按照生效范圍可以分為全局作用域和局部作用域。
全局作用域:包含內(nèi)置名稱空間、全局名稱空間,在整個(gè)文件的任意位置都能被引用、全局有效
局部作用域:局部名稱空間,只能在局部范圍內(nèi)生效
globals和locals方法
print(globals()) print(locals()) def func():a = 12b = 20print(locals())print(globals()) func()global關(guān)鍵字
函數(shù)的嵌套和作用域鏈
函數(shù)的嵌套調(diào)用
函數(shù)的嵌套定義
?
def f1():a = 1def f2():a = 2f2()print('a in f1 : ',a)f1()?
a in f1 : 1nonlocal關(guān)鍵字
# 1.外部必須有這個(gè)變量# 2.在內(nèi)部函數(shù)聲明nonlocal變量之前不能再出現(xiàn)同名變量
# 3.內(nèi)部修改這個(gè)變量如果想在外部有這個(gè)變量的第一層函數(shù)中生效
?
def f1():a = 1def f2():nonlocal aa = 2f2()print('a in f1 : ',a)f1()?
函數(shù)名的本質(zhì)
函數(shù)名本質(zhì)上就是函數(shù)的內(nèi)存地址
?
1.可以被引用
?
def func():print('in func') f = func print(f)?
2.可以被當(dāng)作容器類型的元素
def f1():print('f1') def f2(): print('f2') def f3(): print('f3') l = [f1,f2,f3] d = {'f1':f1,'f2':f2,'f3':f3} #調(diào)用 l[0]() d['f2']()
閉包
def func():name = 'eva'def inner(): print(name)閉包函數(shù):
內(nèi)部函數(shù)包含對(duì)外部作用域而非全劇作用域名字的引用,該內(nèi)部函數(shù)稱為閉包函數(shù)#函數(shù)內(nèi)部定義的函數(shù)稱為內(nèi)部函數(shù)
由于有了作用域的關(guān)系,我們就不能拿到函數(shù)內(nèi)部的變量和函數(shù)了。如果我們就是想拿怎么辦呢?返回呀!
我們都知道函數(shù)內(nèi)的變量我們要想在函數(shù)外部用,可以直接返回這個(gè)變量,那么如果我們想在函數(shù)外部調(diào)用函數(shù)內(nèi)部的函數(shù)呢?
是不是直接就把這個(gè)函數(shù)的名字返回就好了?
這才是閉包函數(shù)最常用的用法
def func():name = 'eva'def inner(): print(name) return inner f = func() f()判斷閉包函數(shù)的方法__closure__
#輸出的__closure__有cell元素 :是閉包函數(shù) def func():name = 'eva' def inner(): print(name) print(inner.__closure__) return inner f = func() f() #輸出的__closure__為None :不是閉包函數(shù) name = 'egon' def func2(): def inner(): print(name) print(inner.__closure__) return inner f2 = func2() f2() def wrapper():money = 1000def func():name = 'eva' def inner(): print(name,money) return inner return func f = wrapper() i = f() i()轉(zhuǎn)載于:https://www.cnblogs.com/limengishero/p/10007091.html
總結(jié)
- 上一篇: 京东云擎提供了免费的wordpress一
- 下一篇: 几个数字的和