一、匿名函式
1. 匿名函式
python中除了用def關鍵字來宣告函式之外,還有用lambda宣告函式,這樣的函式叫做匿名函式。
2. 簡單函式轉為匿名函式
匿名函式語法: lambda 引數:表示式
#0引數#簡單函式可以用匿名函式
deftest():return "hello world"a=test()print(a) # hello world#匿名函式語法: lambda 引數:表示式
test = lambda: "hello world"b=test()print(b) # hello world
#傳入引數
deftest2(num1, num2):return num1+num2
res= test2(1, 2)print(res) #3
# 匿名函式
test2 = lambda num1, num2: num1+num2
res = test2(1, 2)
print(res) # 3
3.過濾器與匿名函式的結合
#過濾器filter(func, 可迭代物件)
li = [12, 63, 78, 90, 2, 45, 23]deftest3(x):return x > 50res=filter(test3, li)print(res) #
print(list(res)) #[63, 78, 90]
#轉成匿名函式
res = filter(lambda x: x > 50, li)print(res) #
print(list(res)) #[63, 78, 90]
4.匿名函式作為引數傳入函式中的使用
當我們做乙個簡單的運算的時候,可以直接用匿名函式
test = lambda num1, num2: num2 +num1print(test(1, 2)) #3
雖然這個函式可以達到運算加法的目的,但是有缺點:適應性不強,只能做到加法的運算
我們可以通過一步步改造完善這個運算,可以做個簡單的計算器
deftest4(a, b, func):
res=func(a, b)returnres#將lambda匿名函式作為引數傳入,較之前靈活了,適應性加強了
num = test4(4, 5, lambda a, b: a *b)print(num) #20
當我們把匿名函式作為引數,傳入到函式的呼叫的時候,可以通過改變引數func,進行加減乘除的運算,但是這樣傳入的引數實用性還是不是很強,將func用input,那麼就更加方便了
#實現匿名函式的輸入,這樣更加靈活了,且適應性更強了
func = input("請輸入乙個匿名函式:")
func=eval(func)deftest4(a, b, func):
res=func(a, b)returnres
res4= test4(23, 87, func)print(res4)
以上這段**實用性更加強了,但是還是存在缺陷,run一次只能計算一次,沒辦法連續使用,這樣我們用死迴圈就可以解決這個問題
whiletrue:
flag= input("退出請按[y/q]:")if flag != "q" and flag != "y":
func= eval(input("請輸入乙個匿名函式:"))
num1= int(input("請輸入num1:"))
num2= int(input("請輸入num2:"))deftest5(num1, num2, func):returnfunc(num1, num2)
res=test4(num1, num2, func)print(res)else:break
二、函式的作用域
1.定義的變數所能作用的範圍
2. 全域性變數 函式外部定義的變數是全域性變數
a = "hello world" #全域性變數
deftest():
a= "hello" #區域性變數
print("1:", a)print("2:", a) #2: hello world
test() #1: hello 1在2後面是因為,test函式是在2後面呼叫的
print("3:", a) #3: hello world#在函式外部定義的變數
在函式內部定義全域性變數 global
a = "hello world" #全域性變數
deftest():globala
a= "hello" #區域性變數
print("1:", a)print("2:", a) #2: hello world
test() #1: hello
print("3:", a) #3: hello
3. 區域性變數 在函式內部定義的變數
由上例子我們可以知道,區域性變數是不能作用到函式外面的
4. nonlocal
這個用在函式巢狀函式中
#nonlocal
1 deftest_out():
2 str1= "hello hello"
3 deftest_in():
4 str1= "hello"5 str1+= "world"
6 print("1:", str1) #1: hello world
7 test_in()
8print("2:", str1) #2: hello hello
test_out()
當test_out()函式被呼叫的時候,函式從上到下執行,當執行了第7行**的時候,test_in函式被呼叫,執行到了第6行**的時候,就print了「hello world」,再執行第8行**的時候,列印了hello hello,相對與str1 = "hello"來書,str2 = "hello hello"變數作用範圍更廣,而後者相對與前者是乙個區域性變數,所以函式test_in不被外面呼叫
如果我們想要在內層函式呼叫外層函式,我們需要用到nonlocal
deftest_out():
str1= "hello hello"
deftest_in():#str1 = "hello"
nonlocal str1
str1+= "world"
print("1:", str1) #1: hello hello world
test_in()print("2:", str1) #2: hello hello world
test_out()
總結:1. 函式內部定義的為區域性變數,其作用域是區域性作用域,函式外無法呼叫的
2.函式外定義的為全域性變數,其作用域是全域性作用域,如果在函式內想要進行修改,需要global
3.外層函式的變數,如果想要在內層進行修改,需要nonlocal
劍指offer 包含min函式的棧(python)
定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。coding utf 8 class solution def init self self.stack self.min stack def push self,node 如果min stack為空 或者當前結點值小於等於棧最後...
劍指offer 包含min函式的棧(python)
這題很讓人疑惑啊,要時間複雜度為1,說明不能用遍歷,如果只有乙個變數儲存的話,那麼如果pop出去以後,不知道第二個小的是什麼,所以用另乙個stack去入棧。e.g.2,3,1,4 a 2,3,1,4 min a 2,2,1,1 保持a和min a長度一致,就可以一起入棧,一起出棧 coding ut...
劍指Offer 包含min函式的棧(Python)
定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式。時間複雜度應為o 1 空間換時間 另乙個棧一直儲存最小值 方法一 class solution def init self self.stack self.minvalue def push self,node if sel...