添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

源代码: Lib/operator.py

operator 模块提供了一套与Python的内置运算符对应的高效率函数。例如, operator.add(x, y) 与表达式 x+y 相同。 许多函数名与特殊方法名相同,只是没有双下划线。为了向后兼容性,也保留了许多包含双下划线的函数。为了表述清楚,建议使用没有双下划线的函数。

函数包含的种类有:对象的比较运算、逻辑运算、数学运算以及序列运算。

对象比较函数适用于所有的对象,函数名根据它们对应的比较运算符命名。

operator. lt ( a , b ) operator. le ( a , b ) operator. eq ( a , b ) operator. ne ( a , b ) operator. ge ( a , b ) operator. gt ( a , b ) operator. __lt__ ( a , b ) operator. __le__ ( a , b ) operator. __eq__ ( a , b ) operator. __ne__ ( a , b ) operator. __ge__ ( a , b ) operator. __gt__ ( a , b )

a b 之间进行全比较。具体的, lt(a, b) a < b 相同, le(a, b) a <= b 相同, eq(a, b) a == b 相同, ne(a, b) a != b 相同, gt(a, b) a > b 相同, ge(a, b) a >= b 相同。注意这些函数可以返回任何值,无论它是否可当作布尔值。关于全比较的更多信息请参考 比较运算

逻辑运算通常也适用于所有对象,并且支持真值检测、标识检测和布尔运算:

operator. not_ ( obj ) operator. __not__ ( obj )

返回 not obj 的结果。 (请注意对象实例并没有 __not__() 方法;只有解释器核心可定义此操作。 结果会受 __bool__() __len__() 方法影响。)

operator. length_hint ( obj , default = 0 )

返回对象 o 的估计长度。 首先尝试返回其实际长度,再使用 object.__length_hint__() 得出估计值,最后返回默认值。

3.4 新版功能.

operator 模块还定义了一些用于常规属性和条目查找的工具。 这些工具适合用来编写快速字段提取器作为 map() , sorted() , itertools.groupby() 或其他需要相应函数参数的函数的参数。

operator. attrgetter ( attr ) operator. attrgetter ( * attrs )

返回一个可从操作数中获取 attr 的可调用对象。 如果请求了一个以上的属性,则返回一个属性元组。 属性名称还可包含点号。 例如:

  • f = attrgetter('name') 之后,调用 f(b) 将返回 b.name

  • f = attrgetter('name', 'date') 之后,调用 f(b) 将返回 (b.name, b.date)

  • f = attrgetter('name.first', 'name.last') 之后,调用 f(b) 将返回 (b.name.first, b.name.last)

  • def attrgetter(*items):
        if any(not isinstance(item, str) for item in items):
            raise TypeError('attribute name must be a string')
        if len(items) == 1:
            attr = items[0]
            def g(obj):
                return resolve_attr(obj, attr)
        else:
            def g(obj):
                return tuple(resolve_attr(obj, attr) for attr in items)
        return g
    def resolve_attr(obj, attr):
        for name in attr.split("."):
            obj = getattr(obj, name)
        return obj
    operator.itemgetter(*items)
    

    返回一个使用操作数的 __getitem__() 方法从操作数中获取 item 的可调用对象。 如果指定了多个条目,则返回一个查找值的元组。 例如:

  • f = itemgetter(2) 之后,调用 f(r) 将返回 r[2]

  • g = itemgetter(2, 5, 3) 之后,调用 g(r) 将返回 (r[2], r[5], r[3])

  • def itemgetter(*items):
        if len(items) == 1:
            item = items[0]
            def g(obj):
                return obj[item]
        else:
            def g(obj):
                return tuple(obj[item] for item in items)
        return g
    

    条目可以是操作数的 __getitem__() 方法 所接受的任何类型。 字典接受任意 hashable 值。 列表、元组和字符串接受索引或切片对象:

    >>> itemgetter(1)('ABCDEFG')
    >>> itemgetter(1, 3, 5)('ABCDEFG')
    ('B', 'D', 'F')
    >>> itemgetter(slice(2, None))('ABCDEFG')
    'CDEFG'
    >>> soldier = dict(rank='captain', name='dotterbart')
    >>> itemgetter('rank')(soldier)
    'captain'
    

    使用 itemgetter() 从元组的记录中提取特定字段的例子:

    >>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
    >>> getcount = itemgetter(1)
    >>> list(map(getcount, inventory))
    [3, 2, 5, 1]
    >>> sorted(inventory, key=getcount)
    [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
    operator.methodcaller(name, /, *args, **kwargs)
    

    返回一个在操作数上调用 name 方法的可调用对象。 如果给出额外的参数和/或关键字参数,它们也将被传给该方法。 例如:

  • f = methodcaller('name') 之后,调用 f(b) 将返回 b.name()

  • f = methodcaller('name', 'foo', bar=1) 之后,调用 f(b) 将返回 b.name('foo', bar=1)

  • def methodcaller(name, /, *args, **kwargs):
        def caller(obj):
            return getattr(obj, name)(*args, **kwargs)
        return caller
    

    原地运算符

    许多运算都有“原地”版本。 以下列出的是提供对原地运算符相比通常语法更底层访问的函数,例如 statement x += y 相当于 x = operator.iadd(x, y)。 换一种方式来讲就是 z = operator.iadd(x, y) 等价于语句块 z = x; z += y

    在这些例子中,请注意当调用一个原地方法时,运算和赋值是分成两个步骤来执行的。 下面列出的原地函数只执行第一步即调用原地方法。 第二步赋值则不加处理。

    对于不可变的目标例如字符串、数字和元组,更新的值会被计算,但不会被再被赋值给输入变量:

    >>> a = 'hello'
    >>> iadd(a, ' world')
    'hello world'
    'hello'
    

    对于可变的目标例如列表和字典,原地方法将执行更新,因此不需要后续赋值操作:

    >>> s = ['h', 'e', 'l', 'l', 'o']
    >>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])
    ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
    ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
        This page is licensed under the Python Software Foundation License Version 2.
        Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
        See History and License for more information.
    The Python Software Foundation is a non-profit corporation. Please donate. 最后更新于 11月 14, 2023. Found a bug?