我学习numpy。但我有些疑惑让我困惑:
>>> import numpy as np
>>> a = np.arange(10)
>>> a.sum()
45
和:sum(a)
给出相同的结果。
那么为什么内置函数可以支持从第三方库计算数据类型呢? min()和max()执行相同的操作。(当dim为1时)
我对此有两个猜测,我更喜欢后者:
答案 0 :(得分:7)
所有第三方库类型必须执行,是实现预期的协议(有时也称为接口)。 sum()
function documentation告诉您预期的内容:
从左到右汇总开始和 可迭代 的项目并返回总数。
min()
和max()
表示类似的要求(返回可迭代中的最小项,返回可迭代中的最大项)。< / p>
此处,iterable是standard types documentation中描述的协议。协议本身不是类型,它们只是预期以某种方式运行的方法的集合。 collections.abc
module提供了几个可用于测试某些内容是否实现协议的对象:
>>> import numpy as np
>>> from collections.abc import Iterable
>>> a = np.arange(10)
>>> isinstance(a, Iterable)
True
因此ndarray
类型是可迭代的,这就是sum()
函数用于获取数组中包含的所有值的内容,为您总结这些值。
由于Python依赖于协议,因此核心语言开发人员不必为每个第三方库添加支持。相反,这些库只是符合核心语言的期望。
请注意,ndarray.sum()
实现可以使用该类型的内部实现;它可能会更快地产生总和,因为它不必首先将内部数据转换为Python对象(迭代在这种情况下返回盒装类型,Python int
对象,而内部表示包含裸C整数。)