Python 纯函数,函数式编程简洁明了,因为函数可以用作其他函数的参数或者返回值,后续会给出很多这样的例子。

要做到这一点,函数必须是运行时环境中的头等对象。在C等语言中,函数不是运行时中的对象,然而在Python中,函数通常是通过def语句创建的对象,且其他函数可以使用。我们还可以通过创建可调用对象,或者将lambda表达式赋给变量来创建函数。

创建函数即创建一个带有属性的对象,如下所示。

这里我们创建了一个对象:example,其为function类。此对象包含很多属性,与该函数对象关联的__code__对象也含有自己的属性。其具体实现细节不重要,重要的是Python中的函数是头等对象,我们完全可以像处理其他对象一样处理函数,比如上面的代码示例展示了函数对象的其中两个属性。

纯函数

为了提高程序可读性,使用的函数要尽量没有副作用,即所谓的“纯函数”。使用纯函数的好处包括可以通过改变求值顺序实现优化,而其最重要的优势在于概念简单、测试方便。

在Python中,编写纯函数式代码要求代码的作用域为本地,具体而言,就是避免使用global语句。nonlocal语句的使用也可能对作用域产生副作用,也应留意,虽然副作用限制在一个嵌套函数里。实际上,达到这些要求并不难。可以把纯函数看作普通的Python编程实践。

并没有简单的方法能保证Python函数没有副作用,编码时不小心违反了纯函数规则也是常有之事。如果实在担心可能违反规则,可以写一个函数,使用dis模块扫描给定函数的__code__.co_code属性,即编译后的代码,检查是否包含全局引用。它能对内部闭包和__code__.co_freevars元组方法的使用给出提示。然而为了避免极少出现的情形而运用这类复杂的技术有些得不偿失,因此后续不会展开讨论。

Python的lambda表达式是纯函数。虽然不太推崇,但确实可以通过lambda表达式创建纯函数。

将lambda表达式赋给变量以创建函数的示例如下。

将lambda表达式赋给变量mersenne,即可得到一个纯函数,实际上是一个包含单一参数x,并返回单个值的可调用对象。因为lambda表达式中不能包含赋值语句,所以它总为纯函数,适用于函数式编程。

高阶函数

使用高阶函数可以使程序简洁明了。高阶函数以其他函数为参数,或者用函数作为返回值。我们可以使用高阶函数将简单的函数组合成复合函数。

以Python的max()函数为例,我们可以提供一个函数作为其参数,来改变max()函数的行为。

待处理的数据如下。

可以如下所示使用max()函数。

其默认行为会比较列表中的每个元组,按元组下标为0的元素比较大小,返回最大的元素所在的元组。

由于max()函数是高阶函数,因此可以添加一个函数作为其参数。这里用一个lambda表达式作为它的函数参数,如下所示。

在这个例子中,max()函数用lambda表达式定义的函数作为比较依据,返回了下标为1的最大元素所在的元组。

Python提供了许多高阶函数,后面会介绍Python提供的许多高阶函数以及编写高阶函数的方法。

python使用复合语句def创建函数对象_Python 纯函数相关推荐

  1. python使用复合语句def创建函数对象_【收藏】Python实用技巧-成为Pythoner必经之路...

    前言 本文主要记录 Python 中一些常用技巧,所描述的是告诉你怎么写才是更好?  如果你并不熟悉Python语法,希望你能在下面代码片段中看到Python的简单.优雅; 如果你象我这样,对 Pyt ...

  2. python迭代函数例题_python map 函数使用,遍历访问可迭代对象

    1. 功能介绍 map 调用函数遍历可迭代对象,返回一个迭代器对象 map(function, iterable, ...) 可以传递多个迭代器对象给 map 的迭代函数,这个函数接收参数的个数必须和 ...

  3. python创建子类对象会先创建父类对象_Python练习,python,习题

    代码判断 line2错 是因为too many values to unpack,这个错误.Python2可以改为a, b, c = raw_input(), raw_input(), raw_inp ...

  4. python创建文件对象_python基础教程:文件读写

    在Linux系统中,一切都是文件.但我们通常说的文件是保存在磁盘上的图片.文档.数据.程序等等.而在程序的IO操作中,很多时候就是从磁盘读写文件.本节我们讲解Python中的文件对象如何操作文件. 创 ...

  5. Python基础知识:def创建函数

    大家好,我是梁同学. 今天给大家的话题是如何使用def函数创建一个函数. 目录 第一章 什么是函数 第二章 函数的参数 1.无参数 2.单参数 3.多参数 第三章 函数返回值 1.无返回值 2.单返回 ...

  6. python 返回函数对象_Python—函数对象与闭包

    一 函数对象 函数对象指的是函数可以被当做"数据"来处理,具体可以分为四个方面的使用. 1.1 函数可以被引用 def index(): print('from index') a ...

  7. python可变参数和关键字参数位置_python笔记——函数的参数(位置参数、默认参数、可变参数、关键字参数、命名关键字参数、参数组合)...

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...

  8. python 函数进阶_python之函数进阶

    1. 今日内容 1.1 函数的参数 *的魔性用法 函数形参最终顺序 1.2名称空间 全局名称空间,局部名称空间,内置名称空间 取值顺序与加载顺序 作用域 内置函数:globals() locals() ...

  9. 王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包

    转载请注明出处:王亟亟的大牛之路 本来打算把工作的事周末做掉点,但是发现在外面浪并不能迅速集中投入,为了避免不必要的BUG 还是明天在家做吧,那么久写一篇Python的文章吧,毕竟背着Mac出门不做些 ...

最新文章

  1. c++ 窗体上输出文字_C/C++经典面试题
  2. MySQL主从失败 错误Got fatal error 1236
  3. Log4j 1使用教程
  4. MVC基于角色权限控制--菜单展示
  5. synchronized 与 ReentrantLock
  6. gwt入门和进阶_GWT入门
  7. 张震博士:SDT是未来安防发展方向
  8. html5 打包ios.上架,iOS帮客户打包App上架的正确姿势
  9. visual2019没有勾选的在如何加入_没有预留期权池,如何激励新加入者?
  10. 怎样退出python的交互环境_python交互界面的退出方法
  11. Reflector反编译winform心得
  12. c语言打印字符数据在屏幕上,在屏幕上输出各种类型的数据
  13. excel表格末尾添加一行_Excel2007:给excel表格添加边框线
  14. 惊喜来袭~进阶版《看漫画学Python 2:有趣、有料、好玩、好用》
  15. 西门子主程序调用子程序_子程序编程举例说明-广数m98调用子程序实例-西门子子程序调用实例...
  16. bzoj1627 / P2873 [USACO07DEC]泥水坑Mud Puddles
  17. 练习孙氏太极拳的感悟
  18. 消息队列RabbitMQ基本使用(Java代码实现)
  19. Linux 使用rm -rf /*命令后,恢复系统方法
  20. java图片不失真压缩_(转)图片等比压缩,确保不失真

热门文章

  1. 软件验收标准和验收方法_装饰装修工程质量验收标准专题讲座
  2. mysql count和limit,COUNT与LIMIT在mysql查询
  3. 完全弄懂如何用pycharm安装pyqt5及其相关配置
  4. node mysql查询回调_nodejs 数据库查询回调问题
  5. python循环绘制六角星_《Python游戏趣味编程》 第3章 美丽的圆圈画
  6. 使用可自定义的定期计划自动执行数据库备份
  7. 使用dotMemory Unit发现并修复内存问题
  8. python绘制正态分布函数_Python数据清洗(三):异常值识别与处理
  9. VisualStudio安装
  10. 初步创建vue/cli工程教程