python3 第二十四章 - 函數式編程之Anonymous function(匿名函數)

来源:https://www.cnblogs.com/mrbug/archive/2018/02/05/8406340.html
-Advertisement-
Play Games

匿名函數指一類無須定義標識符的函數或子程式。Python用lambda語法定義匿名函數,只需用表達式而無需申明。lambda語法的定義如下: 有些時候,當我們在傳入函數時,不需要顯式地定義函數,直接傳入匿名函數更方便。匿名函數有個限制,就是只能有一個表達式,無需寫return,返回值就是該表達式的結 ...


匿名函數指一類無須定義標識符的函數或子程式。Python用lambda語法定義匿名函數,只需用表達式而無需申明。
lambda語法的定義如下:

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

有些時候,當我們在傳入函數時,不需要顯式地定義函數,直接傳入匿名函數更方便。匿名函數有個限制,就是只能有一個表達式,無需寫return,返回值就是該表達式的結果。用匿名函數有個好處,因為函數沒有名字,不必擔心函數名衝突。此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變數,再利用變數來調用該函數

實例:

# 可寫函數說明
sum = lambda arg1, arg2: arg1 + arg2

# 調用sum函數
print("相加後的值為 : ", sum(10, 20))
print("相加後的值為 : ", sum(20, 20))

以上代碼,輸出:

相加後的值為 :  30
相加後的值為 :  40

 

在定義時直接被調用,比如:

print((lambda x, y: x-y)(3, 4))

 以上代碼,輸出:

-1

 

 但通常都是在定義lambda函數的同時將其應用作為參數傳遞給另一個函數,該函數在其處理過程中對lambda定義的函數進行調用,例如:

L = [1, 2, 3, 4, 5, 6, 7, 8]

# 過濾掉所有的偶數
res = filter(lambda x: x % 2 == 1, L)

print(list(res))

 以上代碼,輸出:

[1, 3, 5, 7]

 

 

上面幾個實例都是比較簡單的,我們再來看幾個複雜的。假如,我們要找出兩個數中小的那一個,我們可以用lambda這麼寫:

fn = lambda x, y: x if x < y else y

print(fn(1, 2))

 以上代碼,輸出:

1

 

在上面的實例中,函數體里的那種寫法,實際上是python中的三元表達式(三目運算符)。在Python中,語法如下:

為真時的結果 if 判定條件 else 為假時的結果  

 例如:

1 if 5>3 else 0

是先輸出結果,再判定條件,輸出1,如果5大於3,否則輸出0

 

再來幾個更複雜的,後面這幾個如果你是初學者,可以略過!

柯里化(什麼是柯里化?https://baike.baidu.com/item/%E6%9F%AF%E9%87%8C%E5%8C%96/10350525?fr=aladdin):

res = (lambda x: (lambda y: (lambda z: x + y + z)(1))(2))(3)

print(res)

 以上代碼,輸出:

6

 

遞歸:

func = lambda n: 1 if n == 0 else n * func(n-1)
print(func(5))

 以上代碼,輸出:

120

f = lambda func, n: 1 if n == 0 else n * func(func, n - 1)
print(f(f, 4))

 以上代碼,輸出:

24

 

 匿名函數有以下幾個特點:

  • lambda 只是一個表達式,函數體比 def 簡單很多。
  • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda 函數擁有自己的命名空間,像嵌套的函數定義,lambda 函數可以從包含它的作用域中引用變數。

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

-Advertisement-
Play Games
更多相關文章
  • 一、秒殺業務為什麼難做 IM系統,例如QQ或者微博,每個人都讀自己的數據(好友列表、群列表、個人信息)。 微博系統,每個人讀你關註的人的數據,一個人讀多個人的數據。 秒殺系統,庫存只有一份,所有人會在集中的時間讀和寫這些數據,多個人讀一個數據。 例如小米手機每周二的秒殺,可能手機只有1萬部,但瞬時進 ...
  • 相關內容: 繼承:多繼承、super、__init__、重寫父類變數或函數 多態 繼承: 在Python3中,不寫基類的類預設繼承object 繼承就是子類獲得了父類的全部功能:比如學生和老師都有“姓名,性別,年齡、ID”等學校人員屬性,如果學生和老師都直接繼承學校人員的“姓名,性別,年齡、ID”,... ...
  • 案例目標 簡單介紹 redis pipeline 的機制,結合一段實例說明pipeline 在提升吞吐量方面發生的效用。 案例背景 應用系統在數據推送或事件處理過程中,往往出現數據流經過多個網元; 然而在某些服務中,數據操作對redis 是強依賴的,在最近的一次分析中發現: 一次數據推送會對 red ...
  • 當多個類中出現同一個功能,但是具體的主體功能不同,這時可以進行向上抽取,只抽取功能定義,主體功能由特定類實現。 上面這個類使用abstract關鍵字進行區分 抽象類的特點: 1、抽象方法一定在抽象類中。 2、抽象方法和抽象類都必須被abstract關鍵字修飾。 3、抽象類不可以使用new創建對象,因 ...
  • 所謂的JSP(Java Server Page)就是指在HTML中嵌入大量的Java代碼而已。 JSP註釋 顯示註釋(允許客戶端點擊查看源碼看到) <!-- 註釋內容 -->(HTML註釋) 隱式註釋(客戶端無法看見) // 註釋:單行註釋(Java註釋) /* 註釋 */:多行註釋(Java註釋) ...
  • 追新番網站提供最新的日劇和日影下載地址,更新比較快。 個人比較喜歡看日劇,因此想著通過爬取該網站,做一個資源地圖 可以查看網站到底有哪些日劇,並且隨時可以下載。 ...
  • 2.1語法 public 返回值類型 方法名(){ //方法體 } 2.2方法的調用語法 對象名.方法名 計算平均分和總成績 1 public class Score { 2 /** 3 * 創建類 ScoreCalc 編寫方法實現各功能 編寫測試類 4 * 從鍵盤接收三門課分數,(java c# ...
  • 上一篇介紹了在Web項目中web.xml文件的配置信息,本篇主要介紹裡面非常重要的配置——Servlet配置,重點介紹與Servlet相關的幾個介面和類,包括Servlet介面、ServletConfig介面、ServletContext介面、GenericServlet類、HttpServlet類 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...