operator --- Toán tử tiêu chuẩn là hàm

Source code: Lib/operator.py


Mô-đun operator xuất một tập hợp các hàm hiệu quả tương ứng với các toán tử nội tại của Python. Ví dụ: operator.add(x, y) tương đương với biểu thức x+y. Nhiều tên hàm được sử dụng cho các phương thức đặc biệt, không có dấu gạch dưới kép. Để tương thích ngược, nhiều trong số này có một biến thể với dấu gạch dưới kép được giữ lại. Các biến thể không có dấu gạch dưới kép được ưu tiên cho sự rõ ràng.

Các hàm này được chia thành các loại thực hiện so sánh đối tượng, các phép toán logic, các phép toán và các phép toán trình tự.

Các hàm so sánh đối tượng hữu ích cho tất cả các đối tượng và được đặt tên theo các toán tử so sánh phong phú mà chúng hỗ trợ:

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)

Thực hiện "so sánh phong phú" giữa ab. Cụ thể, lt(a, b) tương đương với a < b, le(a, b) tương đương với a <= b, eq(a, b) tương đương với a == b, ne(a, b) tương đương với a != b, gt(a, b) tương đương với a > bge(a, b) tương đương với a >= b. Lưu ý rằng các hàm này có thể trả về bất kỳ giá trị nào, có thể hiểu hoặc không thể hiểu là giá trị Boolean. Xem So sánh để biết thêm thông tin về so sánh phong phú.

Các phép toán logic cũng thường được áp dụng cho tất cả các đối tượng và hỗ trợ kiểm tra tính xác thực, kiểm tra danh tính và các phép toán boolean:

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

Trả về kết quả của not obj. (Lưu ý rằng không có phương thức __not__() cho các phiên bản đối tượng; chỉ lõi trình thông dịch xác định thao tác này. Kết quả bị ảnh hưởng bởi các phương thức __bool__()__len__().)

operator.truth(obj)

Trả về True nếu obj đúng và False nếu ngược lại. Điều này tương đương với việc sử dụng hàm tạo bool.

operator.is_(a, b)

Trả về a is b. Kiểm tra danh tính đối tượng.

operator.is_not(a, b)

Trả về a is not b. Kiểm tra danh tính đối tượng.

operator.is_none(a)

Trả về a is None. Kiểm tra danh tính đối tượng.

Added in version 3.14.

operator.is_not_none(a)

Trả về a is not None. Kiểm tra danh tính đối tượng.

Added in version 3.14.

Các phép toán và phép toán bitwise có nhiều nhất:

operator.abs(obj)
operator.__abs__(obj)

Trả về giá trị tuyệt đối của obj.

operator.add(a, b)
operator.__add__(a, b)

Trả về a + b, cho các số ab.

operator.and_(a, b)
operator.__and__(a, b)

Trả về bitwise và của ab.

operator.floordiv(a, b)
operator.__floordiv__(a, b)

Trả về a // b.

operator.index(a)
operator.__index__(a)

Trả về a được chuyển đổi thành số nguyên. Tương đương với a.__index__().

Thay đổi trong phiên bản 3.10: Kết quả luôn có loại int chính xác. Trước đây, kết quả có thể là một phiên bản của lớp con của int.

operator.inv(obj)
operator.invert(obj)
operator.__inv__(obj)
operator.__invert__(obj)

Trả về nghịch đảo bit của số obj. Điều này tương đương với ~obj.

operator.lshift(a, b)
operator.__lshift__(a, b)

Trả về a dịch chuyển sang trái b.

operator.mod(a, b)
operator.__mod__(a, b)

Trả về a % b.

operator.mul(a, b)
operator.__mul__(a, b)

Trả về a * b, cho các số ab.

operator.matmul(a, b)
operator.__matmul__(a, b)

Trả về a @ b.

Added in version 3.5.

operator.neg(obj)
operator.__neg__(obj)

Trả về obj bị phủ định (-obj).

operator.or_(a, b)
operator.__or__(a, b)

Trả về bitwise hoặc của ab.

operator.pos(obj)
operator.__pos__(obj)

Trả về obj dương (+obj).

operator.pow(a, b)
operator.__pow__(a, b)

Trả về a ** b, cho các số ab.

operator.rshift(a, b)
operator.__rshift__(a, b)

Trả về a dịch sang phải b.

operator.sub(a, b)
operator.__sub__(a, b)

Trả về a - b.

operator.truediv(a, b)
operator.__truediv__(a, b)

Trả về a / b trong đó 2/3 là 0,66 chứ không phải 0. Đây còn được gọi là phép chia "đúng".

operator.xor(a, b)
operator.__xor__(a, b)

Trả về bitwise độc ​​quyền hoặc của ab.

Các thao tác hoạt động với trình tự (một số trong số chúng cũng có ánh xạ) bao gồm:

operator.concat(a, b)
operator.__concat__(a, b)

Trả về a + b cho chuỗi ab.

operator.contains(a, b)
operator.__contains__(a, b)

Trả về kết quả của bài kiểm tra b in a. Lưu ý các toán hạng đảo ngược.

operator.countOf(a, b)

Trả về số lần xuất hiện của b trong a.

operator.delitem(a, b)
operator.__delitem__(a, b)

Xóa giá trị của a tại chỉ mục b.

operator.getitem(a, b)
operator.__getitem__(a, b)

Trả về giá trị của a tại chỉ mục b.

operator.indexOf(a, b)

Trả về chỉ mục lần xuất hiện đầu tiên của b trong a.

operator.setitem(a, b, c)
operator.__setitem__(a, b, c)

Đặt giá trị của a tại chỉ mục b thành c.

operator.length_hint(obj, default=0)

Trả về độ dài ước tính cho đối tượng obj. Trước tiên, hãy thử trả về độ dài thực của nó, sau đó ước tính bằng object.__length_hint__() và cuối cùng trả về giá trị mặc định.

Added in version 3.4.

Hoạt động sau đây hoạt động với các cuộc gọi:

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

Trả về obj(*args, **kwargs).

Added in version 3.11.

Mô-đun operator cũng xác định các công cụ để tra cứu thuộc tính và mục tổng quát. Những điều này rất hữu ích để tạo các trình trích xuất trường nhanh làm đối số cho map(), sorted(), itertools.groupby() hoặc các hàm khác yêu cầu đối số hàm.

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

Trả về một đối tượng có thể gọi được để tìm nạp attr từ toán hạng của nó. Nếu có nhiều hơn một thuộc tính được yêu cầu, sẽ trả về một bộ thuộc tính. Tên thuộc tính cũng có thể chứa dấu chấm. Ví dụ:

  • Sau f = attrgetter('name'), lệnh gọi f(b) trả về b.name.

  • Sau f = attrgetter('name', 'date'), lệnh gọi f(b) trả về (b.name, b.date).

  • Sau f = attrgetter('name.first', 'name.last'), lệnh gọi f(b) trả về (b.name.first, b.name.last).

Tương đương với:

def attrgetter(*items):
    nếu (không phải isinstance(item, str) cho item trong items):
        raise TypeError('tên thuộc tính phải là một chuỗi')
    nếu len(items) == 1:
        attr = mục[0]
        def g(obj):
            trả về giải quyết_attr(obj, attr)
    khác:
        def g(obj):
            trả về tuple(resolve_attr(obj, attr) cho attr trong các mục)
    trả lại g

def giải quyết_attr(obj, attr):
    cho tên trong attr.split(".."):
        obj = getattr(obj, tên)
    trả lại đối tượng
operator.itemgetter(item)
operator.itemgetter(*items)

Trả về một đối tượng có thể gọi được để tìm nạp item từ toán hạng của nó bằng phương thức __getitem__() của toán hạng. Nếu nhiều mục được chỉ định, trả về một bộ giá trị tra cứu. Ví dụ:

  • Sau f = itemgetter(2), lệnh gọi f(r) trả về r[2].

  • Sau g = itemgetter(2, 5, 3), lệnh gọi g(r) trả về (r[2], r[5], r[3]).

Tương đương với:

def itemgetter(*items):
    nếu len(items) == 1:
        mục = mục[0]
        def g(obj):
            trả lại obj[mục]
    khác:
        def g(obj):
            trả về tuple(obj[item] cho item trong items)
    trả lại g

Các mục có thể là bất kỳ loại nào được phương thức __getitem__() của toán hạng chấp nhận. Từ điển chấp nhận mọi giá trị hashable. Danh sách, bộ dữ liệu và chuỗi chấp nhận một chỉ mục hoặc một lát cắt:

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

Ví dụ về cách sử dụng itemgetter() để truy xuất các trường cụ thể từ bản ghi bộ dữ liệu:

>>> 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)

Trả về một đối tượng có thể gọi được và gọi phương thức name trên toán hạng của nó. Nếu các đối số bổ sung và/hoặc đối số từ khóa được đưa ra, chúng cũng sẽ được cung cấp cho phương thức. Ví dụ:

  • Sau f = methodcaller('name'), lệnh gọi f(b) trả về b.name().

  • Sau f = methodcaller('name', 'foo', bar=1), lệnh gọi f(b) trả về b.name('foo', bar=1).

Tương đương với:

trình gọi phương thức def (tên, /, *args, **kwargs):
    người gọi def(obj):
        trả về getattr(obj, name)(*args, **kwargs)
    người gọi lại

Ánh xạ toán tử tới hàm

Bảng này cho thấy các phép toán trừu tượng tương ứng với các ký hiệu toán tử trong cú pháp Python và các hàm trong mô-đun operator như thế nào.

hoạt động

Cú pháp

chức năng

Ngoài ra

a + b

add(a, b)

Nối

seq1 + seq2

concat(seq1, seq2)

Kiểm tra ngăn chặn

obj in seq

contains(seq, obj)

Phân chia

a / b

truediv(a, b)

Phân chia

a // b

floordiv(a, b)

Theo chiều bit và

a & b

and_(a, b)

Độc quyền theo bit hoặc

a ^ b

xor(a, b)

Đảo ngược bitwise

~ a

invert(a)

Theo bit hoặc

a | b

or_(a, b)

lũy thừa

a ** b

pow(a, b)

Danh tính

a is b

is_(a, b)

Danh tính

a is not b

is_not(a, b)

Danh tính

a is None

is_none(a)

Danh tính

a is not None

is_not_none(a)

Bài tập được lập chỉ mục

obj[k] = v

setitem(obj, k, v)

Xóa chỉ mục

del obj[k]

delitem(obj, k)

Lập chỉ mục

obj[k]

getitem(obj, k)

Shift trái

a << b

lshift(a, b)

Modulo

a % b

mod(a, b)

Phép nhân

a * b

mul(a, b)

Phép nhân ma trận

a @ b

matmul(a, b)

Phủ định (Số học)

- a

neg(a)

Phủ định (Logic)

not a

not_(a)

tích cực

+ a

pos(a)

Dịch chuyển phải

a >> b

rshift(a, b)

Bài tập lát

seq[i:j] = values

setitem(seq, slice(i, j), values)

Xóa lát

del seq[i:j]

delitem(seq, slice(i, j))

Cắt lát

seq[i:j]

getitem(seq, slice(i, j))

Định dạng chuỗi

s % obj

mod(s, obj)

Phép trừ

a - b

sub(a, b)

Kiểm tra sự thật

obj

truth(obj)

Đặt hàng

a < b

lt(a, b)

Đặt hàng

a <= b

le(a, b)

Bình đẳng

a == b

eq(a, b)

Sự khác biệt

a != b

ne(a, b)

Đặt hàng

a >= b

ge(a, b)

Đặt hàng

a > b

gt(a, b)

Người vận hành tại chỗ

Nhiều hoạt động có phiên bản "tại chỗ". Dưới đây là các hàm cung cấp quyền truy cập nguyên thủy hơn vào các toán tử tại chỗ so với cú pháp thông thường; ví dụ: statement x += y tương đương với x = operator.iadd(x, y). Một cách khác để diễn đạt là nói rằng z = operator.iadd(x, y) tương đương với câu lệnh ghép z = x; z += y.

Trong các ví dụ đó, hãy lưu ý rằng khi một phương thức tại chỗ được gọi, việc tính toán và gán được thực hiện theo hai bước riêng biệt. Các hàm tại chỗ được liệt kê bên dưới chỉ thực hiện bước đầu tiên, gọi phương thức tại chỗ. Bước thứ hai, chuyển nhượng, không được xử lý.

Đối với các mục tiêu bất biến như chuỗi, số và bộ dữ liệu, giá trị cập nhật sẽ được tính toán nhưng không được gán lại cho biến đầu vào:

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

Đối với các mục tiêu có thể thay đổi như danh sách và từ điển, phương thức tại chỗ sẽ thực hiện cập nhật, do đó không cần thực hiện nhiệm vụ tiếp theo:

>>> s = ['h', 'e', 'l', 'l', 'o']
>>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> s
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
operator.iadd(a, b)
operator.__iadd__(a, b)

a = iadd(a, b) tương đương với a += b.

operator.iand(a, b)
operator.__iand__(a, b)

a = iand(a, b) tương đương với a &= b.

operator.iconcat(a, b)
operator.__iconcat__(a, b)

a = iconcat(a, b) tương đương với a += b đối với các chuỗi ab.

operator.ifloordiv(a, b)
operator.__ifloordiv__(a, b)

a = ifloordiv(a, b) tương đương với a //= b.

operator.ilshift(a, b)
operator.__ilshift__(a, b)

a = ilshift(a, b) tương đương với a <<= b.

operator.imod(a, b)
operator.__imod__(a, b)

a = imod(a, b) tương đương với a %= b.

operator.imul(a, b)
operator.__imul__(a, b)

a = imul(a, b) tương đương với a *= b.

operator.imatmul(a, b)
operator.__imatmul__(a, b)

a = imatmul(a, b) tương đương với a @= b.

Added in version 3.5.

operator.ior(a, b)
operator.__ior__(a, b)

a = ior(a, b) tương đương với a |= b.

operator.ipow(a, b)
operator.__ipow__(a, b)

a = ipow(a, b) tương đương với a **= b.

operator.irshift(a, b)
operator.__irshift__(a, b)

a = irshift(a, b) tương đương với a >>= b.

operator.isub(a, b)
operator.__isub__(a, b)

a = isub(a, b) tương đương với a -= b.

operator.itruediv(a, b)
operator.__itruediv__(a, b)

a = itruediv(a, b) tương đương với a /= b.

operator.ixor(a, b)
operator.__ixor__(a, b)

a = ixor(a, b) tương đương với a ^= b.