1. 程式人生 > >函式補(遞迴,閉包,巢狀)

函式補(遞迴,閉包,巢狀)

變數作用域

- 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)