引言
在编程语言中,有所谓“一等公民(First-Class Citizen)”的说法,用来描述某些实体在语言中的特性和地位。在我看来,所谓一等公民,自然是在程序中能够出现的地方比较多。比如,能够赋值给变量、能够作为函数参数等。
而在Python中,一切皆对象,函数和类也是对象,那么函数和类也是一等公民,在Python中,自然是题中应有之义。
本文打算以函数为例,来说明下函数在Python中也是一等公民,类也是类似的。
一等公民的条件
在编程语言中,如果一个实体是一等公民,那么至少应该具有以下条件:
- 可以赋值给变量:将该实体赋值给一个变量,从而可以通过该变量来引用它。
- 可以作为参数传递:可以将该实体作为参数传递给函数。
- 可以作为函数返回值:可以将该实体作为函数的返回值返回。
- 可以存储在容器中:可以将该实体作为元素存储在列表、字典等数据结构中。
将函数赋值给变量
在Python中,可以将函数赋值给一个变量,从而可以通过该变量来进行函数的调用:
def say_hello():
print('hello')
a = say_hello
print(a)
print("0x%x" % id(a))
a()
输出结果:
可以看到,函数通过变量调用成功,并且可以看到函数确实是一个对象。
将函数作为参数传递
可以将函数对象作为参数传递给其他函数,这种特性在函数式编程中非常常见。比如:
# 定义一个二元运算的函数
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中,还可以将函数作为另一个函数的返回值,这种特性可以用来构建高阶函数和闭包,这个在后面遇到时,再次展开来说,本文只演示一下:
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))
输出结果:
将函数作为元素存储到容器中
函数对象,同其他对象一样,也可以作为元素存储到容器对象中:
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中的一等公民的演示,可以看出,在Python中,函数对象如同其他数据类型一样,可以很灵活地应用在各个场景中。
类对象作为Python中的对象,也与函数极为类似。
在后续的文章中,我们会将函数的基础用法及一些实用的高阶用法,逐步展开。