详解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…

如何解析MySQL中的redolog日志?

解析MySQL中的redolog日志比解析binlog更为复杂,因为redolog是InnoDB存储引擎特有的,以物理格式记录数据库的更改,主要用于恢复未提交的事务和加速数据恢复。由于其物理和二进制的特性,redolog没有直接可读的SQL语句或简单的解析工…

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) 改正:文件名和…

如何与回避型依恋人格的人谈恋爱

先讲是什么。 有些人在恋爱中碰到对方比较冷淡,遇到矛盾爱回避就认为是回避型依恋,这肯定是不对的。事实上,每个人人性中都会有回避的一部分,当自身的情感需求不强时,面对过于沉重的爱或是无法解决的矛盾,…

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

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

私域裂变的10种玩法

1.邀请有礼 邀请有礼是一种常见且有效的拉新方式,通过福利诱饵,刺激老用户邀请新用户,实现用户快速扩张。 在私域中,这种方式也非常普遍,但需要成本,因此裂变成功的门槛需要设定。通常需要裂变对象完成消…

【NC16622】多项式输出

题目 多项式输出 模拟,注意细节 思路 一道模拟题,按要求模拟即可,没有算法上的难度,有的是动手的复杂性。这本来可以直接在主函数中写处理过程的,但是为了其更有通用性,在这里将其提取为一个函数&#xf…

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

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

【网络建设与运维】2024年浙江省职业院校技能大赛中职组“网络建设与运维”赛项规程

培训、环境、资料、考证 公众号:Geek极安云科 网络安全群:775454947 网络系统管理群:223627079 网络建设与运维群:870959784 极安云科专注于技能提升,赋能 2024年广东省高校的技能提升,受赋能的客户院校均…

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

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