Python可迭代歸約函數深度解析:從all到sorted的進階指南

在Python中,歸約函數(Reduction Functions)是處理可迭代對象的利器。它們通過遍歷元素并逐步收斂為單個結果,廣泛應用于數據分析、邏輯判斷和數值計算等場景。本文將系統梳理這些函數的核心特性、使用技巧及底層邏輯,助你寫出更高效的代碼。

內置歸約函數的核心功能

表14-6中的函數可分為兩類:邏輯判斷型與數值計算型。

1. 邏輯判斷函數

  • all(it)
    當迭代器it中所有元素為真值時返回True,空迭代器直接返回True

    all([])          # True(邊界條件!)
    all([1, 0, 3])   # False(存在假值元素)
    
  • any(it)
    只要迭代器it中存在一個真值元素即返回True,空迭代器返回False

    any([0, 0.0])    # False(全假值)
    any([0, 7, 8])   # True(惰性求值:找到7后立即終止遍歷)
    

? 關鍵優化:短路機制

allany的獨特優勢在于短路求值(Short-Circuiting)。一旦結果確定,立即停止遍歷,極大提升性能。例如:

g = (n for n in [0, 0.0, 7, 8])
any(g)  # 遍歷到7時返回True,后續元素8仍保留在生成器中 
next(g) # 輸出8(證明未完全消耗迭代器)

2. 數值計算函數

  • max/min(it, key=..., default=...)
    返回極值,支持自定義排序邏輯(key參數)和空迭代器默認值(default)。

    max([3, 1, 4], key=lambda x: -x)  # 返回最小值1(通過key反轉排序)
    min([], default="N/A")            # 返回"N/A"
    
  • sum(it, start=0)
    計算總和,start參數允許疊加初始值。注意:浮點運算建議用math.fsum避免精度損失。

    sum([0.1]*10)              # 0.9999999999999999(精度問題)
    import math; math.fsum([0.1]*10)  # 精確輸出1.0 
    

functools.reduce:歸約的底層實現

reduce(func, it, initial)是歸約函數的通用實現,通過連續應用二元函數func累積結果。例如:

from functools import reduce 
reduce(lambda a, b: a*b, [2, 3, 5])  # 計算2*3*5=30 

對比內置函數:

  • 優勢:靈活性高,可自定義歸約邏輯。
  • 劣勢:無短路優化,需遍歷所有元素;代碼可讀性較低。

擴展應用:sortedreversed

  • sorted(it)
    返回排序后的新列表,支持任意可迭代對象。與歸約函數不同,sorted需完全遍歷輸入,因此無法處理無限迭代器。

    sorted((3, 1, 4))     # [1, 3, 4]
    sorted("python")      # ['h', 'n', 'o', 'p', 't', 'y']
    
  • reversed(it)
    返回生成器,按逆序惰性生成元素。僅支持序列類型(如列表、元組),不適用于通用迭代器。

    list(reversed([3, 1, 4]))  # [4, 1, 3]
    

實戰技巧與注意事項

1. 短路機制的高效應用

  • 處理大型數據集時,優先使用any()/all()替代循環或reduce
  • 生成器表達式(如(x for x in ...))與短路機制結合,可避免不必要的計算。

2. iter()的隱藏特性

iter(callable, sentinel)可創建基于哨兵值的迭代器,例如逐行讀取文件直到空行:

with open("data.txt") as f:for line in iter(f.readline, "\n"):  # 遇到空行停止 process(line)

3. 空迭代器的邊界處理

sum([])返回0,max([])拋出ValueError,需通過default參數顯式處理。

總結:如何選擇合適的歸約函數?

場景推薦函數
邏輯條件判斷all()/any()
數值極值與求和max()/min()/sum()
自定義歸約邏輯functools.reduce
排序需求sorted()

掌握這些函數的核心邏輯,能顯著提升代碼的簡潔性與性能。對于大規模數據,優先選擇具備短路優化的all()any();對浮點運算,記得使用math.fsum規避精度陷阱。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89822.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大帶寬服務器都有哪些應用場景?

大帶寬服務器憑借著高速的數據傳輸能力和強大的網絡承載能力,通常被企業應用在需要高流量和高并發處理能力的業務場景當中,下面,就讓我們共同了解一下大帶寬服務器的應用場景吧!首先,隨著科學技術的快速發展&#xff0…

爬蟲實戰指南:從定位數據到解析請求的全流程解析

爬蟲的本質是什么? 爬蟲的本質就是用代碼模擬人類在瀏覽器里的操作,像點擊網頁、填寫表單、提交數據等行為,自動化地進行網頁數據的獲取和處理。比如: 發送 GET 請求 來請求網頁內容,相當于你在瀏覽器地址欄輸入網址…

Sentinel dashboard 添加context-path后無法信息無法上傳問題

Sentinel dashboard 添加context-path后無法加載問題 添加server.servlet.context-path/sentinel后可以正常訪問,但是客戶端啟動后信息上報失敗。 transport: dashboard: localhost:8858/sentinel 經查閱文檔需要加入api-path,但是我配置提示無api-path所…

iOS —— 3Gshare項目總結與思考

登陸注冊及推出主頁面這部分有兩種寫法:一種是在SceneDelegate中推出LoginVC,后在判斷登陸成功后退去主要程序。另一種則是先加載主程序,后推出登陸頁面。通過同組同學實踐證明,后者在推出登陸頁面時會閃一下,因此還是…

硅基計劃3.0 學習總結 貳 順序表與鏈表 初版

文章目錄一、順序表——ArrayList1. 實現自己MyArrayList1. 實現add基礎方法2. 實現指定位置加元素add方法3. 完善數組打印方法display4. 完善根據下標找元素get5. 完善判斷數字是否在數組中contains6. 根據數字找下標indexOf7. 更新指定下標元素set8. 獲取數組有效長度size9. …

Postman/Apipost中使用Post URL編碼發送含換行符參數的問題分析

Postman/Apipost中使用Post URL編碼發送含換行符參數的問題分析 在使用Postman或Apipost等API測試工具進行POST請求時,當參數中包含換行符(\n或\r)通過UI界面復制參數時會遇到參數發送失效的問題。 問題原因分析URL編碼規范限制: x-www-form-urlencoded格…

Swap Face 使用遇到的問題

INFO Extracting: 文件名 ERROR Unable to extract model file: File is not a zip file 因為插件沒有下載成功,可以開個代理。復制報錯的網址下載模型,解壓后手動放入D:\Program Files\faceswap\.fs_cache\ 插件GIT地址 chttps://github.com…

誤操作后快速恢復數據 binlog 解析為反向 SQL

誤操作后快速恢復數據 binlog 解析為反向 SQL 1.前言 本文將介紹使用 reverse_sql 工具將 GreatSQL 數據庫的 binlog 解析為反向 SQL 語句。模擬誤操作后,恢復數據。該工具可以幫助客戶在發生事故時快速恢復數據,避免進一步的損失。使用 reverse_sql 工具…

ABP VNext + Grafana Loki:集中式日志聚合

📝 ABP VNext Grafana Loki:集中式日志聚合 📚 目錄📝 ABP VNext Grafana Loki:集中式日志聚合一、引言? TL;DR二、環境與依賴🛠? 平臺版本🔗 NuGet 包?? 基礎服務三、Serilog Loki 集成…

分布在內側內嗅皮層(MEC)的帶狀細胞對NLP中的深層語義分析有什么積極的影響和啟示

帶狀細胞(Band Cells)作為內側內嗅皮層(Medial Entorhinal Cortex, MEC)層Ⅱ/Ⅲ的核心空間編碼單元(如網格細胞、頭方向細胞等),其獨特的神經計算機制為自然語言處理(NLP&#xff09…

Django Ninja

Django Ninja 是一個用于 Django 框架的快速、現代化的 API 開發庫,旨在簡化構建高性能、類型安全的 RESTful API。它受到 FastAPI 的啟發,結合了 Django 的強大功能和 FastAPI 的簡潔與現代化設計,特別適合需要快速開發、易于維護且具有強類…

iic時序

數據和應答信號都規定在SCL在高電平期間,SDA電平穩定;SCL在低電平期間,SDA電平才可以變化。要不然容易被誤認為起始或停止信號。應答信號:1. 第九個SCL之前的低電平期間將SDA拉低2. 確保在SCL為高電平時,SDA為穩定的低…

GitHub+Git新手使用說明

Git Git是一個在本地用于隨時保存和查看歷史版本的軟件Git的三個概念:提交commit、倉庫repository、分支branch Git安裝 在電腦里面按winR,輸入cmd進入終端后輸入git --version,然后再次輸入where git,查看git所在位置 Git常用語句…

前端圖像視頻實時檢測

需求:在目標檢測時,我們要求前端能夠將后端檢測的結果實時渲染在圖片或者視頻上。圖片是靜態的,只需要渲染一次;而視頻是動態的,播放時需要根據幀數來實時渲染標注框,可以想象視頻就是由一張張圖片播放的效…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sqlalchemy’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sqlalchemy’問題 摘要 在使用 PyCharm 控制臺執行 pip install sqlalchemy 后,仍然在代碼中提示 ModuleNotFoundError: No module named sqlalche…

第4.3節 iOS App生成追溯關系

iOS生成追溯關系的邏輯和Android端從用戶角度來說是一致的,就是需要通過開始和結束關聯用例,將用例信息與覆蓋率信息建立關系,然后再解析覆蓋率數據。 4.3.1 添加關聯用例彈層 關聯用例彈層和Android類似,只要你能設計出相應的樣…

STM32 USB鍵盤實現指南

概述 在STM32上實現鍵盤功能可以通過USB HID(人機接口設備)協議來實現,使STM32設備能被計算機識別為標準鍵盤。以下是完整的實現方案: 硬件準備 STM32開發板(支持USB,如STM32F103、STM32F4系列) USB接口(Micro USB或Type-C) 按鍵矩陣或單個按鍵 必要的電阻和連接…

繼電器基礎知識

繼電器是一種電控制器件,它具有隔離功能的自動開關元件,廣泛應用于遙控、遙測、通訊、自動控制、機電一體化及電力電子設備中,是最重要的控制元件之一。 繼繼電器的核心功能是通過小電流來控制大電流的通斷。它通常包含一個線圈和一組或多組觸點。當給繼電器的線圈施加一定…

MYSQL:庫的操作

文章目錄MYSQL:庫的操作1. 本文簡述2. 查看數據庫2.1 語法3. 創建數據庫3.1 語法3.2 示例3.2.1 創建一個簡單的數據庫3.2.2 使用 IF NOT EXISTS 防止重復創建3.2.3 再次運行,觀察現象3.2.4 查看這個警告到底是什么3.2.5 創建數據庫允許使用關鍵字4. 字符…

Xilinx FPGA XCKU115?2FLVA1517I AMD KintexUltraScale

XCKU115?2FLVA1517I 隸屬于 Xilinx (AMD)Kintex UltraScale 系列,基于領先的 20?nm FinFET 制程打造。該器件采用 1517?ball FCBGA(FLVA1517)封裝,速度等級 ?2,可實現高達 725?MHz 的核心邏…