python的內嵌函式和閉介紹
# **段1
def fun1():
print('外層函式正在被呼叫')
def fun2():
print('內層函式正在被呼叫')
fun1()
'''輸出如下:
外層函式正在被呼叫
'''
# **段2
def fun1():
print('外層函式正在被呼叫')
def fun2():
print('內層函式正在被呼叫')
fun2()
fun1()
'''輸出:
外層函式正在被呼叫
內層函式正在被呼叫
''''''
fun2() # 內嵌函式不能直接被呼叫,否則會報如下錯誤
nameerror: name 'fun2' is not defined
'''
注:①內嵌函式不能再外層函式被呼叫的過程中自動被呼叫
②內部函式不能被外部直接使用,需要通過其外層函式的呼叫發揮作用
# **段3
def funx(x):
def funy(y):
return x * y
return funy # 返回內層函式
print funx(2)(5) # 對閉包的呼叫
'''輸出:
10'''
m = funx(2) # 只對外層函式進行了呼叫
print type(m) # 所以函式的返回型別及m的型別為function
'''輸出:
'''print m(3) # 繼續對內層函式進行呼叫
'''輸出:
6'''
注:能不直接訪問全域性變數盡量不要訪問,如需使用全域性變數可以使用函式進行傳參。
num = 3
def count():
global num
num = 5
print(num)
count()
'''輸出:
5'''
print num
'''輸出:
5'''
因為nonlocal是在python3.x中新增的關鍵字,python2.x不提供支援,
文中提出在python2.x解決巢狀函式引用外部變數的方法只有使用global 關鍵字定義全域性變數,
另一種可行的解決方案是使用列表或字典代替要操作的關鍵字。
1).python3.x 使用nonlocal關鍵字
2).python2.x 借助list或dict實現
# 1).python3.x 使用nonlocal關鍵字
def outer():
x = 1
def inner():
nonlocal x
x = 2
print("inner:", x)
inner()
print("outer:", x)
outer()
'''inner: 2
outer: 2
'''
# 2).python2.x 借助list或dict實現
def outer():
x = [1]
def inner():
x[0] += 1 # 修改x[0]儲存的值
print "inner:", x[0]
inner()
print "outer:", x[0]
outer()
'''inner: 2
outer: 2
'''
# 例子1:
def funx():
x = 5
def funy():
nonlocal x
x += 1
return x
return funy
a = funx()
print(a())
print(a())
print(a())
'''#例子1結果:67
8'''
# 例子2:
def funx():
x = 5
def funy():
nonlocal x
x += 1
return x
return funy
a = funx()
print(a())
a = funx()
print(a())
a = funx()
print(a())
'''#例子2結果:66
6'''
參考: python 內嵌函式和閉包
在函式體內定義函式 定義a 函式 defa print a 函式 定義b 函式 defb print b 函式 呼叫b 函式 b 呼叫a 函式 a 輸出 a 函式 b 函式 定義閉包函式 defa num1 def b num2 return num1 num2 return b 檢視a 函式的返回...
內嵌函式和閉包
1 python裡面定義函式和c裡面一樣,也存在函式的巢狀定義,eg def fun1 x def fun2 y z x y return z return fun2則在函式呼叫的時候需要傳遞2個實參,分別給x,y 且形式為 result fun1 a b 2 由於在python函式定義的時候,出現...
課時20 內嵌函式和閉包
目錄 一 global關鍵字 二 內嵌函式 三 閉包 四 課時20課後習題及答案 一 global關鍵字 全域性變數的作用域是整個模組 整個 段 也就是 段內所有的函式內部都可以訪問到全域性變數。但是要注意一點,在函式內部僅僅去訪問全域性變數就好,不要試圖去修改它。因為那樣的話,python會使用遮...