Python的operator
模塊有什麼意義?在那裏有許多顯然多餘的功能,我不明白爲什麼應該使用這些功能而不是其他方式來做同樣的事情。爲什麼使用運算符模塊中的函數?
例如:
>>> import operator
>>> operator.truth(0)
False
>>> bool(0)
False
似乎做同樣的事情。
Python的operator
模塊有什麼意義?在那裏有許多顯然多餘的功能,我不明白爲什麼應該使用這些功能而不是其他方式來做同樣的事情。爲什麼使用運算符模塊中的函數?
例如:
>>> import operator
>>> operator.truth(0)
False
>>> bool(0)
False
似乎做同樣的事情。
爲了完整性和一致性。因爲讓所有操作員在一個地方可以稍後進行動態查找:
getattr(operator, opname)(*arguments)
因爲冗餘而忽略某些操作會違反該目的。而且,由於Python名稱僅僅是引用,因此向operator
模塊添加一個名稱便宜且容易,這只是另一個參考。
它有時能夠訪問操作員的功能,但作爲一項功能有用。例如,可以將兩個數字一起添加。
>> 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
鑑於bool
的存在,這是很難想象還有什麼用例爲operator.truth
這些天。請注意,bool
是2.2.1中的新增功能,並且運算符早於該運算符,因此可能僅出於歷史原因而存在。操作員模塊中還有其他無用的功能,例如operator.abs
- 只需調用內置的abs
即可。
運算符模塊有時可用於函數式編程。例如,Python有一個內置的sum
函數,但忽略了包含類似的product
函數。這可以通過使用運營商的功能接口乘法succintly實現:
>>> from operator import mul
>>> from functools import reduce
>>> def product(sequence, start=1):
... return reduce(mul, sequence, start)
...
>>> product([7, 2, 3])
42
,還有其他方式來實現這一點,是真的。可以說,程序的方法,即使用一個普通的舊for循環,並與操作符一起累積,是更pythonic。
對於用戶是誰,不管出於什麼原因,選擇不使用命令行式風格,操作模塊提供了更可口的實現比使用匿名函數
>>> 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
操作C implementation(如果可用)提供了性能提升劣等lambda
版本。運營商模塊中提供的功能itemgetter
,attrgetter
和methodcaller
也爲通常由匿名功能處理的簡單任務提供更可讀和更好的執行選項。
相關:http://stackoverflow.com/q/22387166/674039 – wim