Python笔记 · First-Class Functions | 函数是“一等”的

Posted bluishglc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python笔记 · First-Class Functions | 函数是“一等”的相关的知识,希望对你有一定的参考价值。

“函数是一等(First-Class)的”是众多函数式编程语言的基本特性,Python具备一定的函数式编程语言特性,其中就包括了将函数视为“一等对象”这一特性,即函数与对象、类具有等同的地位,具体体现为:

  • 一个函数就是一个Object类型的实例
  • 你可以在函数中定义和存储变量
  • 你可以把函数作为变量进行赋值和传递
  • 你可以把函数作为参数传递给另一个函数
  • 你可以把函数作为返回值从一个函数中返回

在Python中,函数作为与对象地位相同的“一等”公民,是有最基本的“资格认证”的:函数也拥有对象模型的三个通用属性:id、类型、值。看下面这段代码:

>>> def my_fun():
...     print("This is a function")
...
>>> my_fun()
This is a function
>>>
>>> # show id of my_fun
>>> id(my_fun)
2531602861944
>>>
>>> # show type of my_fun
>>> type(my_fun)
<class 'function'>
>>>
>>> # show value of my_fun
>>> my_fun
<function my_fun at 0x0000024D6F4A0F78>
>>>

当我们在函数明后使用()时就是在调用/执行函数,但当仅仅使用函数名不带()时,就是单纯地引用函数(对象)本身了,此时,它可以赋值给另一个变量,也可以作为参数传递或作为返回值返回。

反过看,既然函数本质上已经是一个对象了,那么一个类(对象)也可以很容易地“成为”一个函数:即使用方法和调用函数一样。做法就是实现__call__这个dunder方法,例如这样:

class Add:
    def __init__(self, n):
         self.n = n
    def __call__(self, x):
        return self.n + x

以下是调用代码

...
>>> add = Add(1) # 实例化
>>> add(4) # 在对象后再接一个`()`,填入必要的参数,此时会调用`__call__`方法
5
>>>

从这个示例中我们可以看到,在Python中,函数和对象实际上是双向打通的!地位是一样的,且可以相互转换。

以上是关于Python笔记 · First-Class Functions | 函数是“一等”的的主要内容,如果未能解决你的问题,请参考以下文章

python学习笔记:装饰器2

First-Class Functions

Python 学习笔记 - 装饰器

First-class citizen

python的闭包装饰器和lambda等(笔记)

First-class citizen