Python3---函式的作用域,閉包及遞迴
阿新 • • 發佈:2019-01-03
一.函式的作用域
全域性變數和區域性變數
定義在函式內部的變數擁有一個區域性作用域,定義在函式外的擁有全域性作用域。
(1)函式內部的變數,作用域只在函式內部,函式內部不可以直接更改函式外部的變數
(2)函式內部如果需要改變全域性變數,就需要使用global修飾變數
(3)在函式巢狀函式的情況下,同樣也有函式作用域的問題,但是python3中提供了方便,只需要使用nonlocal就可以在裡層函式內部修改外部函式變數
x=1 #全域性變數
def fun():
y=2 #區域性變數
print(x,y)
global關鍵字:
想要在函式裡修改全域性變數,需要使用關鍵字global
x=1 #全域性變數
def fun():
y=2 #區域性變數
global x
x+=1
print(x,y)
fun()
#執行結果:
2 2
想要在函式外訪問函式裡的變數,也需要使用關鍵字global
不加global的時候:
加global的時候:
當函式外變數和函式裡變數同名,且函式裡使用了global關鍵字,優先使用函式裡的變數
#例 a=10 def f1(): global a a+=1 print(a) def f2(): global a a=1 print(a) f1() f2() #執行結果 11 1 #f2中同時存在global a 全域性變數和a = 1這個區域性變數,優先使用f2中自帶的a
nonlocal關鍵字:
如果要修改巢狀作用域(enclosing 作用域,外層非全域性作用域)中的變數則需要 nonlocal 關鍵字了
def fun2(): q=1 #區域性外層 print('區域性外層',q) def fun3(): w=22 nonlocal q # nonlocal關鍵字宣告 q+=1 #區域性裡層 print(q) print('區域性裡層',w) fun3() fun2() #執行結果: 區域性外層 1 2 區域性裡層 22
二.閉包
1.內嵌函式:函式裡又巢狀一個函式
def fun1():
print('fun1()在被呼叫')
def fun2():
print('fun2()在被呼叫')
fun2()
2.閉包
閉包是函式裡面巢狀函式,外層函式返回裡層函式,這種情況稱之為閉包
閉包是概念,不是某種函式型別,和遞迴的概念類似,就是種特殊的函式呼叫
閉包可以得到外層函式的區域性變數,是函式內部和函式外部溝通的橋樑
def fun4(a):
print(a)
def fun5():
print(a,11)
return fun5 #呼叫不執行
a = fun4(3)
a() #相當於 fun4(3)() 呼叫fun5
#執行結果
3
3 11
三.回撥函式
##回撥函式
def fun6():
print('第一個函式')
def fun7(a): #把上一個函式體當成引數
a()
print('第二個函式')
fun7(fun6)
#執行結果:
第一個函式
第二個函式
四.遞迴函式
即自己呼叫自己
遞迴中可以函式自身呼叫自身,但是使用時類似於條件迴圈一樣,要有遞迴的終止條件
#階乘
# 5!=5*4*3*2*1
def factorial(n):
if n==1:
return 1
else:
return factorial(n-1)*n
優點:使用遞迴時,常常可以讓程式碼更加簡潔
缺點:遞迴會佔用比較多的記憶體,當遞迴次數比較多時,效能就會降低,因此不建議多使用遞迴