引言

在编程语言中,有所谓“一等公民(First-Class Citizen)”的说法,用来描述某些实体在语言中的特性和地位。在我看来,所谓一等公民,自然是在程序中能够出现的地方比较多。比如,能够赋值给变量、能够作为函数参数等。

而在Python中,一切皆对象,函数和类也是对象,那么函数和类也是一等公民,在Python中,自然是题中应有之义。

本文打算以函数为例,来说明下函数在Python中也是一等公民,类也是类似的。

一等公民的条件

在编程语言中,如果一个实体是一等公民,那么至少应该具有以下条件:

  • 可以赋值给变量:将该实体赋值给一个变量,从而可以通过该变量来引用它。
  • 可以作为参数传递:可以将该实体作为参数传递给函数。
  • 可以作为函数返回值:可以将该实体作为函数的返回值返回。
  • 可以存储在容器中:可以将该实体作为元素存储在列表、字典等数据结构中。
将函数赋值给变量

在Python中,可以将函数赋值给一个变量,从而可以通过该变量来进行函数的调用:

def say_hello():
    print('hello')


a = say_hello
print(a)
print("0x%x" % id(a))
a()

输出结果:

Python番外篇:函数和类也是一等公民-LMLPHP
可以看到,函数通过变量调用成功,并且可以看到函数确实是一个对象。

将函数作为参数传递

可以将函数对象作为参数传递给其他函数,这种特性在函数式编程中非常常见。比如:

# 定义一个二元运算的函数
def compute(func, a, b):
    return func(a, b)

def my_add(a, b):
    return a + b

def my_multiply(a, b):
    return a * b

print(compute(my_add, 10, 20))
print(compute(my_multiply, 10, 20))

输出结果:

Python番外篇:函数和类也是一等公民-LMLPHP

将函数作为返回值返回

在Python中,还可以将函数作为另一个函数的返回值,这种特性可以用来构建高阶函数和闭包,这个在后面遇到时,再次展开来说,本文只演示一下:

def create_multiplier(times):
    def multiplier(x):
        return times * x
    return multiplier


double_func = create_multiplier(2)
print(double_func(10))
triple_func = create_multiplier(3)
print(triple_func(100))

输出结果:

Python番外篇:函数和类也是一等公民-LMLPHP

将函数作为元素存储到容器中

函数对象,同其他对象一样,也可以作为元素存储到容器对象中:

def my_add(a, b):
    return a + b

def my_subtract(a, b):
    return a - b

def my_multiply(a, b):
    return a * b

def my_divide(a, b):
    return a / b

computers = {
    'add': my_add,
    'subtract': my_subtract,
    'multiply': my_multiply,
    'divide': my_divide
}

print(computers['add'](15, 25))
print(computers['subtract'](15, 25))
print(computers['multiply'](15, 15))
print(computers['divide'](25, 5))

Python番外篇:函数和类也是一等公民-LMLPHP

定义了四则运算的函数,然后将它们放入字典中,通过字典索引到元素,从而完成四则运算。

总结

通过前面的关于函数作为Python中的一等公民的演示,可以看出,在Python中,函数对象如同其他数据类型一样,可以很灵活地应用在各个场景中。
类对象作为Python中的对象,也与函数极为类似。
在后续的文章中,我们会将函数的基础用法及一些实用的高阶用法,逐步展开。

07-16 14:04