52

私はこのモジュールについて話している: http://docs.python.org/library/operator.html

記事から:

operator モジュールは、Python の組み込み演算子に対応する C で実装された一連の関数をエクスポートします。たとえば、operator.add(x, y) は式 x+y と同等です。関数名は、特別なクラス メソッドに使用される名前です。便宜上、先頭と末尾に __ が付いていないバリアントも用意されています。

このモジュールの利点や目的がよくわかりません。

4

6 に答える 6

45

おそらく最も一般的な使用方法は、operator.itemgetter です。タプルのリストlstを指定すると、次の方法で i 番目の要素で並べ替えることができます。lst.sort(key=operator.itemgetter(i))

確かに、独自のキー関数を定義することにより、演算子なしで同じことを行うことができますが、演算子モジュールを使用すると、少しすっきりします。

残りの部分に関しては、Python はプログラミングの関数型スタイルを許可しているため、それが登場する可能性があります。たとえば、Greg の reduce の例です。

operator.add「できるのに、なぜ必要なのadd = lambda x, y: x+yですか?」と主張するかもしれません。答えは次のとおりです。

  1. operator.add(私は思う)わずかに速いです。
  2. これにより、コードを見て、自分や他の人がコードを理解しやすくなります。operator モジュールが何をするかを知っているので、add の定義を探す必要はありません。
  3. operator.addピクルス化可能ですが、そうでlambdaはありません。これは、関数をディスクに保存したり、プロセス間で渡したりできることを意味します。
于 2009-01-22T03:19:40.963 に答える
33

1 つの例は、reduce()関数の使用にあります。

>>> import operator
>>> a = [2, 3, 4, 5]
>>> reduce(lambda x, y: x + y, a)
14
>>> reduce(operator.add, a)
14
于 2009-01-22T03:15:07.103 に答える
6

たとえば、メンバーがタプルであるリストの列を取得し、列ごとに並べ替えます。

def item_ope():
    s = ['h', 'e', 'l', 'l', 'o']
    print operator.getitem(s, 1)
    # e
    print operator.itemgetter(1, 4)(s)
    # ('e', 'o')

    inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
    get_count = operator.itemgetter(1)
    print map(get_count, inventory)
    # [3, 2, 5, 1]

    print sorted(inventory, key=get_count)
    # [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]

より実用的な例を参照してください。辞書をキーまたは値でソートします。

def dict_sort_by_value():
    dic_num = {'first': 11, 'second': 2, 'third': 33, 'Fourth': 4}

    # print all the keys
    print dic_num.keys()
    # ['second', 'Fourth', 'third', 'first']

    # sorted by value
    sorted_val = sorted(dic_num.items(), key=operator.itemgetter(1))
    # [('second', 2), ('Fourth', 4), ('first', 11), ('third', 33)]
    print sorted_val

    # sorted by key
    sorted_key = sorted(dic_num.items(), key=operator.itemgetter(0))
    print sorted_key
    # [('Fourth', 4), ('first', 11), ('second', 2), ('third', 33)]

最大値とリスト内のインデックスを取得したい場合の別の例:

def get_max_val_idx():
    lst = [1, 7, 3, 5, 6]
    max_val = max(lst)
    print max_val
    # 7
    max_idx = lst.index(max_val)
    print max_idx
    # 1

    # simplify it by use operator
    index, value = max(enumerate(lst), key=operator.itemgetter(1))
    print index, value
    # 1 7

以下のようなその他のデモ:

import operator

def cmp_fun():
    a, b = 5, 3
    print operator.le(a, b)
    # False
    print operator.gt(a, b)
    # True


def lst_ope():
    lst = [1, 2, 3]
    print operator.indexOf(lst, 2)
    # 1
    lst1 = [1, 2, 3, 2]
    print operator.countOf(lst1, 2)
    # 2


def cal_ope():
    lst1 = [0, 1, 2, 3]
    lst2 = [10, 20, 30, 40]
    print map(operator.mul, lst1, lst2)
    # [0, 20, 60, 120]

    print sum(map(operator.mul, lst1, lst2))
    # 200

    a, b = 1, 3
    print operator.iadd(a, b)
    # 4

python docの詳細を参照してください

于 2017-11-16T02:53:05.543 に答える