1. 程式人生 > >Python學習:函數進階

Python學習:函數進階

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學習:函數進階