1. 程式人生 > >python筆記--作用域、高階函數、閉包

python筆記--作用域、高階函數、閉包

作用域、高階函數、閉包

作用域

python中被賦值的變量的位置不同,限制了能訪問到變量的範圍也不同,換句話說就是“變量的作用域是由其在代碼中的位置所決定的”。

1.LEGB規則

L(local):局部作用域,拿兩層嵌套函數來說:內層函數定義的變量,其作用域就是局部作用域,只能由內層函數來使用,優先級最高。只有在調用內層函數時才會調用這種局部變量,所以是暫時存在的。
E(enclosing):嵌套作用域,拿兩層嵌套函數來說:外層函數定義的變量,其作用域就是嵌套作用域。內外層函數都可以使用這種變量,常用於閉包。
G(globle):全局作用域,定義在函數之外的變量,模塊中的函數都可以使用。
B(built-in):內置作用域,系統內置模塊中的變量。

2.函數搜索變量範圍的優先級是:局部作用域>嵌套作用域>全局作用域>內置作用域

簡單舉例說明:

#-*- coding:utf-8 -*-
a=10  #全局作用域
def test1():
    b=20    #嵌套作用域
    def test2():
        c=30    #局部作用域
        return(b-c)
    print(test2())
test1()


高階函數

函數作為參數傳入的函數就是高階函數。簡單舉例說明:

#-*- coding:utf-8 -*-
import sys
def my_print():
    print("this is a test!")
    
def my_confirm(f):
    confirm=input("是否繼續yes/no:")
    if confirm == 'yes':
        f()
    else:
        print("即將退出!")
        sys.exit()

my_confirm(my_print)


閉包

嵌套作用域的變量被內層函數調用就是閉包,簡單舉例說明:

#-*- coding:utf-8 -*-
def size1():
    a=10    #嵌套作用域的變量
    def inner1():
        if a>5:
            print("more!")
        else:
            print("less!")
    return inner1    #指向了inner1函數的內存地址
size1()()

def size2(a=1):     #變量作為外層函數參數傳入
    def inner2():
        if a>5:
            print("more!")
        else:
            print("less!")
    return inner2
size2(20)()





python筆記--作用域、高階函數、閉包