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

原始碼: Lib/operator.py

operator module(模組)提供了一套與 Python 原生運算子對應的高效率函式。例如, operator.add(x, y) 與表示式 x+y 相同。許多函式名與特殊方法名相同,只是沒有雙底線。為了向後相容,許多包含雙底線的函式被保留了下來,但為了易於表達,建議使用沒有雙底線的函式。

函式種類有物件的比較運算、邏輯運算、數學運算以及序列運算。

物件比較函式適用於所有物件,函式根據它們對應的 rich comparison 運算子命名:

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 之間進行 "rich comparison"。具體來說, 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 相同。注意這些函式可以回傳任何值,無論它是否可當作 boolean(布林)值。關於 rich comparison 的更多資訊請參考 比较运算

邏輯運算通常也適用於所有物件,並且支援真值檢測、識別性測試和 boolean 運算:

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

回傳 not obj 的結果。(請注意物件實例並沒有 __not__() method(方法);只有直譯器核心定義此操作。結果會受 __bool__() __len__() method 影響。)

operator. length_hint ( obj , default = 0 )

回傳物件 obj 的估計長度。首先嘗試回傳其實際長度,再使用 object.__length_hint__() 得出估計值,最後才是回傳預設值。

Added in version 3.4.

以下操作适用于可调用对象:

operator. call ( obj , / , * args , ** kwargs ) operator. __call__ ( obj , / , * args , ** kwargs )

返回 obj(*args, **kwargs)

Added in version 3.11.

operator module 還定義了一些用於常規屬性和條目查詢的工具。這些工具適合用來編寫快速欄位提取器以作為 map() sorted() itertools.groupby() 或其他需要函式引數的函式之引數。

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

回傳一個可從運算元中獲取 attr 的可呼叫 (callable) 物件。如果請求了一個以上的屬性,則回傳一個包含屬性的 tupple(元組)。屬性名稱還可包含點號。例如:

  • 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 的可呼叫物件。如果指定了多個條目,則回傳一個查詢值的 tupple。例如:

  • 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__() 所接受的任何型別。dictionary(字典)接受任意可雜湊的值。list、tupple 和字串接受索引或切片:

    >>> 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() 從 tuple 中提取特定欄位的例子:

    >>> 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 method 的可呼叫物件。如果給定額外的引數和/或關鍵字引數,它們也將被傳給該 method。例如:

  • 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
    

    原地 (in-place) 運算子

    許多運算都有「原地」版本。以下列出的是提供對原地運算子(與一般語法相比)更底層存取的函式,例如 statement x += y 相當於 x = operator.iadd(x, y)。換一種方式來講就是 z = operator.iadd(x, y) 等價於複合陳述式 z = x; z += y

    在這些例子中,請注意當呼叫一個原地方法時,運算和賦值是分成兩個步驟來執行的。下面列出的原地函式只執行第一步,即呼叫原地方法,第二步賦值則不加處理。

    對於不可變 (immutable) 的目標例如字串、數字和 tupple,更新的值會被計算,但不會被再被賦值給輸入變數:

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

    對於可變 (mutable) 的目標例如 list 和 dictionary,原地方法將執行更新,因此不需要後續賦值操作:

    >>> 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']
         2001-2024, Python Software Foundation.
        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.