python res函式 python函式基礎2

2021-10-11 12:33:18 字數 3314 閱讀 8549

一、匿名函式

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