在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 的核心逻…