2016-11-06 53 views
1

Python的operator模塊有什麼意義?在那裏有許多顯然多餘的功能,我不明白爲什麼應該使用這些功能而不是其他方式來做同樣的事情。爲什麼使用運算符模塊中的函數?

例如:

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

似乎做同樣的事情。

+1

相關:http://stackoverflow.com/q/22387166/674039 – wim

回答

1

爲了完整性和一致性。因爲讓所有操作員在一個地方可以稍後進行動態查找:

getattr(operator, opname)(*arguments) 

因爲冗餘而忽略某些操作會違反該目的。而且,由於Python名稱僅僅是引用,因此向operator模塊添加一個名稱便宜且容易,這只是另一個參考。

+0

對我來說不是很有說服力的答案,因爲不同的操作需要不同數量的參數。 – wim

+1

@wim:我在這裏動態地傳入參數。你可以通過它們所使用的操作符的數量,將字符串操作符分組成小組。 –

+0

不太瞭解用例,似乎違反了「一個明顯的做法」。你是否知道github上的代碼實際上使用了像這樣的運算符模塊上的動態查找的項目? – wim

5

它有時能夠訪問操作員的功能,但作爲一項功能有用。例如,可以將兩個數字一起添加。

>> 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 
1

鑑於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,attrgettermethodcaller也爲通常由匿名功能處理的簡單任務提供更可讀和更好的執行選項。

相關問題