一、函數名
? 函數名是?個變量, 但它是?個特殊的變量, 與括號配合可以執?函數的變量。
1. 函數名的內存地址
def func():
print("呵呵")
print(func)
結果:
<function func at 0x1101e4ea0>
2. 函數名可以賦值給其他變量
def func():
print("呵呵")
print(func)
# 把函數當成?個變量賦值給另?個變量
a = func
# 函數調? func()
a()
3. 函數名可以當做函數的參數
def func():
print("吃了么")
def func2(fn):
print("我是func2")
fn()
print("我是func2")
# 把函數func當成參數傳遞給func2的參數fn.
func2(func)
4. 函數名可以作為函數的返回值
def func_1():
print("這?是函數1")
def func_2():
print("這?是函數2")
print("這?是函數1")
return func_2
# 執?函數1. 函數1返回的是函數2, 這時fn指向的就是上?函數2
fn = func_1()
# 執?上?返回的函數
fn()
二、閉包
1. 定義
? 如果在一個內部函數里,對在外部作用于(但不是在全局作用域)的變量進行引用,那么內部函數就被認為是閉包。
? 閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,閉包是由函數和與其相關的引用環境組合而成的實體。
? 通俗的講就是:如果在一個內部函數里,對在外部作用域(但不是在全局作用域)的變量進行引用,那么內部函數就被認為是閉包(closure)。它只不過是個“內層”的函數,由一個名字(變量)來指代,而這個名字(變量)對于“外層”包含它的函數而言,是本地變量。
? 閉包的主要用途:實現裝飾器
2. 閉包運用
閉包函數必須有內嵌函數
內嵌函數需要引用該嵌套函數上一級namespace中的變量
閉包函數必須返回內嵌函數
(1) 普通閉包
def func(a, b):
def line(x):
return a * x - b
return line
line = func(2, 3)
print(line(5))
(2) 修改值閉包
def func(a, b):
def line(x):
nonlocal a
a = 3
return a * x - b
return line
line = func(2, 3)
print(line(5))
轉載自://www.cnblogs.com/hq82/p/11483338.html