一. 将函数绑定到不同的名称
Python 中一切皆对象,我们定义的名称仅仅是与这些对象绑定的标识符。函数也不例外,它们也是对象,同样可以被绑定到不同的名称。
>>> def welcome(info):
... print(info)
... return
...
>>>
>>> welcome # 输出函数 welcome 的内存地址
<function welcome at 0x015D4A98>
>>>
>>> f = welcome #将 welcome 的内存地址当做值赋值给变量 f
>>>
>>> f # 输出 f,其实就是输出 welcome 的内存地址
<function welcome at 0x015D4A98>
>>>
>>> f('Hello') # 等同于 welcome('Hello')
Hello
welcome 和 f 指的是同一个函数对象。
【注】 函数名在不带小括号(()
)时,表示的是函数的内存地址。
二. 将函数作为参数(高阶函数)
在 Python 中,将其他函数作为参数的函数称为高阶函数
>>> def addf(x,y): # 求和
... return x+y
...
>>>
>>> def subtract(x,y): # 求差
... return x - y
...
>>>
>>>
>>> def operate( func,x,y): # 高阶函数
... result = func(x,y)
... return result
...
>>>
>>> # 调用高阶函数
...
>>> operate(addf, 34,45)
79
>>> operate(subtract, 34,45)
-11
将函数对象 addf 和 subtract 当做 operate() 的参数进行传递。
三. 将函数作为返回值(返回函数)
函数是一个对象,所以可以作为某个函数的返回值。
>>> def outer(): # 封闭函数
... def inner(n): # 嵌套函数
... sum = 0
... for i in range(1,n+1):
... sum += i
... return sum
... return inner # 返回一个函数对象
...
>>>
>>> f1 = outer()
>>> f1
<function outer.<locals>.inner at 0x015D4AE0>
>>> f2 = outer()
>>> f2
<function outer.<locals>.inner at 0x015D4B70>
>>>
>>>
>>> outer( 5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: outer() takes 0 positional arguments but 1 was given
>>>
>>>
>>> f1(5)
15
>>> f2(10)
55
f 和 f2 不同,这是因为 inner() 是在执行 outer() 期间被定义的,所以第二次的创建对第一次没有影响。
当调用 f(n) 时,才会真正地计算求和结果。