python中如何编写代码输入多个数据并把它们放在一个列表中去_10分钟学习函数式Python...

24ca44e4b0d7fad13c25f2841f7ba1fe.png

在这篇10分钟的文章中,您将学习Python中的函数式范型。您还将学习列表推导式。

目录

  1. 函数式范式
  2. Python的map函数是如何运行的
  3. Python中的lambda表达式
  4. Python中的reduce函数
  5. filter函数
  6. Python中的高阶函数
  7. 带有函数的部分应用
  8. 函数编程不是Python化
  9. 列表推导式
  10. 任何可迭代对象的推导式
  11. 结论

函数式范式

在命令式编程范式中,我们通过给计算机一个任务序列来执行任务,然后计算机会执行这些任务。在执行它们时,计算机可以改变状态。例如,我们设A = 5,然后改变A的值。因为我们的A是变量,所以它内部的值是变化的。

在函数式编程范式中,我们不告诉计算机去做什么,而是告诉它是什么东西。一个数的最大公约数是什么,等等。

变量不会变化。一旦我们设置了一个变量,它就会永远保持这种状态。因此,函数在函数式范型中没有副作用。副作用就是函数改变了它外部的东西。让我们来看一个例子:

0f836916e6c3d3f54b35d6bec4d8ccdf.png

输出是5。在函数式范型中,改变变量是一个很大的禁忌,而让函数影响它们范围之外的东西也是一个大大的禁忌。函数唯一能做的就是计算某些东西并返回它。

现在您可能会想“没有变量,就没有副作用?为什么这很好?”问得好,读这篇文章的古怪陌生人。

如果一个函数使用相同的参数被调用两次,那么它肯定会返回相同的结果。如果您学过数学函数,您就会喜欢这一点。我们称之为函数的引用透明性。由于函数没有副作用,如果我们构建一个计算程序,我们就可以加快该程序的速度。如果程序知道func(2)等于3,我们可以将其存储在一个表中。这将防止程序在我们已经知道答案的情况下去运行相同的函数。

通常,在函数式编程中,我们不使用循环,我们使用递归。递归是一个数学概念,它意味着“自食其力”。对于递归函数,该函数将自己作为一个子函数进行调用。下面是Python中递归函数的一个很好的例子:

1f646ed7372d58bcb508866f3e1609da.png

一些编程语言也很。这意味着他们直到最后一秒才开始计算或做任何事情。如果我们编写一些代码来执行2 + 2,一个函数式程序只会在我们需要使用结果时才会计算这个结果。我们很快就会探讨Python中的惰性。

Python的map函数是如何运行的

为了理解映射,让我们首先看看什么是可迭代对象。一个可迭代对象是我们可以迭代的任何东西。这些是列表或数组,但是Python有许多不同的可迭代对象。我们甚至可以通过实现魔术方法来创建我们自己的可迭代对象。一个魔术方法就像一个API,它可以帮助我们的对象变得更Python化。要使一个对象成为一个可迭代对象,我们需要实现2个魔术方法:

abd010ebaafea6f33270e02af5fbe926.png

第一个魔术方法是__iter__,或者叫特殊iter(双下划线)方法,它会返回迭代对象,我们通常在循环开始时使用它。特殊next方法,__next__,会返回下一个对象是什么。

让我们来看看这个:

ac542d05bf1caffd695c8ba29afc433e.png

这将输出:

d0743c179e10df46b58ae31f374c1255.png

在Python中,迭代器是一个对象,它只有一个简单的__iter__魔术方法。这意味着我们可以访问该对象中的位置,但不能遍历该对象。有些对象有魔术方法__next__,但没有__iter__魔术方法,如sets(将在本文后面讨论)。对于本文,我们将假设我们接触的所有东西都是一个可迭代的对象。

现在我们知道了什么是可迭代对象,让我们回到map函数。

map函数允许我们将一个函数应用到一个可迭代对象中的每个项。我们希望将一个函数应用到一个列表中的每个项,但是要知道这对大多数可迭代对象来说都是可行的。map的语法接受两个输入,即要应用的函数和可迭代的对象。

9981ae9fa7c70f36e843a1e9f95594fa.png

假设我们有一个像这样的数字列表:

83a84966d70463476573c93506663d52.png

我们相对每个数字进行平方,我们可以像这样写代码:

383d3651543f3f2c9708f563fd7c69cd.png

函数式Python是惰性的。如果我们不包含list(),函数将存储该可迭代对象的定义,而不是列表本身。我们需要告诉Python“把这个转换成一个列表”,以便我们使用它。

在Python中突然从非惰性求值变成惰性求值是很奇怪的。如果您更多地以函数式思维而不是命令式思维进行思考,您就会习惯它。

现在写一个像square(num)这样的普通函数就很好了,但是它看起来不够好。我们必须定义一个完整的函数才可以在一个映射中使用它吗?好吧,我们可以使用lambda(匿名)函数在map中定义一个函数。

Python中的lambda表达式

Lambda函数是一个只有一行代码的函数,适用于短期内使用。我们经常将它们随同高阶函数,如filter、map和reduce函数,一起使用。这个lambda表达式会对传给它的数字进行平方:

db2d496ee610ce6fd0114175128aa297.png

现在我们来运行这个函数:

203d25f9dc3f07b4b031fd077ed2de92.png

我听到您在说:“Brandon,参数在哪里?这是什么鬼东西?它看起来一点也不像一个函数?”

嗯,这确实很令人困惑,但我可以解释它。我们将某个东西赋值给变量square。这部分:

f1365c1bccce1c239a20fc23f79443f8.png

告诉Python这是一个lambda函数,输入被称为x。冒号之后的任何东西都是我们对输入所执行的操作,它返回的就是这些操作的结果。

为了将我们的平方程序简化成一行,我们可以这样做:

f425effc735c4d8117f806ac6b8d778f.png

在一个lambda表达式中,所有的参数都在左边,而我们要用它们做的事情都在右边。没人能否认,这有点乱。编写只有其他函数式程序员才能阅读的代码是一种乐趣。另外,将一个函数转换成一行程序是非常酷的事情。

Python中的reduce函数

reduce是一个函数,它将给定的函数应用于一个可迭代对象并返回一个东西。通常我们会在一个列表上进行计算,将其缩减至一个数字。Reduce看起来是这样的:

3f39170fcc46e66ef445fa5120691244.png

我们可以(通常也会)使用lambda表达式作为函数。

列表的乘积是每一个数字相乘。编写的程序是这样:

c24b693a4b8ffad1bbc390bbec99c62f.png

但是使用reduce我们可以这样写:

2b6bd6e93e9db0327f195476abcc87dc.png

我们得到了相同的乘积。代码更短,并且具有函数式编程的知识,因此更简洁。

fileter函数

filter函数接受一个iterable并过滤掉我们不希望存在于该iterable中的所有东西。

filter接受一个函数和一个列表。它将该函数应用于列表中的每一项,如果该函数返回True,则不执行任何操作。如果该函数返回False,它会从该列表中删除该项。

语法如下:

a23f04a4d84c468bfb33f89f13862828.png

让我们看一个小例子,没有filter,我们会这样写:

ca6c895f5e2299485143ccf1b5516f61.png

使用filter, 这就变成了:

a7949dd4f654a6a67e86a741dae89fd9.png

Python中的高阶函数

高阶函数可以将函数作为参数并返回函数。一个例子是:

c782c1fe136775946eac4aa5f442148f.png

或者第二个定义,return functions,的一个简单例子是:

5c74c6e17020124356df4172abea85fe.png

高阶函数使非变化变量更容易处理。如果我们所做的只是在一系列函数中传递数据,那么我们就不需要在任何地方存储变量。

Python中的所有函数都是一级对象。当一个对象具有以下特性中的一个或多个时,我们将其定义为一级对象:

  • 在运行时被创建
  • 可以被赋值给一个变量或一个数据结构中的元素
  • 作为参数被传递给函数
  • 作为函数的结果被返回

因此Python中的所有函数都是一级函数,可以作为高阶函数使用。

带函数的部分应用

部分应用(也称为闭包)很奇怪,但是也很酷。我们可以调用一个函数而不提供它需要的所有参数。我们来在一个例子中看一下这一点。我们想要创建一个函数,它接受两个参数,一个基数和一个指数,然后返回基数的指数次方,就像这样:

63c4fcede98ec36eb151ec59a96e3d92.png

现在我们想要一个专用的平方函数,来使用power数求出一个数的平方:

ba0a4b5317d8636dd9b14cee3693b5a3.png

这是可行的,但如果我们想要一个立方函数呢?或者一个4次方函数呢?我们能一直写下去吗?嗯,我们可以。但是程序员是很懒的。如果我们重复地做同一件事时,这是一个信号,表明有一种更快的方法来加快做这些事情的速度,那将允许我们不再重复地做这些事情。我们可以在这里使用部分应用。让我们看一个使用了一个部分应用的平方函数的例子:

4bc04408af80e37a10e94efdc49ae093.png

这难道不酷吗?我们可以通过告诉Python第二个参数是什么来只使用一个参数调用需要两个参数的函数。

我们还可以使用一个循环,来生成一个幂函数,其运行范围可以从立方到1000次幂。

36026e53f24839564e5967d0cbcbb744.png

函数式编程不是Python化

您可能已经注意到了,我们在函数式编程中想要做的很多事情都是围绕列表进行的。除了reduce函数和部分应用外,我们所看到的所有函数都会生成列表。Guido (Python的发明者)不喜欢Python中的函数式的东西,因为Python已经有了自己的生成列表的方法。

如果我们在一个Python IDLE会话中输入“import this”,我们会得到:

818facc681477cd57e8b57c1b3ebea15.png

这就是Python之禅。这是一首关于某些东西Python化意味着什么的诗。这里我们要涉及的部分是:

应该有一种——最好是只有一种——显而易见的方法来做到它。

在Python中,map 与 filter可以做与列表表达式(接下来讨论)相同的事情。这打破了Python之禅中的一条规则,因此函数式编程的这些部分不是“Python式的”。

另一个话题是Lambda。在Python中,lambda函数是一个普通函数。Lambda是语法糖。这两个是等价的:

2bf36a6c804336905387e79d659b240c.png

一个普通函数可以做lambda函数所能做的所有事情,但反过来却不行。一个lambda函数不能完成一个普通函数所能完成的所有工作。

这是一个关于函数式编程为什么不能很好地适应整个Python生态系统的简短讨论。您可能已经注意到我之前提到过列表推导式,我们现在将讨论它们。

列表推导式

之前我提到过,我们可以用列表推导式完成我们可以用map或filter所做的任何事情。这是我们要学习的关于它们的部分。

列表推导式是在Python中生成列表的一种方式。其语法是:

54fa93b0498afca2b787f6b88eb4882a.png

让我们对一个列表中的每个数字进行平方,并以此作为一个例子:

8871dd8e2ae21205be154698e6f4303e.png

好吧,这样我们就可以看到我们如何将一个函数应用到列表中的每一项。我们如何来应用一个filter函数呢?好吧,看看这段之前的代码:

a16c2fdeb46ab64c8653910d7e76e8e1.png

我们可以像这样来把它转换成一个列表推导式:

496afbc475d2e7462c346f2bb30229ba.png

列表推导式支持像这样的if语句。我们不需要再应用很多个函数来得到我们想要的东西了。如果我们试图创造使用列表的机会,那么使用列表推导式可能会更清晰、更容易一些。

如果我们想要对列表中所有小于0的数进行平方呢?那么,使用lambda、map和filter,我们会这样写:

0bc431720f7fe3dfcb939beebd8595b9.png

这有点冗长而复杂。使用一个列表推导式,它就会变成这样:

9c7307994083c258350d5d599228bb22.png

列表推导式只对列表有好处。map和filter作用于任何可迭代对象之上,那是怎么回事呢?我们可以对遇到的任何可迭代对象使用任何推导式。

任何可迭代对象的推导式

我们可以使用一个推导式来生成任何可迭代对象。因为我们使用的是Python 2.7,所以,我们甚至可以生成一个字典(hashmap)。

a3f6faf1ee4b62b0e9d9b04abf0ec54d.png

如果它是一个可迭代对象,我们可以生成它。我们来看集合的最后一个例子。如果您不知道集合是什么,请查看我写的另一篇文章(https://skerritt.blog/a-primer-on-set-theory/ )。其中的TL;DR(集合定义)是:

  • 集合是元素的列表,该列表中没有重复的元素
  • 集合的顺序无关紧要。
93e6743c06a8b3122044b40dcd675493.png

您可能会注意到,集合具有与字典相同的花括号。Python是很聪明的。它会根据我们是否为字典提供额外的值来判断我们写的是一个字典推导式还是一个集合推导式。如果您想了解更多关于推导式的内容,请查看这个可视化指南。

结论

函数式编程是漂亮而纯粹的。函数式代码可以是简洁的,但也可能是混乱的。您应该根据需要去使用它。

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

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

相关文章

c++ mqtt客户端_MQTT详解及百度物接入连接手机测试(含源码) 秦子帅

MQTT简介MQTT定义MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动…

antix linux安装教程,antiX 19.1 发布,轻量级的桌面Linux发行版

antiX是一种轻量级的桌面Linux发行版,以IceWM作为默认窗口管理器,已升级到版本19.1。尽管主要是一个错误修复版本,但新版本还将IceWM更新到版本1.6.3:提供了antiX-19.1错误修复/升级ISO映像。所有新ISO映像都是antiX 19 SysVInit系…

electron增加导航按钮_Electron发布6.0 Released版本

简介在第5版发布仅3个月后,流行的基于JavaScript的跨平台桌面应用程序构建平台达到了第6版,并使用了Chromium 76,Node 12.4和V8 7.6。6.0.0发行说明突破性变化升级到Chromium 76.0.3809.88,Node.js 12.4.0和V87.6.303.22修复了net…

linux u盘刻录软件,Deepin Linux下刻录Windows安装U盘:WoeUSB的介绍和应用

WoeUSB是用于GNULinux的Microsoft Windows USB安装介质工具,用它可以在Deepin等Linux系统下刻录Windows安装U盘。介绍1、特征:支持旧版PC/UEFI引导。支持FAT32和NTFS文件系统。支持使用物理安装光盘或磁盘映像作为源。2、支持的Windows安装映像&#xff…

曲线积分与曲面积分总结_高数下册||知识点总结

知识点总结— 期末来临,你准备好了吗 —高等数学学下一转眼又一学期即将结束期末考试也悄悄地临近了大家都准备好了吗我们为大家带来了高等数学(下)的复习资料来吧,展示!1向量代数与空间解析几何首先我们看到的是向量代数与空间解析几何的重点…

java解析excel文件_1.3.1 python解析excel格式文件

Excel表格Microsoft Excel是Microsoft为使用Windows和Apple Macintosh操作系统的电脑编写的一款电子表格软件。excel文档的基本定义工作薄(workbook)工作表(sheet)活动表(active sheet)行(row): 1,2,3,4,5,6……..列(column): A,B,C,D……..单元格(cell): B1, C1excel文件格式P…

c++ 快速排序_常用排序算法之快速排序

前天给大家分享了归并排序,但是它不是原地排序算法,需要消耗额外的内存空间,今天给大家分享的是江湖无人不知无人不晓的"快排"--快速排序。快排是小生接触开发学会的第一个排序算法快速排序原理快排也用到了分治思想。快排的核心思…

k8s ubuntu cni_手把手教你使用RKE快速部署K8S集群并部署Rancher HA

作者:杨紫熹原文链接:https://fs.tn/post/PmaL-uIiQ/RKE全称为Rancher Kubernetes Engine,是一款经过CNCF认证的开源Kubernetes发行版,可以在Docker容器内部运行。它解决了Kubernetes社区中最常见的问题——安装十分复杂。借助RKE…

linux du -sh 脚本,Linux之shell脚本(2)

Linux之shell脚本(2)一、printf命令:printf是一个把从标准输入的字符按照你所要求的格式输出到标准输出即屏幕的命令.在很多时候,我们可能需要将自己的数据给他格式化输出的。1.格式化输出。(print format)2.命令格式:printf打印格式实际内容…

python异常值删除_python数据清洗中,是如何识别和处理异常值的?

异常值处理是pythonshujuqingxi/ stylecolor:#000;font-size:14px;>python数据清洗中重要的步骤,虽然异常值出现频率比较低,但是如果置之不理的话,还是会对实际项目的分析造成偏差,所以今天小编就跟大家分享pythonshujuqingxi/…

啊哈c语言答案1.3,啊哈C语言编程-第2课-让计算机开口说话

为什么会有计算机的出现呢?我们伟大的人类,发明的每一样东西都是为了帮助我们改善生活。计算机同样是用来帮助我们的工具。想一想,假如你现在希望让计算机帮助你做一件事情,你首先需要做什么?是不是要先与计算机进行沟…

用html5做一个简单网页_用新款ws2812灯带做一个简单的窗花

本文转自:DF创客社区-未经许可不可转载原文链接(附件请于原文下方下载):用新款ws2812灯带做一个简单的窗花-创意生活论坛-DF创客社区​mc.dfrobot.com.cn作者:屌丝王小明很高兴提前拿到了DF即将上架的新品——ws2812灯…

c语言锁屏密码程序,求一个VB锁屏程序的源文件

满意答案nan67182014.07.08采纳率:53% 等级:12已帮助:8369人我原来写的一个缩屏的程序,后来没用,当时只是为了测试透明窗体的.代码给你参考下。功能差一个禁用任务管理器的功能Private Declare Function GetWindowL…

抗侧力构件弹性位移如何计算_说一说现在很火的装配式建筑怎么计算?

装配整体式剪力墙结构体系,其主要预制构件包括承重墙(预制剪力墙)、非承重墙(外填充墙、内隔墙等)、预制楼梯(预制楼梯梯段,端部伸出连接钢筋,伸入叠合平台板,通过叠合现浇形成整体楼梯)、预制阳台板(根据建筑要求,整体…

微软私有云解决方案_微软发布电信云平台 ,互联网巨头争夺5G网络商机

微软发布电信云平台 ,互联网巨头争夺5G网络商机微软公司周一发布了全新的云平台,能够帮助电信运营商更快地构建5G网络,降低成本并向企业客户出售定制服务。这一5G的新平台将在微软云Azure上运行,微软表示使用该平台将降低基础架构…

fanuc机器人编程手册_是谁需要G代码编程机器人?

用G代码编程机器人是一个5,6年前就碰到过的一个概念。当时就有点困惑,不过没有细究为何提出这样的想法。这个问题一直搁置很久也没有想起来主动去了解,去和同行去交流。今天在翻阅西门子自动化产品手册时,看到SINUMERIK产品介绍后…

java各个平台订单动态对接_平台订单丨全国各地最新采购、代加工订单,免费联系对接...

寻求:地铁闸机加工件定制加工需要两种闸机,一种扇门,一种旋转扇门,两必须都按照图纸加工,请仔细审核图纸,欢迎有实力的友商前来洽谈,不符勿扰,谢谢!求购:镀锌…

零基础入门c语言免费教程,C语言零基础急速入门免费教程不定期更新

很多粉丝问我陈老师为什么你会教c语言和java语言?因为名字中”陈“字的汉语拼音中“chen””陈“,和“c”语言是同一个首字母“c”,所以我教“c”语言。又因为同学、学生、粉丝、朋友、同事、亲人们叫我杰哥,汉语拼音中的”jie“&…

python单词什么意思_“逐字逐句”是什么意思?语法在Python中意味着什么?

I see the following script snippet from the gensim tutorial page. Whats the syntax of word for word in below Python script? >> texts [[word for word in document.lower().split() if word not in stoplist] >> for document in documents] 解决方案 T…

平台型时间信号强度曲线_哥测的不是BET,是氮气等温吸脱附曲线

平时经常会说去测个BET,看看材料比表面积多大,孔径分布如何,其实我们测试的并不是BET,而是氮气等温吸脱附曲线,测试得到的数据是氮气等温吸脱附曲线,比表面积、孔径分布都是通过公式计算得到的。所以本文旨…