详解Python内建函数map()和reduce()

Python内建了map()和reduce()函数。

我们先看map。map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

现在,我们用Python代码实现:

>>> def f(x):...     return x * x
...>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

你可能会想,不需要map()函数,写一个循环,也可以计算出结果:

L = []for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:L.append(f(n))
print(L)

的确可以,但是,从上面的循环代码,能一眼看明白“把f(x)作用在list的每一个元素并把结果生成一个新的list”吗?

所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把这个list所有数字转为字符串:

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

只需要一行代码。

再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方说对一个序列求和,就可以用reduce实现:

>>> from functools import reduce
>>> def add(x, y):...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])25

当然求和运算可以直接用Python内建函数sum(),没必要动用reduce。

但是如果要把序列[1, 3, 5, 7, 9]变换成整数13579,reduce就可以派上用场:

>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

这个例子本身没多大用处,但是,如果考虑到字符串str也是一个序列,对上面的例子稍加改动,配合map(),我们就可以写出把str转换为int的函数:

>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> def char2num(s):
...     digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
...     return digits[s]
...
>>> reduce(fn, map(char2num, '13579'))
13579

整理成一个str2int的函数就是:

from functools import reduceDIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}def str2int(s):def fn(x, y):return x * 10 + y    def char2num(s):return DIGITS[s]    return reduce(fn, map(char2num, s))

还可以用lambda函数进一步简化成:

from functools import reduceDIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}def char2num(s):return DIGITS[s]def str2int(s):return reduce(lambda x, y: x * 10 + y, map(char2num, s))

也就是说,假设Python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】结构体详解

文章目录 1、前言2、结构体变量的创建和初始3、结构体的特殊声明3、结构体的自引用5、结构体的内存对齐5.1 对齐规则5.2 为什么存在内存对齐?5.3 修改对齐数 6、结构体实现位段6.1 什么是位段6.2 位段的内存分配6.3 位段的跨平台问题6.4 位段的应用6.5 位段使用的注意事项 7、…

春耕农业气象环境监测站来帮忙

春耕春种,是大地苏醒的序曲,是生机盎然的交响乐章。在这播种希望、耕耘未来的美好时节,{鸣乔电子科技}农业气象环境监测站犹如一位贴心的助手,为农业生产保驾护航。 随着科技的进步,农业气象环境监测站不再是简单的温…

前端必会的一些基础

1、如何把obj对象 添加到arr数组对象内 2、手机号、邮箱、隐藏用户手机号中间四位正则 3、两个数组 数组a未全部人员 数组b为已选中人员 默认选中 4、数组去重、 5、localStorage 存取 数组 方法 6、数据filter过滤 7、请求接口时header 请求格式不对 需要怎么转换&#xf…

电脑桌面便签软件,好用的电脑桌面便签工具

在数字化时代,我们的工作效率在很大程度上依赖于所选工具的优劣。优秀的工具能助力我们事半功倍,而低效的工具则可能导致我们陷入冗杂操作,白白耗费大量时间。在此,我要向大家推荐一款极为出色的电脑桌面便签软件--好用便签。 好…

java.lang.RuntimeException: java.lang.IllegalArgumentException

填上红框内容,亲测可行 报错如下: java: java.lang.IllegalArgumentException java.lang.RuntimeException: java.lang.IllegalArgumentExceptionat com.sun.tools.javac.main.Main.compile(Main.java:553)at com.sun.tools.javac.api.JavacTaskImpl.do…

【EPLAN】授权-MAX100.17问题解决

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决EPLAN 客户端授权连接时出现-MAX100.17 报错问题; 2、 问题场景 用于解决在EPLAN 客户端授权连接时,出现-MAX100.17 报错:无法建立与EPLAN Client Service[MAX 100.17] 的连…

【MATLAB源码-第9期】基于matlab的DQPSK的误码率BER和误符号率SER仿真。

操作环境: MATLAB 2022a 1、算法描述 DQPSK信号的解调与2DPSK信号的解调类似,也有两种方法,分别是极性比较法和相位比较法 极性比较法。其原理方框图如下图所示。由于DQPSK信号可以看做是两路2DPSK信号的合成,解 调时也可以分别…

Python:基础语法

一、import与from.....import 有时候我们需要使用一些第三方库或包时,我们就需要通过import或from.....import导入模块。 # 导入库 import sys print("hello,world") 当我们自己写了些函数,在其他py文件,我们也可以通过from.....im…

Anaconda配置系统环境

首先,右键此电脑,点击属性 点击高级系统设计 点击环境变量 点击环境变量中系统环境下的Path,双击 如下图,添加这四项即可,注意,这都是Anaconda的安装目录下的内容 在windowsR的cmd情况下,输入co…

动归专题——斐波纳契模型和路径问题

前提 本专题开始,注重整理与动态规划相关的题目,从简单的动归开始切入,慢慢掌握和练习动态规划这一重要的算法思想,部分相对复杂的题目会结合画图和代码分析去解释 一、第N个泰波纳契数列 1.链接 1137. 第 N 个泰波那契数 - 力…

C# NumericUpDown 控件正整数输入控制

用到了控件的 KeyPress 和 KeyUp事件。 KeyPress 中控制输入“点、空格,负号”; KeyUp 中防止删空,以及防止输入超过最大值或最小值 。 private void nudStart_KeyPress(object sender, KeyPressEventArgs e){numericUpDownKeyPress(sender…

Python时间

UTC ~ 北京时间 【差8小时】 格式化日期时间为字符串:strftime 时间戳-1970.1.1到现在的秒数:time.time() AttributeError: partially initialized module ‘datetime’ has no attribute ‘fromtimestamp’ (most likely due to a circular import) 改正:文件名和…

合同起草、审查耗时费力?君子签智能电子合同让签署事半功倍

在合同签署过程中,着急和客户签约,却找不到合适的内容范本?法务审查合同只能逐字逐句审查,效率太慢?合同需要客户、法务、负责人等多方参与,修改内容难以一一对应?合同涉及的工资、费用、价格等…

WordPress网站已经安装了SSL证书,但浏览器仍然提示不安全

WordPress网站已经安装了SSL证书,但浏览器仍然提示不安全 昨天我们新建了一个WordPress的网站,在已经安装了SSL证书的情况下,访问网站仍然会提示不安全。 我们使用的是Hostease提供的虚拟主机产品,之前从未出过这样的情况&#x…

用友BI方案:一键搞定财务、销售、生产等分析

别人家做用友的数据分析,从零开始搭建分析模型、设计BI数据可视化报表,反复测试修改,耗时耗力,效果未知。奥威BI做用友的数据分析,用用友BI方案,注册、下载执行,自动取数、计算指标、分析数据、…

达梦数据库自动备份(全库)+还原(全库) 控制台

一 前提 1.安装达梦数据库DB8(请参照以前文章) 我的数据库安装目录是 /app/dmDB8 2.已创建实例 (请参照上一篇文章) 二 准备测试数据 三 自动备份步骤 1.开启归档模式 开启DM管理工具管理控制台 弹不出来工具的 输入命令 xhost 第一步 将服务器转换为配置状态 右键-&g…

后端常问面经之Spring和Mybatis框架

Spring的IOC介绍一下: 所谓控制就是对象的创建、初始化、销毁。 创建对象:原来是 new 一个,现在是由 Spring 容器创建。 初始化对象:原来是对象自己通过构造器或者 setter 方法给依赖的对象赋值,现在是由 Spring 容器…

AI研报:从Sora看多模态大模型发展

《从Sora看多模态大模型发展》的研报来自浙商证券,写于2024年2月。 这篇报告主要探讨了多模态大模型的发展趋势,特别是OpenAI发布的视频生成模型Sora,以及其对行业发展的影响。以下是报告的核心内容概述: Sora模型的发布&#x…

面试算法-103-对链表进行插入排序

题目 给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序…

基于单片机的太阳能充电系统设计

摘要:本文所设计的太阳能充电系统主要由以下几个模块组成:STC89C52 主控模块、TP4056 充电电路、电压AD 采集模块、LCD1602 液晶显示模块和太阳能充电电池等组成。此太阳能充电器制作简单,性价比高,性能稳定。 关键词:LCD1602;太阳能充电系统;ADC0832 太阳能充电系统的充…