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