在哪种情况下,应在python中使用内置的“ operator”模块?

我说的是这个模块:[http://docs.python.org/library/operator.html]

从文章:

操作员模块导出一组 用C实现的功能 对应于内在 Python的运算符。 例如, operator.add(x,y)等效于 表达式x + y。 函数名称 是那些用于特殊阶层的人 方法; 没有前导和的变体 还提供了尾随__ 方便。

我不确定我是否了解此模块的好处或目的。

Bjorn Tipling asked 2020-08-11T18:30:41Z
5个解决方案
38 votes

可能最流行的用法是operator.itemgetter。 给定一个元组列表operator.add,您可以按第ith个元素排序:lambda

当然,您可以通过定义自己的键功能来在没有操作员的情况下执行相同的操作,但是操作员模块使其变得更加整洁。

至于其余部分,python允许使用一种编程的功能样式,因此它可以出现-例如,Greg的reduce示例。

您可能会争辩:“为什么我只能在需要时就需要operator.addlambda?” 答案是:

  1. (我认为)operator.add快一点。
  2. 它使您或以后的其他人更容易理解该代码。 他们不需要寻找add的定义,因为他们知道操作员模块的作用。
  3. operator.add是可腌制的,而lambda不是可腌制的。 这意味着该功能可以保存到磁盘或在进程之间传递。
John Fouhy answered 2020-08-11T18:31:14Z
26 votes

一个示例是使用reduce()函数:

>>> import operator
>>> a = [2, 3, 4, 5]
>>> reduce(lambda x, y: x + y, a)
14
>>> reduce(operator.add, a)
14
Greg Hewgill answered 2020-08-11T18:31:34Z
4 votes

例如,获取列表中成员为元组的列,并按列对序列进行排序:

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

Jayhello answered 2020-08-11T18:32:26Z
3 votes

当您需要将函数作为参数传递给某些东西时,该模块很有用。 然后有两个选项:使用operator模块,或定义新功能(使用deflambda)。 如果您在运行中定义一个函数,那么如果您需要对该函数进行腌制(将其保存到磁盘或在进程之间传递它)会出现问题。 虽然itemgetter是可腌制的,但动态定义的功能(无论是def还是lambda)不是。 在以下示例中,用lambda表达式替换itemgetter将得到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)
eaglebrain answered 2020-08-11T18:32:48Z
1 votes

通常,此模块的目的(如上面的某些答案所提到的)是为您提供固定功能,以进行简单的操作,否则您必须自己编写并传递给更高阶的功能,例如add()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)

因此,无需创建lambda表达式。

Steve Wehba answered 2020-08-11T18:33:22Z
translate from https://stackoverflow.com:/questions/467920/in-what-situation-should-the-built-in-operator-module-be-used-in-python