Python 一等函数

Python 一等函数

在 Python 中,不仅整数、字符串、字典是一等对象,连函数也被当做一等公民。这说明了什么问题,先来看看一等对象的定义:

在运行时创建

能赋值给变量或数据结构中的元素

能作为参数传给函数

能作为函数的返回结果

那么,也就意味着 Python 函数是对象,是 类的实例。这篇文章从函数的属性、参数等几个方面拆解并分析 Python 函数。

Python 的可调用对象

首先看看 Python 中可直接调用的对象。我们知道,调用函数的方法是用调用运算符 ,那么判断一个对象是否可调用,就是判断 能否应用到该对象上,可以使用内置的 函数。

Python 数据模型文档列出了 7 种可调用对象:用户定义的函数、内置函数、内置方法、方法、类、类的实例、生成器函数。

上述 7 种对象中,函数天生就是可以调用的,方法是类中定义的函数,而创建类的实例就是直接调用了类(其实是运行类的 方法,然后运行 方法初始化实例)。比较难理解的是类的实例,类的实例是通常意义上的对象,对象可调用的前提是类中定义了 方法。看个吧:

运行结果:

提示 不可被调用。在 类中定义下面这个方法:

运行结果:

所以,只要定义了方法 ,任何 Python 对象都可以表现得像函数。

函数的属性

我们可以通过 函数来探知 Python 函数具有哪些属性:

其中,大部分属性是 Python 对象共有的,但这里我们主要讨论几种类的实例没有,但函数有的属性:

函数的参数

Python 比较强大的特性之一是提供了非常灵活的参数处理机制。而 Python3 进一步提供了仅限关键字参数。

仅限关键字参数

在 Python 中调用函数时使用 和 “展开” 可迭代对象,映射到单个参数。 表示将调用时的多个参数放入元组中,而 表示将关键字参数放入一个字典中。

用说话:

运行结果:

上面中的函数还可以这样调用:

当想指定仅限关键字参数时,可以将指定的关键字参数放在 后面,比如:

运行结果:

函数参数的信息

接下来我们看看函数参数的相关信息,来更好的理解函数。

结合函数的属性一节,我们知道函数的 属性存放着函数形参的默认值而 属性则存放的是仅限关键字参数的默认值; 属性存放函数的名称; 属性存放的是编译成字节码的函数元数据和函数定义体,(好吧看不懂),没关系,只需要知道 是一个 对象引用,和自身的两个属性: 和 就足够装 B 了。

结合做简单说明:

先看运行结果:

结合运行结果可以看出 记录的是该函数的所有参数,包括传参和函数内定义的局部变量;而 记录的是形式参数的个数,可以看出不包含关键字参数。更多关于函数参数的分析可以引用 Python 的 模块来提取函数的前面,感兴趣可以研究研究,这里不做详解。

函数注解

Python3 提供了一种句法,用于为函数声明中的参数和返回值附加元数据,就是函数注解,目的是更方便的进行文档编写、参数检查等。这是个可选项,入参的注解在参数后加个 即可,而返回值的注解需要在 和 直接添加 和一个表达式。上面 添加注解如下:

需要说明的是,函数注解仅仅在函数的 属性中做了存储,除此之外 Python 不做检查、不做验证、不做强制,没有任何处理。换句话说,注解只是元数据,可以供 IDE 、框架和装饰器等工具使用。

高阶函数和匿名函数

了解了 Python 函数的以上特性之后,我们就可以利用一等函数的特性实现函数式风格编程了。

高阶函数

函数式风格编程的特点之一就是高阶函数,那么什么是高阶函数呢?既然 Python 函数是一等公民,那么 TA 既可以作为函数参数传入,也可以作为结果返回。而接受函数为参数,或者把函数作为结果返回的函数,我们称之为高阶函数。Python 中最为人熟知的高阶函数有: 、 、 、 。

函数的传参:函数和一系列可迭代对象;返回一个 对象;函数的操作是将第二个参数(可迭代对象)的每个元素代入第一个参数(函数)中,得到的结果作为函数返回值。如下:

运行结果:

需要说明的是, 传参中,可迭代对象有几个,取决于第一个函数有多少参数,用上面的说就是 和 分别作为 的第一和第二个参数,可迭代数量按最少的算。由于返回值 是个 对象,需要 一下,才能得到所有的返回结果。

和 不同的是, 的传参 function 必须有两个参数;返回值就是 function 的返回值类型;函数的操作是:用 function 先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,直到计算完所有元素,最后得到一个结果。

运行结果:

需要注意的是, 在 Python3 中从全局名字空间中被移除了,需要先引入。

函数本身只接受一个列表来排序,但因为其可选参数 接受函数来应用到列表的各个元素上进行排序,所以摇身一变成了高阶函数(2333333)。看个:

运行结果:

由运行结果可以看出, 函数仅仅将 这个列表中的每个值代入到 函数中,针对结果对原列表进行排序,并没有改变列表中的值。

函数的操作是将 中的元素分别代入 中,将结果为 True 的返回。

匿名函数

为了更好的使用高阶函数,有时候创建一些小型的函数更为便利,这时候匿名函数的作用就体现出来了。

匿名函数主要是用关键字 ,语法为:

上面这个用数学表达式可以写成: ,这样理解就方便多了, 相当于数学函数中的 , 后的表达式的计算结果为匿名函数的返回值。这种简单的语法也意味着 函数只支持纯表达式,不能赋值,不能用 等 Python 语句。

当然, 表达式也支持多参数,比如:

用数学表达式写成: 。

句法只是语法糖:与 语句一样, 表达式会创建函数对象。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180527G1FO2S00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券