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 a và b. Cụ thể,
lt(a, b)tương đương vớia < b,le(a, b)tương đương vớia <= b,eq(a, b)tương đương vớia == b,ne(a, b)tương đương vớia != b,gt(a, b)tương đương vớia > bvàge(a, b)tương đương vớia >= 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
notobj. (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__()và__len__().)
- operator.truth(obj)¶
Trả về
Truenếu obj đúng vàFalsenếu ngược lại. Điều này tương đương với việc sử dụng hàm tạobool.
- 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.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
intchính xác. Trước đây, kết quả có thể là một phiên bản của lớp con củaint.
- 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.truediv(a, b)¶
- operator.__truediv__(a, b)¶
Trả về
a / btrong đó 2/3 là 0,66 chứ không phải 0. Đây còn được gọi là phép chia "đúng".
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.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.indexOf(a, b)¶
Trả về chỉ mục lần xuất hiện đầu tiên của b trong a.
- 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ọif(b)trả vềb.name.Sau
f = attrgetter('name', 'date'), lệnh gọif(b)trả về(b.name, b.date).Sau
f = attrgetter('name.first', 'name.last'), lệnh gọif(b)trả về(b.name.first, b.name.last).
Tương đương với:
def attrgetter(*items): nếu có(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ọif(r)trả vềr[2].Sau
g = itemgetter(2, 5, 3), lệnh gọig(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ọif(b)trả vềb.name().Sau
f = methodcaller('name', 'foo', bar=1), lệnh gọif(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 |
|
|
Nối |
|
|
Kiểm tra ngăn chặn |
|
|
Phân chia |
|
|
Phân chia |
|
|
Theo chiều bit và |
|
|
Độc quyền theo bit hoặc |
|
|
Đảo ngược bitwise |
|
|
Theo bit hoặc |
|
|
lũy thừa |
|
|
Danh tính |
|
|
Danh tính |
|
|
Danh tính |
|
|
Danh tính |
|
|
Bài tập được lập chỉ mục |
|
|
Xóa chỉ mục |
|
|
Lập chỉ mục |
|
|
Shift trái |
|
|
Modulo |
|
|
Phép nhân |
|
|
Phép nhân ma trận |
|
|
Phủ định (Số học) |
|
|
Phủ định (Logic) |
|
|
tích cực |
|
|
Dịch chuyển phải |
|
|
Bài tập lát |
|
|
Xóa lát |
|
|
Cắt lát |
|
|
Định dạng chuỗi |
|
|
Phép trừ |
|
|
Kiểm tra sự thật |
|
|
Đặt hàng |
|
|
Đặt hàng |
|
|
Bình đẳng |
|
|
Sự khác biệt |
|
|
Đặt hàng |
|
|
Đặt hàng |
|
|
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.iconcat(a, b)¶
- operator.__iconcat__(a, b)¶
a = iconcat(a, b)tương đương vớia += bđối với các chuỗi a và b.
- operator.ifloordiv(a, b)¶
- operator.__ifloordiv__(a, b)¶
a = ifloordiv(a, b)tương đương vớia //= b.