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.mzph.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; // 最低阶…