python筆記--作用域、高階函數、閉包
阿新 • • 發佈:2018-04-18
作用域、高階函數、閉包作用域
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筆記--作用域、高階函數、閉包