python全棧闖關--10-二、函數的嵌套和做用域

一、全局做用域函數嵌套

def three_max(a, b, c):
    t = two_max(a, b)  # 函數嵌套調用two_max
    return t if t > c else c
def two_max(a, b):
    return a if a > b else b
print(three_max(1, 2, 3))

程序執行,按照從下往下的順序,把變量、函數名加入到命名空間,若是還未加入到命名空間,就調用了函數,將會報錯。函數

如上程序,若是把three_max的調用,交換到two_max的前面,將會報錯:NameError: name 'two_max' is not definedspa

def three_max(a, b, c):
    t = two_max(a, b)  # 函數嵌套調用two_max
    return t if t > c else c
print(three_max(1, 2, 3))  # NameError: name 'two_max' is not defined
def two_max(a, b):
    return a if a > b else b

 

二、內部函數使用外部函數

a = 1
def outer():
    a = 1
    def inner():
        a = 2
        def inner2():
            a = 3
            print("inner2:", a)  # 3
        inner2()
        print("inner:", a)  # 2
    inner()
    print("outer:", a)  # 1
outer()
print(a)

嵌套定義時,每一個局部都有本身的命名空間,互相不干擾code

子函數定義了和父函數相同的變量,其值都爲獨立的,修改不影響父函數blog

 global

a = 1
def outer():
    a = 1
    def inner():
        a = 2
        def inner2():
            global a  # 修改的是全局的變量數據
            a = 3
            print("inner2:", a)  # 3
        inner2()
        print("inner:", a)  # 2
    inner()
    print("outer:", a)  # 1
outer()
print(a) # 3

global定義的變量,是全局命名空間的變量three

不影響局部的變量內存

nonlocal

a = 1
def outer():
    # nonlocal a  # 只能對局部做用域變量有效,在最後一個局部報錯SyntaxError: no binding for nonlocal 'a' found
    a = 1
    def inner():
        # nonlocal a
        a = 2
        def inner2():
            nonlocal a
            a = 3
            print("inner2:",a)  # 3
        inner2()
        print("inner:", a)  # 3 nonlocal找到上一層的變量進行了更改
    inner()
    print("outer:", a)  # 1
outer()
print(a)  # 定義nonlocal後,全局變量不變依然爲1

nonlocal尋找離當前函數最近的一層局部變量作用域

聲明瞭nonlocal的局部變量的改動,會影響最近一層的函數的局部變量class

 

三、函數名總結

一、函數名就是函數的內存地址,能夠直接賦值;容器

二、函數名能夠做爲容器的元素;變量

三、函數名能夠做爲參數;

四、函數名能夠做爲返回值;

def func():
    print(123)

# 函數名就是函數地址,能夠直接賦值
f1 = func
f1()

# 函數名能夠作爲容器的元素
l = [func, f1]
for i in l:
    i()

# 函數名能夠做爲參數
# 函數名能夠做爲返回值

def func2(f):
    f()
    return f  # 函數名做爲返回值

f2 = func2(func)  # 函數名做爲參數
f2()
相關文章
相關標籤/搜索