В какой ситуации следует использовать встроенный модуль оператора в Python? - PullRequest
39 голосов
/ 22 января 2009

Я говорю об этом модуле: http://docs.python.org/library/operator.html

Из статьи:

Модуль оператора экспортирует набор функции, реализованные в C соответствующий внутреннему операторы Python. Например, operator.add (x, y) эквивалентен выражение х + у. Имена функций те, которые используются для специального класса методы; варианты без ведущих и трейлинг __ также предусмотрены для удобство.

Я не уверен, что понимаю пользу или цель этого модуля.

Ответы [ 5 ]

37 голосов
/ 22 января 2009

Возможно, наиболее популярное использование - operator.itemgetter. Имея список lst кортежей, вы можете отсортировать по элементу ih: lst.sort(key=operator.itemgetter(i))

Конечно, вы могли бы сделать то же самое без оператора, определив свою собственную функцию ключа, но модуль оператора делает ее немного более аккуратной.

В остальном, python допускает функциональный стиль программирования, и поэтому он может появиться - например, пример Greg's Reduce.

Вы можете возразить: «Зачем мне нужно operator.add, когда я могу просто сделать: add = lambda x, y: x+y?» Ответы:

  1. operator.add (я думаю) немного быстрее.
  2. Это облегчает понимание кода для вас или другого человека, изучающего его позже. Им не нужно искать определение add, потому что они знают, что делает модуль оператора.
  3. operator.add можно отобрать, а lambda - нет. Это означает, что функция может быть сохранена на диск или передана между процессами.
25 голосов
/ 22 января 2009

Один из примеров - использование функции reduce():

>>> import operator
>>> a = [2, 3, 4, 5]
>>> reduce(lambda x, y: x + y, a)
14
>>> reduce(operator.add, a)
14
3 голосов
/ 16 ноября 2017

например, получить столбец в списке, членом которого является кортеж, сортировать последовательность по столбцам:

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

2 голосов
/ 01 июля 2017

Модуль полезен, когда вам нужно передать функцию в качестве аргумента чему-либо. Тогда есть два варианта: использовать модуль operator или определить новую функцию (используя def или lambda). Если вы определяете функцию на лету, это может создать проблему, если вам нужно выбрать эту функцию, чтобы сохранить ее на диск или передать между процессами. В то время как itemgetter можно выбирать, динамически определенные функции (с def или lambda) - нет. В следующем примере замена itemgetter выражением lambda приведет к PicklingError.

from operator import itemgetter

def sort_by_key(sequence, key):
    return sorted(sequence, key=key)

if __name__ == "__main__":
    from multiprocessing import Pool

    items = [([(1,2),(4,1)], itemgetter(1)),
             ([(5,3),(2,7)], itemgetter(0))]

    with Pool(5) as p:
        result = p.starmap(sort_by_key, items)
    print(result)
0 голосов
/ 21 июля 2018

Как правило, цель этого модуля (на который ссылаются некоторые ответы выше) - предоставить вам стандартные функции для простых операций, которые в противном случае вам пришлось бы писать самостоятельно, и переходить к функции более высокого порядка, такой как sort() или reduce().

Например, без операторов, чтобы суммировать числа в списке, вам нужно сделать что-то вроде этого:

from functools import reduce

l = list(range(100))
f = lambda x, y: x + y
result = reduce(f, l)
print(result)

С операторским модулем вы можете использовать его функцию add() следующим образом:

from operator import add

result = reduce(add, l)
print(result)

Таким образом, избегая необходимости создавать лямбда-выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...