2016-11-06 8 views
1

Pythonのoperatorモジュールのポイントは何ですか?明らかにそこに多くの冗長な機能があり、私は同じことをするために他の方法ではなく、これらの機能を使う方が好きではない理由を理解していません。例えばなぜ演算子モジュールの関数を使用するのですか?

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

はまったく同じことをやっているようです。

+1

関連:http://stackoverflow.com/q/22387166/674039 – wim

答えて

1

完全性と一貫性については、

一部の操作が重複しているため、その操作を省略すると、その目的が無効になります。 Pythonの名前は単なる参考情報なので、安価で簡単に別の参照であるoperatorモジュールに名前を追加することができます。

+0

異なる操作では異なる数の引数が取られるため、わかりやすい答えです。 – wim

+1

@wim:ここで動的に引数を渡しました。文字列演算子をグループにまとめることもできます。 –

+0

実際にユースケースを理解していないし、「それを行うための明白な方法」に違反しているようです。このコードが実際にこのような演算子モジュールで動的ルックアップを使用していたgithub上のプロジェクトについて知っていますか? – wim

5

オペレータの機能にアクセスできるが、機能として役立つことが時に便利です。たとえば、2つの数字を一緒に追加することができます。

>> print(1 + 2) 
3 

また、あなたが簡単な数式与えられた答えを返す電卓機能を記述する必要がある可能性があり

>> import operator 
>> print(operator.add(1, 2)) 
3 

関数アプローチのためのユースケースを行うことができます。 boolの存在を考えると

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

、それはoperator.truthこれらの日のための任意のユースケースを考えるのは難しいです。 boolは2.2.1で新しくなったことに注意してください。演算子はそれ以前のものですから、歴史的な理由からしか存在しない可能性があります。オペレータモジュールには、operator.absなどの無駄な機能があります。これは単に組み込みのabsを呼び出します。

演算子モジュールは、関数型プログラミングに役立つことがあります。たとえば、Pythonにはsum関数が組み込まれていますが、類似の関数productは含まれていません。これは、乗算に対する演算子の機能的インターフェースを使用して簡単に実装できます。

>>> from operator import mul 
>>> from functools import reduce 
>>> def product(sequence, start=1): 
...  return reduce(mul, sequence, start) 
... 
>>> product([7, 2, 3]) 
42 

これを実装する方法は他にもあります。おそらく手続き的な方法、すなわち単純な古いforループを使用して*演算子で累積するという方法は、より非平凡です。どんな理由であれ、絶対に必要なスタイルを使用しないことを選択し、ユーザーのために

、オペレータモジュールは、オペレータのC implementation(利用可能な場合は)上でパフォーマンスの向上を提供しています無名関数に

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

を使用するよりもおいしいの実装を提供しています下位lambdaバージョン。オペレータモジュールで提供されるitemgetter,およびの機能は、匿名機能によってしばしば処理される種類の単純なタスクに対して、より読みやすく優れた実行オプションを提供します。

関連する問題