python 匿名函數(lambda函數)

来源:https://www.cnblogs.com/yund/archive/2023/05/04/17370856.html
-Advertisement-
Play Games

ChatGPT很強大,可以幫我們處理很多問題,但這些問題的答案的正確性您是否有考證過呢? 昨晚,DD就收到了一個有趣的反饋: 提問:有什麼關於數據許可權設計的資料推薦嗎? ChatGPT居然介紹了一本根本不存在的書《數據許可權設計與實現》,作者居然還是我... 那麼你在使用ChatGPT的時候,有碰到過 ...


Python中的匿名函數是指沒有命名標識符的函數,通常被稱為lambda函數。與普通函數不同,它們是一種更加簡潔的方式來編寫小型臨時函數。在Python中,匿名函數使用關鍵字lambda來定義,其語法如下:
lambda arguments: expression

其中,arguments表示函數參數,可以是一個或多個,多個參數之間用逗號分隔;expression表示函數體,可以是任何有效的Python表達式。

下麵是幾個匿名函數的示例:

# 計算兩個數的和
add = lambda x, y: x + y

# 判斷一個數是否為偶數
is_even = lambda x: x % 2 == 0

# 對一個列表按照元素長度從小到大排序
sort_by_length = lambda lst: sorted(lst, key=lambda x: len(x))

匿名函數的主要用途是作為其他函數的參數,例如map()filter()reduce()等高階函數。使用匿名函數可以避免編寫額外的函數定義,使代碼更加簡潔明瞭。下麵是一個map()函數的示例:

lst = [1, 2, 3, 4]
squared = map(lambda x: x ** 2, lst)
print(list(squared))  # [1, 4, 9, 16]

匿名函數的使用場景:

  1. 在函數式編程中,匿名函數是非常重要的一種語法結構。常用於函數作為參數的場合,比如map()filter()reduce()等高階函數。

  2. 匿名函數還可以用來定義簡單的回調函數,比如對一個列表中的元素進行排序時,可以使用sort()函數,並指定一個lambda表達式作為key參數來實現。

  3. 在Python中,有些內置函數也支持傳入自定義的函數,比如sorted()max()min()等。這些函數通常會使用匿名函數作為參數,以便更加靈活地控制函數的行為。

註意事項:

  1. 匿名函數只適用於較短和較簡單的代碼段,如果需要編寫複雜的計算或包含多條語句的函數,最好使用普通函數來實現。

  2. 匿名函數的命名空間與當前環境相同,因此可能會導致變數名衝突的問題。在編寫複雜程式時,應該避免使用匿名函數過多,以保證程式的可讀性和可維護性。

  3. 當使用lambda關鍵字定義匿名函數時,不需要使用return語句來返回結果。表達式的結果就是函數的返回值。

  4. 如果一個匿名函數的邏輯比較複雜,建議將其抽象成一個普通函數,以提高代碼的可讀性和可維護性。

下麵是一些示例代碼,說明使用匿名函數的一些典型場景:

# 使用map()函數將列表中的元素轉換為字元串,並用逗號分隔
lst = [1, 2, 3, 4]
result = ','.join(map(lambda x: str(x), lst))
print(result)  # '1,2,3,4'

# 使用filter()函數篩選出列表中的偶數
lst = [1, 2, 3, 4]
result = list(filter(lambda x: x % 2 == 0, lst))
print(result)  # [2, 4]

# 對一個字典按照值進行排序
d = {'a': 3, 'b': 1, 'c': 2}
sorted_d = sorted(d.items(), key=lambda x: x[1])
print(sorted_d)  # [('b', 1), ('c', 2), ('a', 3)]

# 根據數字字元串的長度對列表進行排序
lst = ['12', '123', '1', '1234']
sorted_lst = sorted(lst, key=lambda x: len(x))
print(sorted_lst)  # ['1', '12', '123', '1234']

關於Python中匿名函數的註意事項:

 

  1. 匿名函數可以使用預設參數和可變參數,語法與普通函數相同。例如:
# 使用預設參數的匿名函數
add = lambda x, y=1: x + y
print(add(3))  # 4

# 使用可變參數的匿名函數
sum_all = lambda *args: sum(args)
print(sum_all(1, 2, 3))  # 6

 

2.如果一個匿名函數的參數列表為空,那麼在定義時也需要使用一對空括弧來表示。例如:

# 沒有參數的匿名函數
f = lambda: 'Hello, world!'
print(f())  # 'Hello, world!'

3.匿名函數雖然可以訪問外部環境的變數,但是訪問範圍是只讀的。如果需要修改外部變數,需要使用nonlocalglobal關鍵字。例如:

def make_adder(n):
    return lambda x: x + n

# 計算兩個數的和,並加上一個偏移量
offset = 10
add = make_adder(offset)
result = add(5) + offset  # 這裡需要手動加上偏移量
print(result)  # 20

# 修改外部變數
def make_counter():
    count = 0
    return lambda: nonlocal count; count += 1; return count

counter = make_counter()
print(counter())  # 1
print(counter())  # 2

4.如果需要在匿名函數中定義一個新的局部變數,可以使用賦值語句來實現。例如:

f = lambda x: (y := x + 1) ** 2
print(f(3))  # 16

註意,在這個例子中,y是一個局部變數,只能在lambda表達式內部訪問。

在Python中,lambda函數通常用於函數式編程,可以用來定義短小而不重要的函數。與普通函數不同,lambda函數具有以下特點:

  1. lambda函數是匿名的,沒有函數名稱。
  2. lambda函數可以使用任意數量的參數,但只能包含一個表達式,不能包含多個語句或複雜控制流。
  3. lambda函數返回一個值,這個值就是表達式的結果。
  4. lambda函數通常用作其他函數的參數,比如map()filter()reduce()等。
  5. lambda函數的生命周期很短,在調用後立即被回收。

下麵是一些示例代碼,說明如何使用lambda函數:

# 將列表中的所有元素加倍
lst = [1, 2, 3, 4]
doubled = list(map(lambda x: x * 2, lst))
print(doubled)  # [2, 4, 6, 8]

# 篩選出列表中的偶數
even = list(filter(lambda x: x % 2 == 0, lst))
print(even)  # [2, 4]

# 計算兩個數的積
multiply = lambda x, y: x * y
print(multiply(2, 3))  # 6

由於lambda函數是匿名的,因此在調試時可能會比較困難。為了避免這種情況,儘量在編寫複雜的邏輯時,使用普通函數來實現。

此外,lambda函數雖然能夠提高代碼的簡潔性和可讀性,但是也需要註意一些限制。例如,由於lambda函數只能包含一個表達式,因此不能包含多個語句或複雜控制流。如果需要編寫複雜的邏輯,應該使用普通函數來實現。此外,在編寫lambda函數時,還需要註意函數參數和返回值的類型,以確保程式執行的正確性。

除了函數式編程,lambda函數還可以用於其他一些場合。下麵是一些常見的用法:

  1. 排序

在Python中,內置的排序函數sorted()接受一個可迭代對象和一個關鍵字參數key,表示排序時使用的比較函數。通常情況下,我們可以使用匿名函數來定義這個比較函數,以便更加靈活地控制排序結果。例如:

lst = ['abc', 'a', 'defg', 'hijkl']
sorted_lst = sorted(lst, key=lambda x: len(x))
print(sorted_lst)  # ['a', 'abc', 'defg', 'hijkl']
  1. GUI編程

在圖形用戶界面(GUI)編程中,Lambda函數通常用作事件處理程式。當用戶進行某個操作時,系統會自動調用Lambda函數來響應事件並執行相應的邏輯。例如,在Tkinter庫中,可以使用Lambda函數來定義按鈕的點擊事件,如下所示:

import tkinter as tk

root = tk.Tk()
frame = tk.Frame(root)
button = tk.Button(frame, text='Click me')

# 使用Lambda函數定義按鈕的點擊事件
button.config(command=lambda: print('Button clicked!'))
button.pack()
frame.pack()

root.mainloop()
  1. Web開發

在Web開發中,Lambda函數通常用於實現API的請求處理程式。當客戶端發送請求時,伺服器會自動調用Lambda函數來解析請求參數,並根據請求參數返回相應的數據。例如,在Django框架中,可以使用Lambda函數來定義視圖函數,如下所示:

from django.http import JsonResponse

# 使用Lambda函數定義視圖函數
def my_view(request):
    data = {'name': 'Alice', 'age': 25}
    return JsonResponse(data, safe=False)

除了常見的用法,Lambda函數還可以用於一些其他場合。下麵介紹幾個比較有趣的例子。

  1. 模擬類的屬性

在Python中,可以使用Lambda函數實現類的屬性。例如,以下代碼定義了一個名為Person的類,它有兩個屬性:first_namelast_name。這些屬性實際上是Lambda函數,可以動態計算結果並返回。

class Person:
    def __init__(self, first_name, last_name):
        self.first_name = lambda: first_name
        self.last_name = lambda: last_name

p = Person('John', 'Doe')
print(p.first_name())  # 'John'
print(p.last_name())  # 'Doe'

需要註意的是,使用Lambda函數來實現類的屬性可能會降低代碼的可讀性和可維護性。因此,在編寫類時,儘量使用普通的屬性和方法來實現。

  1. 簡化表達式

在Python中,Lambda函數可以用於簡化某些表達式。例如,以下代碼計算所有小於1000的正整數中,既能被3整除又能被5整除的數之和:

result = sum(filter(lambda x: x % 3 == 0 and x % 5 == 0, range(1000)))
print(result)  # 33165

使用Lambda函數可以使代碼更加簡潔明瞭,同時也能夠提高代碼的執行效率。

  1. 函數裝飾器

在Python中,可以使用Lambda函數來定義函數裝飾器。例如,以下代碼定義了一個名為logger的裝飾器,用於記錄函數的執行時間和結果:

import time

def logger(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'{func.__name__} executed in {end_time - start_time:.4f}s')
        return result
    return wrapper

# 使用Lambda函數定義裝飾器
time_it = lambda func: logger(func)

# 應用裝飾器
@time_it
def my_func():
    time.sleep(1)
    return 'Done'

result = my_func()
print(result)  # 'Done'

 


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

-Advertisement-
Play Games
更多相關文章
  • 併發編程是指在程式中使用多線程技術來實現並行處理的能力。多線程機制使得程式可以分解成互不幹擾的任務,從而提高了程式執行的效率。併發編程可以通過對線程的創建,管理和協作進行控制,以實現更加高效的併發執行。併發編程的優點包括:① 提高程式執行效率:通過多線程並行處理,程式的處理速度可以顯著提高。② 增強... ...
  • 數據讀取是第一步,只有成功載入數據之後,後續的操作才有可能。 pandas可以讀取和導入各種數據格式的數據,如CSV,Excel,JSON,SQL,HTML等,不需要手動編寫複雜的讀取代碼。 1. 各類數據源 pandas提供了導入各類常用文件格式數據的介面,這裡介紹3種最常用的載入數據的介面。 1 ...
  • 架構 首先,看一下整個架構圖。最全面的Java面試網站 接下來簡單解釋一下。 Server:伺服器。Tomcat 就是一個 Server 伺服器。 Service:在伺服器中可以有多個 Service,只不過在我們常用的這套 Catalina 容器的Tomcat 中只包含一個 Service,在 S ...
  • SpringBoot導出Word文檔的三種方式 一、導出方案 1、直接在Java代碼里創建Word文檔,設置格式樣式等,然後導出。(略) 需要的見:https://blog.csdn.net/qq_42682745/article/details/120867432 2、富文本轉換後的HTML下載為 ...
  • 二 golang推薦的命名規範 很少見人總結一些命名規範,也可能是筆者孤陋寡聞, 作為一個兩年的golang 開發者, 我根據很多知名的項目,如 moby, kubernetess 等總結了一些常見的命名規範。 命名規範可以使得代碼更容易與閱讀, 更少的出現錯誤。 文件命名規範 由於文件跟包無任何關 ...
  • MongoDB 備忘清單 MongoDB是一個基於分散式文件存儲 [1] 的資料庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。 MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。它支持的數據結構非常鬆散,是類似js ...
  • 一 golang基礎知識 Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發的一種電腦編程語言語言。 設計初衷 Go語言是谷歌推出的一種的編程語言,可以在不損失應用程式性能的情況下降低代碼的複雜性。谷歌首席軟體工程 ...
  • 接上文 4、條件分支控制流 避免分支嵌套,異常放在代碼片段最前面 4.1、歸約函數 4.2、條件表達式的封裝避免過長而導致可讀性下降 4.3、德摩根定律 4.4、and、or優先順序 4.5、or短路效應 4.6、消失的分支 4.6.1、二分查找演算法 4.6.2、字典演算法 5、異常錯誤處理 無需多言 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...