一、匿名函數
- lambda # 關鍵字 和三目運算一樣,做一些簡單的函數定義,使代碼更加簡潔
- 語法規則:
lambda <參數>:表達式
filter(lambda x: x>10, li)
d = lambda a,b:a+b
d(1,2)
- 應用場景:
1.簡單函數:簡單的函數可以不使用def定義一個函數,使用匿名函數即可
2.函數調用:類似於filter、map等函數里面,可以使用匿名函數來處理
3.提高開放效率:名函數的合理利用能夠讓那個代碼更加簡潔
二、函數作用域
- 函數里面可以訪問函數外面的變量
- 定義在函數里面的變量,函數外面是不能訪問的
- 在函數里面可以訪問最外面的(不可變)變量,但是不能對它修改,但可變類型(list set dict bytearray)就可以修改
- 函數外面定義的變量和函數里面定義的變量重名時,他們不是一個變量。函數里面的變量不影響外面的變量
- global和nonlocal
- global
a = 1 # 全局變量
def yu():
global a # global 關鍵字 聲明a是全局變量,聲明后在函數內部就可以修改這個變量
a = a+519
print(a)
yu()
-nonlocal
def yu():
a = 1 # 局部變量 在嵌套函數的時候會使用
def lo():
nonlocal a # 聲明這個a是局部變量
a = a + 519
print(a)
lo()
yu()
三、閉包
外部調用函數內層的函數:由於作用域的問題,外部不能調用內部的變量,因此需要閉包。
def outside():
print('外層函數')
def inside(): # 函數里面嵌套函數
print(‘內層函數’)
return inside # 返還的是內層的函數名,是個變量,通過 函數名后面加()實現這個內層函數的調用。
a = outside() # 這里a的值為 inside 的函數名
a() # 也可以是 outside()() 實現了直接調用內層函數。
注意:
1. 函數的名字就相當於一個變量
2. 閉包可以得到外層函數的局部變量(通過return內層的函數名實現),是函數內部與外部溝通的橋梁。
四、遞歸和回調函數
- 遞歸:
def sleep(a):
if a == 5:
return 1
print('睡了+%s'%a)
return sleep(a+1)+a
print(sleep(0)) # 輸出結果為11 :0+1+2+3+4+1 和 第一個print()的內容。
- 階乘:把上例子的return中的 +a 變為*a,即可實現階乘
return sleep(a+1)*a
print(sleep(1)) # 輸出的數值結果變為24:1*2*3*4*1
遞歸的關鍵點:是通過返回函數調用來實現的,注意要加判斷條件終止函數調用,否則就是死循環。
- 回調:
回調函數本身是一個函數,只是被傳入另一個函數當中,供其調用。回調函數不一定會被調用,是否調用由被傳入函數的內部邏輯決定。
def fun_a():
print('回調函數,快來調用我')
def fun_b(fun):
fun() # 之前可加判斷條件,來實現是否啟用回調函數。
print('我自己的功能')
fun_b(fun_a)
