为什么内置函数abs()
不适用于 Python 列表,但可以与 NumPy 数组和 pandas 系列正常工作?
将内置abs()
函数应用于 Python 列表会引发异常
类型错误:abs(( 的操作数类型错误:'list'
不足为奇,它与文档一致:
abs(x(
返回数字的绝对值。参数可以是整数或浮点数。 如果参数是复数,则返回其大小。
但是对于 NumPy 数组和 pandas 系列,相同的函数行为正确(作为矢量化函数(:
In[2]: lst = [2, 0, -1]
In[3]: # abs(lst) # bad operand type for abs(): 'list'
In[4]: import numpy as np
In[5]: arr = np.array(lst)
In[6]: abs(arr) # no problem
Out[6]: array([2, 0, 1])
In[7]: import pandas as pd
In[8]: s = pd.Series(lst)
In[9]: abs(s) # no problem
Out[9]:
0 2
1 0
2 1
dtype: int64
In[10]: abs.__class__
Out[10]: builtin_function_or_method
怎么可能?
引用的文档已过时。
新文档(适用于 Python 3.8.3(指出:
abs(x(
返回数字的绝对值。参数可以是整数或浮点数。如果参数是复数,则返回其大小。如果 x 定义 __abs__((,则 abs(x( 返回 x.__abs__((。
最后一句是新的,它解释了这个问题:
NumPyndarray
类和 pandasSeries
类都定义了魔术__abs__()
方法。