22.python匿名函數詳解

来源:https://www.cnblogs.com/bonheur/archive/2020/02/29/12386868.html
-Advertisement-
Play Games

匿名(lambda)函數: 作用:創始一個匿名函數對象,同 def 類似,但不提供函數名,只是一個表達式,lambda比函數簡單且可以隨時創建和銷毀,有利於減少程式的偶合度。lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。lambda 函數擁有自己的 ...


匿名(lambda)函數:

作用:創始一個匿名函數對象,同 def 類似,但不提供函數名,只是一個表達式,lambda比函數簡單且可以隨時創建和銷毀,有利於減少程式的偶合度。lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間里的參數。

語法格式:lambda [函數形參列表]: 表達式

lambda [arg1 [,arg2,.....argn]]:expression

【註意】:

1) . lambda 表達式創建的函數只能包含一條表達式;

2) . 由於lambda函數返回的是函數對象(構建的是一個函數對象),所以需要定義一個變數去接收,即匿名函數同樣需要被調用才能執行,調用仍然使用()傳參的方式實現;

3) . 匿名函數同樣可以定義有返回值沒有返回值,有參數沒有參數的情況。

 

代碼演示演示匿名函數的定義和使用(與有名函數對比):    

 1 # 定義無參有返回值的有名函數:
 2 def func():
 3     return True
 4 # 調用有名函數執行
 5 print(func())             # True
 6 
 7 # 定義無參有返回值的匿名函數:
 8 f = lambda : False
 9 # 調用匿名函數執行
10 print(f())                # False
11 
12 # 定義無參無返回值的有名函數:
13 def func():
14     print(True)
15 # 調用有名函數執行
16 func()                    # True
17 
18 # 定義無參無返回值的匿名函數:
19 f = lambda : print(False)
20 # 調用匿名函數執行
21 f()                       # False

 

分類匿名函數 --> 以參數進行:
1). 1個參數
2). 多個參數
3). 預設參數
4). 可變參數

 1 # 先定義有名函數
 2 def m1(a):
 3     return a ** 2
 4 
 5 def m2(a,b):
 6     return a + b
 7 
 8 def m3(s1,s2='hello'):
 9     return s1 + s2
10 
11 print(m1(3))        # 9
12 print(m2(10,20))    # 30
13 print(m3('北京'))   # 北京hello
14     
1 # 定義匿名函數的形式以及調用
3 print((lambda x: x ** 2)(3))   # 相當於f=lambda x:x**2 ---》Print(f(3))
4 print((lambda x,y: x + y)(10,20))  # f=lambda x,y:x+y ---》print(f(10,20))
5 print((lambda s1,s2='hello,': s2 + s1)('老郭')) 
6 
7 # 匿名函數的可變參格式
8 print((lambda *x: x)('UI','H5','JS','PHP','軟體測試','網路營銷')) #得到('UI', 'H5', 'JS', 'PHP', '軟體測試', '網路營銷')
9 print((lambda **y: y)(name='zs',age=18)) #得到{'name': 'zs', 'age': 18}

 

代碼演示示例:

 1 # 需求1:將字元串數據'this is \na \ttest' -->得到 'this is a test'
 2 
 3 # 不使用匿名函數   
 4 str1 = 'this is \na \ttest'
 5 lt = str1.split()
 6 str2 = ' '.join(lt)
 7 print(str2,type(str2))       # 得到this is a test <class 'str'>
 8 
 9 # 使用匿名函數
10 f = lambda x:' '.join(x.split())
11 print(f(str1))
12 # 匿名函數精簡版
13 print((lambda x: ' '.join(x.split()))(str1))
14 
15 
16 # 需求2:使用匿名函數實現得到兩個數中的較大值
17 my_max = lambda x,y: x if x > y else y
18 # 調用匿名函數執行
19 print(my_max(10,20))         # 得到20
20 
21 
22 # 需求3:演示有名函數和匿名函數嵌套使用情況
23 # 示例(1)
24 def test(a,b,func):
25     result = func(a,b)
26     return result
27 # 調用函數
28 num = test(11,22,lambda x,y:x+y)
29 print(num)
30 
31 # 示例(2)
32 def speak(content):
33     return (lambda x: x + '你好')(content)
34 print(speak('北京'))

 

代碼演示匿名函數配合容器類型使用:

 1 # 1.匿名函數配合列表對象使用
 2 lt = [lambda x:x ** 2,lambda x:x ** 3,lambda x:x ** 4]
 3 for i in lt:             # 遍歷lt對象
 4     print(i(2))          # 得到 4  8  16
 5  
 6 # 單獨獲取某一個元素並且執行
 7 print(lt[-1](3))         # 得到81
 8 
 9 # 2.匿名函數配合字典對象使用
10 dic1 = {'A':lambda :2*2,'B':lambda :3*3,'C':lambda :4*4}
11 print(dic1['C']())       # 得到16
12 
13 # 3.列表嵌套字典,按照身高進行排序顯示(降序)
14 dic2 = [
15         {'name':'張學友','age':56,'height':173.0},
16         {'name':'劉德華','age':55,'height':176.0},
17         {'name':'郭富城','age':54,'height':170.0},
18         {'name':'黎明','age':57,'height':181.0},
19 ]
20 dic2.sort(reverse=True,key=lambda x:x['height'])    # 相等於 sorted(reverse=Ture,key=lambda x:x['height'])
21 print(dic2)

 

【補充】:sorted()sort()函數的區別

相同點:它們都是來實現排序的操作(功能層面)

不同點:sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。列表中的sort函數,它執行完畢後會直接影響原本這個list的內部結構(內部的數據發生改變了);而內置函數sorted函數,它執行完畢後不會影響原本容器中的內部結構,而會返回一個新的列表給程式。list 的 sort 方法返回的是對已經存在的列表進行操作,無返回值,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。

sorted()函數:

語法:sorted(iterable[, cmp[, key[, reverse]]])

參數:
iterable -- 可迭代對象
cmp -- 比較的函數,有兩個參數,參數的值都是從可迭代對象中取出,此函數必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0
key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序
reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(預設)

返回值:返回重新排序的列表

代碼演示示例:

 1 lt = [42,-9,0,-11,67,92,100,-33]
 2 print(lt.sort())      # None
 3 print(lt)               # [-33, -11, -9, 0, 42, 67, 92, 100], lt變化了   
 4 lt = [42,-9,0,-11,67,92,100,-33]
 5 lt1 = sorted(lt)
 6 print(lt1)             # [-33, -11, -9, 0, 42, 67, 92, 100], 
 7 print(lt)               # [42, -9, 0, -11, 67, 92, 100, -33], lt沒有變
 8 
 9 # 元祖進行sorted操作
10 tp = (42,-9,0,-11,67,92,100,-33)
11 lt1 = sorted(tp)           # 得到的仍然是list對象
12 print(lt1,type(lt1))       # [-33, -11, -9, 0, 42, 67, 92, 100] <class 'list'>
13 print(lt)                      # (42, -9, 0, -11, 67, 92, 100, -33),tp沒有變
14 
15 lt = [42,-9,0,-11,67,92,100,-33]
16 lt1 = sorted(r,reverse=True)     #reverse=True表示降序
17 print(lt1,type(lt1))           #[100, 92, 67, 42, 0, -33, -11, -9] <class 'list'>
18 
19 #這裡的思想和高階函數思想很像,key=abs相當於取每個數的絕對值
20 lt = [42,-9,0,-11,67,92,100,-33]
21 lt2 = sorted(lt,key=abs,reverse=True)   
22 print(lt2)         #[100, 92, 67, 42, -33, -11, -9, 0]
23 
24 lt3 = ['aaaaa','bbb','ccccccc','d']
25 lt4 = sorted(lt3,key=len,reverse=True)    key=len相當於取每個數的長度
26 print(lt4)        #['ccccccc', 'aaaaa', 'bbb', 'd']

 



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 效果圖 slider2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>slider</title> <link rel="stylesheet" href="../css/base.css"> < ...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv ...
  • 設計模式是前人經驗的總結,教大家如何寫出可擴展、可讀、可維護的高質量代碼。設計模式與日常工作中的編碼有直接的關係,直接影響到開發人員的開發能力。 ...
  • 什麼是高階函數:一個函數可以作為參數傳給另外一個函數(一個函數可以用來接收另一個函數作為參數),或者一個函數的返回值為另外一個函數(若返回值為該函數本身,則為遞歸),滿足其一則為高階函數。函數的形參位置必須接受一個函數對象。 代碼理解高階函數的含義: 1 '''函數當做參數被傳遞到另個函數是什麼樣的 ...
  • 一、cookie 1.requests可以自動處理cookie信息 import requests rsp = requests.get("http://www.baidu.com") #如果對方伺服器給傳送過來cookie信息,則可以同通過反饋的cookie屬性得到 #返回一個cookiejar的 ...
  • 不斷的對於某操作重覆調用執行稱為遞歸調用,遞歸函數執行的這個過程中只有進棧(開闢空間),沒有出棧,直到最後一次調用完畢了,才逐個出棧,所以遞歸函數在執行的時候非常的占用記憶體資源;如果執行的次數過多了,會產生記憶體溢出的現象;所以一定要控制遞歸的層數,當符合某一條件時要終止遞歸調用,幾乎所有的遞歸都能用 ...
  • 基於SSM開發倉庫庫存管理系統開發環境: Windows操作系統開發工具: MyEclipse+Jdk+Tomcat+MySql資料庫 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=71 運行效果圖 ...
  • 基於JSP+Servlet開發旅游(景點賓館)系統(前臺+後臺): 開發環境: Windows操作系統開發工具: MyEclipse+Jdk+Tomcat+MYSQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=6 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...