深入理解Lambda函數及其用法

来源:http://www.cnblogs.com/huangbiquan/archive/2017/12/12/8030298.html
-Advertisement-
Play Games

Lambda函數又稱匿名函數,匿名函數就是沒有名字的函數,函數沒有名字也行?當然可以啦。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。 先來看個簡單lambda函數 x和y是函數的兩個參數,冒號後面的表達式是函數的返回值,你能一眼看出這個函數就是是在求兩個變數的和 ...


Lambda函數又稱匿名函數,匿名函數就是沒有名字的函數,函數沒有名字也行?
當然可以啦。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。

先來看個簡單lambda函數

>>> lambda x, y : x+y
<function <lambda> at 0x102bc1c80>

x和y是函數的兩個參數,冒號後面的表達式是函數的返回值,你能一眼看出這個函數就是是在求兩個變數的和,但作為一個函數,沒有名字如何使用呢?
這裡我們暫且給這個匿名函數綁定一個名字,這樣使得我們調用匿名函數成為可能。

>>> add = lambda x, y : x+y
>>> add
<function <lambda> at 0x102bc2140>
>>> add(1,2)
3

它等同於常規函數

>>> def add2(x, y):
...     return x+y
...
>>> add2
<function add2 at 0x102bc1c80>
>>> add2(1,2)
3

lambda使用場景:

#1.函數式編程:
例如:一個整數列表,要求按照列表中元素的絕對值大小升序排列
>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]

排序函數sorted支持接收一個函數作為參數,該參數作為 sorted的排序依據,這裡按照列表元素的絕對值進行排序。

當然,我也可以用普通函數來實現:
>>> def foo(x):
...     return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]
只不過是這種方式代碼看起來不夠 Pythonic 而已。

lambda:這是Python支持一種有趣的語法,它允許你快速定義單行的最小函數,可以用在任何需要函數的地方:
>>> add = lambda x,y : x+y
>>> add(5,6)
11
>>> (lambda x,y:x+y)(5,6)
11

#2.Python中最常見的filter篩選、map小刷子、reduce合併,都可以用lambda表達式來生成!
對於序列來講,有三個函數式編程工具: filter()、map()和reduce()。

map(function,sequence):把sequence中的值當參數逐個傳給function,返回一個包含函數執行結果的list。如果function有兩個參數,即map(function,sequence1,sequence2)。
 
#求1~20的平方
>>> list(map(lambda x:x*x,range(1,21))) #Python2.x使用map(lambda x:x*x,range(1,21))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]

filter(function,sequence):對sequence中的item依次執行function(item),將執行結果為True的item組成一個List/String/Tuple(取決於sequence的類型)返回。
 
#求1~20之間的偶數
>>> list(filter(lambda x:x%2 == 0,range(1,21))) #Python2.x使用filter(lambda x:x%2 == 0,range(1,21))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

reduce(function,sequence):function接收的參數個數只能為2,先把sequence中第一個值和第二個值當參數傳給function,再把function的返回值和第三個值當參數傳給function,然後只返回一個結果。
 
#求1~100之和
>>> from functools import reduce          #Python3.x之後需要導入reduce模塊
>>> reduce(lambda x,y:x+y,range(1,101))
5050

#求1~100之和,再加上10000
>>> reduce(lambda x,y:x+y,range(1,101),10000)
15050

#3.閉包
閉包:一個定義在函數內部的函數,閉包使得變數即使脫離了該函數的作用域範圍也依然能被訪問到。

來看一個用lambda函數作為閉包的例子。
>>> def add(n):
...     return lambda x:x+n
...
>>> add2 = add(5)
>>> add2(15)
20

這裡的lambda函數就是一個閉包,在全局作用域範圍中,add2(15)可以正常執行且返回值為20。之所以返回20是因為在add局部作用域中,變數n的值在閉包的作用使得它在全局作用域也可以被訪問到。

 


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

-Advertisement-
Play Games
更多相關文章
  • 1、set ES6 提供了新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重覆的值。 使用add方法向 Set 結構加入成員。 2、size 確定set結構中有幾個元素。 3、add/delete/has/clear ...
  • 目錄 前言 JavaScript加減乘除運算 decimal.js加減乘除運算 前言 開發過程中免不了有浮點運算,JavaScript浮點運算的精度問題會帶來一些困擾 JavaScript 只有一種數字類型 ( Number ) JavaScript採用 IEEE 754 標準雙精度浮點(64),6 ...
  • 一、JavaScript簡介 JavaScript是一種解釋執行的腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型,它遵循ECMAScript標準。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,主要用來給HTML增加動態功能。 幾乎所有主流的語言 ...
  • 1單例模式2策略模式3代理模式4觀察者和發佈訂閱模式5命令模式6享元模式7責任鏈模式8裝飾者模式9狀態模式 ...
  • 各位朋友,本次LZ分享的是狀態模式,在這之前,懇請LZ解釋一下,由於最近公司事情多,比較忙,所以導致更新速度稍微慢了些(哦,往後LZ會越來越忙=。=)。 狀態模式,又稱狀態對象模式(Pattern of Objects for States),狀態模式是對象的行為模式。 狀態模式允許一個對象在其內部 ...
  • 定義: 為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用 角色: 1, 抽象角色:聲明真實對象和代理對象的共同介面。 2, 代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同 ...
  • 為留言板-v1添加登錄功能,使用監聽器檢測會話的變化、維護活躍會話列表 ...
  • XHProf是facebook 開發的一個測試php性能的擴展,本文記錄了在PHP應用中使用XHProf對PHP進行性能優化,查找性能瓶頸的方法。 一、安裝Xhprof擴展 二、修改php.ini 配置中xhprof.output_dir指定了生成的profile文件存儲的位置,我們將其指定為/tm ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...