1. 程式人生 > >Python3---函式的作用域,閉包及遞迴

Python3---函式的作用域,閉包及遞迴

一.函式的作用域

全域性變數和區域性變數

定義在函式內部的變數擁有一個區域性作用域,定義在函式外的擁有全域性作用域。

(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

優點:使用遞迴時,常常可以讓程式碼更加簡潔

缺點:遞迴會佔用比較多的記憶體,當遞迴次數比較多時,效能就會降低,因此不建議多使用遞迴