Python高階函數-filter

在這里插入圖片描述

1. 基本概念

filter() 是Python內置的高階函數,用于過濾序列中的元素。它接收一個函數和一個可迭代對象作為參數,返回一個迭代器,包含使函數返回True的所有元素。

filter(function, iterable)

2. 工作原理

  • 惰性計算:filter對象是迭代器,只有在真正需要值時才會進行計算
  • 篩選機制:對iterable中的每個元素應用function,保留返回值為True的元素
  • 等價實現
    (item for item in iterable if function(item))
    

3. 使用示例

3.1 基礎用法

# 過濾偶數
numbers = [1, 2, 3, 4, 5, 6]
even = filter(lambda x: x % 2 == 0, numbers)
print(list(even))  # 輸出: [2, 4, 6]

3.2 使用None作為函數

# 過濾掉假值(False, 0, '', None等)
values = [0, 1, False, 2, '', 3]
filtered = filter(None, values)
print(list(filtered))  # 輸出: [1, 2, 3]

3.3 復雜過濾條件

# 過濾包含特定字符的字符串
words = ["apple", "banana", "cherry", "date"]
result = filter(lambda w: 'a' in w and len(w) > 5, words)
print(list(result))  # 輸出: ['banana']

4. 底層實現分析

CPython中的filter實現(簡化版):

typedef struct {PyObject_HEADPyObject *func;PyObject *it;
} filterobject;
  • 創建filter對象時不會立即執行計算
  • 迭代時調用__next__()方法才會應用過濾函數

5. 性能考慮

  • 內存效率:比列表推導式更節省內存(返回迭代器而非列表)
  • 執行效率:對于大型數據集,filter通常比循環+條件判斷更快
  • 比較基準
    # filter vs 列表推導式
    %timeit list(filter(lambda x: x%2, range(10**6)))
    %timeit [x for x in range(10**6) if x%2]
    

6. 最佳實踐

  1. 對于簡單條件,考慮使用生成器表達式
  2. 復雜過濾邏輯時使用filter更清晰
  3. 需要多次使用結果時轉換為列表:
    filtered_list = list(filter(func, iterable))
    
  4. 結合其他高階函數使用:
    from functools import reduce
    result = reduce(lambda x, y: x+y, filter(lambda n: n>0, numbers))
    

7. 常見問題

Q1: filter和列表推導式如何選擇?

  • 選擇filter當:
    • 已有現成的判斷函數
    • 需要惰性求值
    • 代碼可讀性更重要
  • 選擇列表推導式當:
    • 條件簡單
    • 需要立即得到結果列表

Q2: filter對象可以重復使用嗎?
不可以,filter對象是迭代器,消費后即耗盡。如需重復使用,需轉換為列表或重新創建。

Q3: 如何處理filter中的異常?

def safe_filter(x):try:return x > 0except Exception:return Falseresult = filter(safe_filter, potentially_bad_data)

8. 擴展應用

8.1 多條件過濾

def multi_filter(x):conditions = [x > 0,isinstance(x, int),x % 3 == 0]return all(conditions)

8.2 鏈式過濾

data = range(100)
pipeline = filter(lambda x: x > 50, filter(lambda x: x % 2 == 0, data))

8.3 配合itertools使用

from itertools import filterfalse
# 獲取不滿足條件的元素
result = filterfalse(lambda x: x%2, range(10))

9. 總結

filter()是函數式編程的重要工具,合理使用可以:

  • 使代碼更聲明式
  • 提高內存效率
  • 方便組合多個操作
  • 提升復雜過濾邏輯的可讀性

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

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

相關文章

密碼學基礎——分組密碼的運行模式

前面的文章中文我們已經知道了分組密碼是一種對稱密鑰密碼體制,其工作原理可以概括為將明文消息分割成固定長度的分組,然后對每個分組分別進行加密處理。 下面介紹分組密碼的運行模式 1.電碼本模式(ECB) 2.密碼分組鏈接模式&…

Redlinux(2025.3.29)

1、將你的虛擬機的網卡模式設置為nat模式,給虛擬機網卡配置三個主機位分別為100、200、168的ip地址。(以nmtui命令為例) 2、測試你的虛擬機是否能夠ping通網關和dns,如果不能請修改網關和dns的地址。 首先打開虛擬網絡編輯器查看NAT設置里的網關IP&…

【PalladiumZ2 使用專欄 1 -- 波形 trigger 抓取詳細介紹】

文章目錄 Palladium Z2 OverviewPalladium 波形抓取Palladium 波形存放文件創建Palladium Trigger 斷點設置Palladium 加探針并 dumpPalladium 波形查看 Palladium Z2 Overview Cadence Palladium Z2 是 Cadence 推出的企業級硬件仿真加速平臺,旨在應對復雜 SoC 設…

Redisson分布式鎖:原理、使用

1. Redisson簡介 Redisson是一個基于Redis的Java客戶端庫,提供了豐富的分布式對象和服務(如分布式鎖、信號量、Map等)。其核心優勢在于??簡化分布式鎖的實現??,并解決了原生Redis分布式鎖的常見問題(如死鎖、誤刪…

Java大廠面試題 -- JVM 優化進階之路:從原理到實戰的深度剖析(2)

最近佳作推薦: Java大廠面試題 – 深度揭秘 JVM 優化:六道面試題與行業巨頭實戰解析(1)(New) 開源架構與人工智能的融合:開啟技術新紀元(New) 開源架構的自動化測試策略優…

MySQL學習筆記(四)——DML和DQL

目錄 1. DML 1.1 添加數據 1.1.1 給指定字段添加數據 1.1.2 給全部字段添加數據 1.1.3 批量添加數據 1.2 修改數據 1.3 刪除數據 2. DQL 2.1 基本語法 2.2 基礎查詢 2.2.1 查詢多個字段 2.2.2 字段設置別名 2.2.3 去除重復記錄 2.3 條件查詢 2.4 聚合函數 2.5 …

DeepSeek-MLA

MLA 結構 需要緩存 KV 向量共用的壓縮隱特征K 向量多頭共享的帶位置編碼的向量 為什么帶有位置信息的 Q 向量來自于隱特征向量,而帶有位置的 K 向量來自于 H 向量且共享呢? 最好的方法肯定是從H向量直接計算并且不共享,但是會大大增加顯存使…

檢索增強技術RAG和向量數據庫技術的優勢和劣勢,應用范圍和價值

RAG 和向量數據庫在技術棧中處于不同層級,前者側重生成任務的準確性與動態性,后者專注檢索效率與擴展性。在實際應用中,二者常協同工作,但也可獨立服務于不同場景。企業需根據需求選擇:若需生成內容,RAG 是…

Python爬蟲教程013:使用CrawlSpider爬取讀書網數據并保存到mysql數據庫

文章目錄 3.8 CrawlSpider介紹3.9 CrawlSpider爬取讀書網案例3.9.1 創建項目3.9.2 定義要爬取的數據結構3.9.3 獲取數據3.9.4 保存數據到本地3.9.5 保存數據到mysql數據庫3.9.6 完整項目下載3.8 CrawlSpider介紹 CrawlSpider 是 Scrapy 框架中 最常用的高級爬蟲類之一,用于構…

Three.js 系列專題 5:加載外部模型

內容概述 Three.js 支持加載多種 3D 文件格式(如 GLTF、OBJ、FBX),這讓開發者可以直接使用專業建模軟件(如 Blender、Maya)創建的復雜模型。本專題將重點介紹 GLTF 格式的加載,并調整模型的位置和材質。 學習目標 理解常見 3D 文件格式及其特點。掌握使用 GLTFLoader 加…

P1006 [NOIP 2008 提高組] 傳紙條 題解

題目傳送門 前言 每次準備摸魚時都在這道題的界面。 今天有空做做,順便寫一波題解,畢竟估值蹭蹭往下跳。 雙倍經驗:P1004 [NOIP 2000 提高組] 方格取數,P1006 [NOIP 2008 提高組] 傳紙條。 題意簡述 現有一個 m m m 行 n …

LLM架構解析:長短期記憶網絡(LSTM)(第三部分)—— 從基礎原理到實踐應用的深度探索

本專欄深入探究從循環神經網絡(RNN)到Transformer等自然語言處理(NLP)模型的架構,以及基于這些模型構建的應用程序。 本系列文章內容: NLP自然語言處理基礎詞嵌入(Word Embeddings&#xff09…

ffmpeg提取字幕

使用ffmpeg -i test.mkv 獲取視頻文件的字幕流信息如下 Stream #0:4(chi): Subtitle: subrip (srt) (default) Metadata: title : chs Stream #0:5(chi): Subtitle: subrip (srt) Metadata: title : cht Stream #0:6(jpn)…

Python設計模式:構建模式

1. 什么是構建模式 構建模式(Builder Pattern)是一種創建型設計模式,它允許使用多個簡單的對象一步步構建一個復雜的對象。構建模式通過將構建過程與表示分離,使得同樣的構建過程可以創建不同的表示。換句話說,構建模…

使用 VIM 編輯器對文件進行編輯

一、VIM 的兩種狀態 VIM(vimsual)是 Linux/UNIX 系列 OS 中通用的全屏編輯器。vim 分為兩種狀態,即命令狀態和編輯狀態,在命令狀態下,所鍵入的字符系統均作命令來處理;而編輯狀態則是用來編輯文本資料&…

GaussDB回調機制深度實踐:從事件驅動到系統集成

GaussDB回調機制深度實踐:從事件驅動到系統集成 一、回調機制核心概念 回調類型矩陣 二、核心實現技術棧 觸發器回調開發 sql -- 創建審計觸發器回調 CREATE OR REPLACE FUNCTION audit_trigger() RETURNS TRIGGER AS $$ BEGININSERT INTO audit_log (operati…

AI小白:AI算法中常用的數學函數

文章目錄 一、激活函數1. Sigmoid2. ReLU(Rectified Linear Unit)3. Tanh(雙曲正切)4. Softmax示例代碼:激活函數的實現 二、損失函數1. 均方誤差(MSE)2. 交叉熵損失(Cross-Entropy&…

idea 打不開terminal

IDEA更新到2024.3后Terminal終端打不開的問題_idea terminal打不開-CSDN博客

Python代碼list列表的使用和常用方法及增刪改查

Python代碼list列表的使用和常用方法及增刪改查 提示:幫幫志會陸續更新非常多的IT技術知識,希望分享的內容對您有用。本章分享的是Python基礎語法。前后每一小節的內容是存在的有:學習and理解的關聯性,希望對您有用~ python語法-p…

Open CASCADE學習|讀取點集擬合樣條曲線(續)

問題 上一篇文章已經實現了樣條曲線擬合,但是仍存在問題,Tolerance過大擬合成直線了,Tolerance過大頭尾波浪形。 正確改進方案 1?? 核心參數優化 通過調整以下參數控制曲線平滑度: Standard_Integer DegMin 3; // 最低階…