函式補(遞迴,閉包,巢狀)
阿新 • • 發佈:2018-12-21
變數作用域
- Python中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在哪裡賦值的
- Python作用於一共有四種
- L(local)區域性作用域,在函式,類等內部可見
- E(enclosing)閉包函式外的函式中
- G(global)全域性作用域,在整個程式執行環境中都可見
- B(built-in)內建作用域
- 以L—E—G—B的規則查詢
巢狀函式
- 在一個函式中定義了另外一個函式 x = int(2.9) #內建作用域 g_count = 0 #全域性作用域 def outer(): o_count = 1 #閉包函式外的函式中 def inner(): i_count = 2 #區域性作用域 - Python中只有模組(module),類(class)以及函式(def、lambda)才會引進新的作用域 a = 1000 #全域性變數 def func(): a = 500 #區域性變數 a += 100 print(a) func() print(a) #600 1000 - 外部不能訪問內部變數,函式內部能訪問外部變數,變數不宣告函式裡面改不了外部變數
global
- 在編寫程式的時候,如果想為一個在函式外的變數重新賦值,並且這個變數會作用於許多函式中時,此時用global語句就能修改全域性變數
案例1:
a = 1000
def func():
a = 200
print(a)
func()
print(a) #200
1000
案例2:
a = 1000
def func():
global a #宣告變數
a = 200 #此後a已修改為200
print(a)
func()
print(a) #200
200
nonlocal
- nonlocal宣告的變數不是區域性變數,也不是全域性變數,而是外部巢狀函式內的變數 案例1: a = 1000 def func1(): a = 100 def func2(): a = 300 print(a) func2() print(a) func1() #300 100 案例2: a = 1000 def func1(): a = 100 def func2(): nonlocal a a = 300 print(a) func2() print(a) func1() #300 300
閉包
- 函式裡面巢狀一個函式,這個函式用到外面函式中的變數,這些統稱閉包
- 函式裡面再定義一個函式,並且外層函式返回了內層函式體
- 裡層函式用到了外層函式的變數
- 閉包是概念,不是某種函式型別,和遞迴的概念類似,就是一種特殊的函式呼叫
- 閉包可以得到外層函式的區域性變數 ,是函式內部和函式外部溝通的橋樑
def func1(a):
def func2(b):
print("這是func2函式")
return a + b
return func2
a = func1(20)
print(a(30))
遞迴函式
- 遞迴中可以函式自身呼叫自身,但是使用時類似於條件迴圈一樣,要有遞迴的終止條件 - 使用遞迴時,常常可以讓程式碼更加簡潔,但會佔用比較多的記憶體,當遞迴次數比較多時,效能就會降低,因此不建議多使用遞迴 def factorial(n): if n == 1: return 1 else: return n * factorial(n-1) #n*(n-1)*n(n-2)...... res = factorial(1) print(res)