operator
— Стандартные операторы как функции
Модуль 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.
truth
(obj) Возвращает
True
если obj истина, иFalse
иначе. Это эквивалентно использованию конструктораbool
.
-
operator.
is_
(a, b) Возвращает
a is b
. Проверяет идентичность объекта.
-
operator.
is_not
(a, b) Возвращает
a is not b
. Проверяет идентичность объекта.
Математические и побитовые операции наиболее многочисленны:
-
operator.
abs
(obj) -
operator.
__abs__
(obj) Возвращает абсолютное значение obj.
-
operator.
add
(a, b) -
operator.
__add__
(a, b) Возвращает
a + b
, для a и b чисел.
-
operator.
and_
(a, b) -
operator.
__and__
(a, b) Возвращает побитовые и a и b.
-
operator.
floordiv
(a, b) -
operator.
__floordiv__
(a, b) Возвращает
a // b
.
-
operator.
index
(a) -
operator.
__index__
(a) Возвращает a преобразованное в целое число. Эквивалентно
a.__index__()
.
-
operator.
inv
(obj) -
operator.
invert
(obj) -
operator.
__inv__
(obj) -
operator.
__invert__
(obj) Возвращает побитовую инверсию числа obj. Эквивалентно
~obj
.
-
operator.
lshift
(a, b) -
operator.
__lshift__
(a, b) Возвращает a смещённое налево на b.
-
operator.
mod
(a, b) -
operator.
__mod__
(a, b) Возвращает
a % b
.
-
operator.
mul
(a, b) -
operator.
__mul__
(a, b) Возвращает
a * b
, для чисел a и b.
-
operator.
matmul
(a, b) -
operator.
__matmul__
(a, b) Возвращает
a @ b
.Добавлено в версии 3.5.
-
operator.
neg
(obj) -
operator.
__neg__
(obj) Возвращает отрицательный obj (
-obj
).
-
operator.
or_
(a, b) -
operator.
__or__
(a, b) Возвращает побитовое или a и b.
-
operator.
pos
(obj) -
operator.
__pos__
(obj) Возвращает положительный obj (
+obj
).
-
operator.
pow
(a, b) -
operator.
__pow__
(a, b) Возвращает
a ** b
, для чисел a и b.
-
operator.
rshift
(a, b) -
operator.
__rshift__
(a, b) Возвращает a, сдвинутое вправо на b.
-
operator.
sub
(a, b) -
operator.
__sub__
(a, b) Возвращает
a - b
.
-
operator.
truediv
(a, b) -
operator.
__truediv__
(a, b) Возвращает
a / b
где 2/3 равно .66, а не 0. Также известна как «истинное» деление.
-
operator.
xor
(a, b) -
operator.
__xor__
(a, b) Возвращает побитовое исключение или a и b.
Операции, которые работают с последовательностями (некоторые из них также с сопоставлениями), включают в себя:
-
operator.
concat
(a, b) -
operator.
__concat__
(a, b) Возвращает
a + b
для последовательностей a и b.
-
operator.
contains
(a, b) -
operator.
__contains__
(a, b) Возвращает результат проверки
b in a
. Обратите внимание на реверсированные операнды.
-
operator.
countOf
(a, b) Возвращает количество вхождений b в a.
-
operator.
delitem
(a, b) -
operator.
__delitem__
(a, b) Удалить значение a по индексу b.
-
operator.
getitem
(a, b) -
operator.
__getitem__
(a, b) Возвращает значение a по индексу b.
-
operator.
indexOf
(a, b) Возвращает индекс первого возникновения b в a.
-
operator.
setitem
(a, b, c) -
operator.
__setitem__
(a, b, c) Установить значение a в индексе b к c.
-
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
(item) -
operator.
itemgetter
(*items) Возвращает вызываемый объект, который выбирает item из своего операнда, используя метод операнда
__getitem__()
. Если указано несколько элементов, возвращает кортеж значений поиска. Например:- После
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__()
. Словари принимают любые хэшируемые значение. Списки, кортежи и строки принимают индекс или фрагмент:>>> itemgetter('name')({'name': 'tu', 'age': 18}) 'tu' >>> 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'
Пример использования
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
- После
Отображение операторов на функции
В этой таблице показано, как абстрактные операции соответствуют символам
операторов в синтаксисе Python и функциям в модуле operator
.
Операция | Синтаксис | Функция |
---|---|---|
Сложение | a + b |
add(a, b) |
Конкатенация | seq1 + seq2 |
concat(seq1, seq2) |
Тест на содержание | obj in seq |
contains(seq, obj) |
Деление | a / b |
truediv(a, b) |
Деление | a // b |
floordiv(a, b) |
Битовое И | a & b |
and_(a, b) |
Побитовое исключающее ИЛИ | a ^ b |
xor(a, b) |
Побитовая инверсия | ~ a |
invert(a) |
Побитовое ИЛИ | a | b |
or_(a, b) |
Возведение | a ** b |
pow(a, b) |
Идентичность | a is b |
is_(a, b) |
Идентичность | a is not b |
is_not(a, b) |
Индексированное назн. | obj[k] = v |
setitem(obj, k, v) |
Индексированное удал. | del obj[k] |
delitem(obj, k) |
Индексирование | obj[k] |
getitem(obj, k) |
Левый сдвиг | a << b |
lshift(a, b) |
Модуль | a % b |
mod(a, b) |
Умножение | a * b |
mul(a, b) |
Умножение матриц | a @ b |
matmul(a, b) |
Отрицание (арифметич.) | - a |
neg(a) |
Отрицание (логическое) | not a |
not_(a) |
Положительный | + a |
pos(a) |
Сдвиг вправо | a >> b |
rshift(a, b) |
Слайсовое присвоение | seq[i:j] = values |
setitem(seq, slice(i, j), values) |
Слайсовое удаление | del seq[i:j] |
delitem(seq, slice(i, j)) |
Слайсинг | seq[i:j] |
getitem(seq, slice(i, j)) |
Форматирование строк | s % obj |
mod(s, obj) |
Вычитание | a - b |
sub(a, b) |
Проверка истинности | obj |
truth(obj) |
Сравнение | a < b |
lt(a, b) |
Сравнение | a <= b |
le(a, b) |
Равенство | a == b |
eq(a, b) |
Разница | a != b |
ne(a, b) |
Сравнение | a >= b |
ge(a, b) |
Сравнение | a > b |
gt(a, b) |
Операторы на месте
Многие операции имеют версию «на месте». Ниже перечислены функции,
обеспечивающие более примитивный доступ к операторам на месте, чем обычный
синтаксис; например, оператор x += y
эквивалентен
x = operator.iadd(x, y)
. Другой способ сказать, что
z = operator.iadd(x, y)
эквивалентен соединению операторов z = x; z += y
.
В этих примерах следует отметить, что при вызове метода на месте вычисление и назначение выполняются в два отдельных этапа. Перечисленные ниже функции на месте выполняют только первый шаг, вызывая метод на месте. Второй шаг, присвоение, не обрабатывается.
Для неизменяемых целей, таких как строки, числа и кортежи, вычисляется обновленный значение, но не назначается обратно входной переменной:
>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'
Для изменяемых целей, таких как списки и словари, метод на месте выполняет обновление, поэтому последующее присвоение не требуется:
>>> 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)
эквивалентноa += b
.
-
operator.
iand
(a, b) -
operator.
__iand__
(a, b) a = iand(a, b)
эквивалентноa &= b
.
-
operator.
iconcat
(a, b) -
operator.
__iconcat__
(a, b) a = iconcat(a, b)
эквивалентноa += b
для последовательностей a и b.
-
operator.
ifloordiv
(a, b) -
operator.
__ifloordiv__
(a, b) a = ifloordiv(a, b)
эквивалентноa //= b
.
-
operator.
ilshift
(a, b) -
operator.
__ilshift__
(a, b) a = ilshift(a, b)
эквивалентноa <<= b
.
-
operator.
imod
(a, b) -
operator.
__imod__
(a, b) a = imod(a, b)
эквивалентноa %= b
.
-
operator.
imul
(a, b) -
operator.
__imul__
(a, b) a = imul(a, b)
эквивалентноa *= b
.
-
operator.
imatmul
(a, b) -
operator.
__imatmul__
(a, b) a = imatmul(a, b)
эквивалентноa @= b
.Добавлено в версии 3.5.
-
operator.
ior
(a, b) -
operator.
__ior__
(a, b) a = ior(a, b)
эквивалентноa |= b
.
-
operator.
ipow
(a, b) -
operator.
__ipow__
(a, b) a = ipow(a, b)
эквивалентноa **= b
.
-
operator.
irshift
(a, b) -
operator.
__irshift__
(a, b) a = irshift(a, b)
эквивалентноa >>= b
.
-
operator.
isub
(a, b) -
operator.
__isub__
(a, b) a = isub(a, b)
эквивалентноa -= b
.
-
operator.
itruediv
(a, b) -
operator.
__itruediv__
(a, b) a = itruediv(a, b)
эквивалентноa /= b
.
-
operator.
ixor
(a, b) -
operator.
__ixor__
(a, b) a = ixor(a, b)
эквивалентноa ^= b
.