Python 为什么使用操作员模块中的功能?

Python 为什么使用操作员模块中的功能?,python,operators,Python,Operators,python的操作符模块有什么意义?这里有很多明显的冗余函数,我不明白为什么人们更喜欢使用这些函数而不是其他方法来做同样的事情 例如: >>> import operator >>> operator.truth(0) False >>> bool(0) False 似乎做了完全相同的事情。为了完整性和一致性。因为将所有运算符放在一个位置可以让您稍后进行动态查找: getattr(operator, opname)(*arguments)

python的
操作符
模块有什么意义?这里有很多明显的冗余函数,我不明白为什么人们更喜欢使用这些函数而不是其他方法来做同样的事情

例如:

>>> import operator
>>> operator.truth(0)
False
>>> bool(0)
False

似乎做了完全相同的事情。

为了完整性和一致性。因为将所有运算符放在一个位置可以让您稍后进行动态查找:

getattr(operator, opname)(*arguments)

如果因为某些操作是多余的而忽略这些操作,则无法达到这一目的。而且,由于Python名称只是引用,因此在
操作符
模块中添加一个名称是非常便宜和容易的,它只是另一个引用。

能够访问操作符的功能,但作为一个函数,有时是很有用的。例如,要将两个数字相加,您可以这样做

>> print(1 + 2)
3
你也可以这样做

>> import operator
>> print(operator.add(1, 2))
3
函数方法的一个用例可能是,您需要编写一个计算器函数,该函数返回给定简单公式的答案

import operator as _operator

operator_mapping = {
    '+': _operator.add,
    '-': _operator.sub,
    '*': _operator.mul,
    '/': _operator.truediv,
}

def calculate(formula):
    x, operator, y = formula.split(' ')

    # Convert x and y to floats so we can perform mathematical
    # operations on them.
    x, y = map(float, (x, y))

    return operator_mapping[operator](x, y)

print(calculate('1 + 2'))  # prints 3.0
考虑到的存在,现在很难为
operator.truth
想出任何用例。请注意,
bool
在2.2.1中是新的,并且运算符早于此,因此它可能仅因历史原因而存在。操作员模块中还有其他无用的功能,例如
operator.abs
——它只调用内置的
abs

操作员模块有时对功能编程有用。例如,Python有一个内置函数,但忽略了包含类似的
产品
内置函数(2019年编辑:已添加到stdlib)。这可以使用运算符的函数接口简洁地实现:

>>> from operator import mul
>>> from functools import reduce 
>>> def product(sequence, start=1):
...     return reduce(mul, sequence, start)
... 
>>> product([7, 2, 3])
42
确实,还有其他方法可以实现这一点。可以说,过程方法,即使用普通的旧for循环并使用
*
操作符进行累加,更符合python

对于出于任何原因选择不使用命令式样式的用户,operator模块提供了比使用匿名函数更令人满意的实现

>>> timeit reduce(lambda x, y: x*y, range(1, 100))
10000 loops, best of 3: 24.3 µs per loop
>>> timeit reduce(mul, range(1, 100))
100000 loops, best of 3: 14.9 µs per loop

Operator's(如果可用)比劣质
lambda
版本提供性能提升。操作员模块中提供的
itemgetter
attrgetter
methodcaller
函数也为通常由匿名函数处理的简单任务提供了更具可读性和更好的执行选项。

相关:对我来说不是很有说服力的答案,因为不同的操作需要不同数量的参数。@wim:我在这里动态地传递了参数。你也可以根据字符串操作符的数量将其分组。你并不真正理解这个用例,似乎违反了“一个显而易见的方法”。你知道github上有没有这样的项目,代码实际上是在操作员模块上使用动态查找的?@wim:我们可以慢慢来。我不能把它缩小到一个精确的匹配范围,但我看到
pandas
在他们的测试中使用
getattr(operator,…)
。@MartijnPieters动态查找是什么意思?你能举个例子吗?