Python函数对象
Python 最强大的特性之一是一切都是对象,包括函数。Python 函数是完整的对象。它们可以像对象一样具有属性和方法。函数可以有数据变量,甚至可以在其中写入函数。
这大致意味着,Python 中的函数:
- 有类型
- 可以作为参数发送给另一个函数
- 可用于表达式
- 可以成为字典等各种数据结构的一部分
将函数作为参数发送并结合将它们存储在列表中的能力非常有用。我知道所有这些都很难消化,所以让我们一步一步来。
函数可以作为参数传递
在本教程的其余部分,我们将定义一个“apply”函数,它将以列表L和函数f作为输入,并将该函数应用于列表的每个元素。让我们看看如何调用这个函数:
L = [1, -2, -5, 6.2]print apply(L, abs) # [1, 2, 5, 6.2] # abs应用于传入L的元素 print apply(L, int) # [1, -2, -5, 6]
我们也可以传递一个自定义函数。例如:
# 函数返回一个数的平方 def sqr(num): return num**2 print apply(L,sqr) # [1, 4, 25, 38.440000000000005]
一个名为map的高阶 Python 函数也提供了对元素列表执行相同操作的能力。以其最简单的形式,它接受一个“一元”函数和一组合适的参数,并返回一个“可迭代的”。所以上面的apply函数可以变成:
for i in map(abs,[1, -2, -5, 6.2]): print(i)# 输出: 1 2 5 6.2
函数作为列表的元素
在 Python 中,函数可以存储为列表或任何其他数据结构的元素。例如,如果我们希望执行多个操作的特定数量,我们定义apply_func(L, x)
,它利用功能,列表大号和一个操作数,X和在施加每个功能大号上X。现在,调用这个函数:
function_list = [abs,exp,int]print apply_func(function_list,-2.3) # [2.3, 0.10025884, -2] # function_list 中的函数应用于-2.3 print apply_func(function_list,-4.6) # [4.6, 0.01005184, -4]
在上面的两个例子中,我们都可以使用列表推导式。python 中的列表推导式提供了一种基于另一个列表或迭代器创建列表的优雅方式。例如,线14-16在apply_func
可能成为:
output = [f(x) for f in L]
函数可以分配给其他变量
这里需要注意的一个有趣点是我们可以为这些函数分配不同的变量。这意味着,我们可以说:
i = abs print(i(-2)) # 2
这是因为函数的操作与对象完全一样,并且可以传递。但是,一个更强大的想法是所有对象也可以像函数一样运行。
作为函数的对象
这部分需要我们更多地了解是什么使对象成为一个函数。可以将对象视为函数意味着可以使用圆括号调用它们 ()
,就像一个函数。这可以通过在对象内部定义一个__call__函数来完成。让我们定义一个类,在调用时打印它存储的任何内容。
s1 = Printer('Hello') # 定义类 Printer
# 调用对象 s1
s1() # Hello
因此,在幕后“调用”一个对象意味着执行该对象的__call__方法。
关键要点
- python中的函数是第一类对象。这意味着它们可以作为参数传递给其他函数,分配给变量,甚至可以作为元素存储在各种数据结构中。
- 对元素列表执行相同操作的能力由名为map的高阶 Python 函数提供。
- 可以通过定义__call__函数使对象可调用。
总结
Python 中的一切都是对象,包括函数。您可以将它们分配给变量,将它们存储在数据结构中,并将它们传递给其他函数或从其他函数返回。允许您抽象并传递程序中的行为。函数也可以嵌套,它们可以捕获并携带一些父函数的状态。以上是晓得博客为你介绍的Python函数对象的全部内容,也可以更深入的理解Python内置函数的循环原理,更好的理解编程。