在面向对象的编程中,一切皆对象,字符串是对象,列表是对象,函数也是对象
变量
拿字符串举例,创建一个字符串,Python就在内存中创建一个字符串对象
'string' # 在内存中创建字符串对象
'string'
# 看起来是将字符串赋予变量s,实际上是将字符串对象'string'的引用指向了s,
# 因此变量s指向了对象'string'
s = 'string'
那么对于函数呢:
abs(-10) # 函数调用
10
abs # 函数本身
<function abs>
因为一切皆对象,所以函数也是对象,那么函数在创建的时候也是在内存中创建了一个求取绝对值的函数对象,那么函数名是什么呢,由上面字符串的例子可以猜测,函数名也是一个变量,该变量是对函数对象的引用。
f = abs # 将函数赋予变量f
f(-200) # 通过变量f调用求取绝对值的函数
200
另一个问题来了,看下面:
def output(s):
print('变量s指向的对象是:{}'.format(s))
output(s)
变量s指向的对象是:string
传入函数
可以看到指向字符串的变量可以作为参数传入函数,其他的诸如列表、字典等也可以作为参数传入函数,那么指向函数的变量是否也可以传入函数呢?
def func(f, num):
return f(num)
func(abs, -202)
202
def div_2(num):
return num / 2
func(div_2, 854)
427.0
我们将函数abs作为参数传入了函数func,也可以将自定义的函数作为参数传入了func
输出函数
函数可以输出变量,那么是否可以输出函数呢?
def out_func(x):
def power_fun(y):
return y ** x
return squ_fun
print(out_func(3))
<function squ_fun at 0x7f5ec0867510>
返回了函数squ_fun(),该函数相当于一个求取立方的函数,返回下面的函数
def power_fun(y):
return y ** 3
print(out_func(3)(3)) #调用返回函数
27
上面的相当于先获得一个求取立方数的函数,在调用求取立方数的函数,在打印结果
所以可以接受函数作为参数的函数,或者输出函数的函数称为高阶函数