operator — Стандартные операторы как функции¶
Исходный код: 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)¶ Возвращает итог
notobj. (Обратите внимание на отсутствие метода__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.index(a)¶ -
operator.__index__(a)¶ Возвращает a преобразовано в целое число. Эквивалентно
a.__index__().
-
operator.inv(obj)¶ -
operator.invert(obj)¶ -
operator.__inv__(obj)¶ -
operator.__invert__(obj)¶ Возвращает побитовой инверсии числа obj. Это эквивалентно
~obj.
-
operator.truediv(a, b)¶ -
operator.__truediv__(a, b)¶ Возвращает
a / bгде 2/3 равно .66, а не 0. Это также известно как «истинное» разделение.
Операции, которые работают с последовательностями (некоторые из них также с сопоставлениями), включают в себя:
-
operator.contains(a, b)¶ -
operator.__contains__(a, b)¶ Возвращает результат теста
b in a. Обратите внимание на реверсированные операнды.
-
operator.countOf(a, b)¶ Возвращает количество вхождений b в a.
-
operator.indexOf(a, b)¶ Возвращает индекс первого возникновения b в a.
-
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) |
| Bitwise Exclusive Or | a ^ b |
xor(a, b) |
| Bitwise Inversion | ~ a |
invert(a) |
| Bitwise Or | 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.iconcat(a, b)¶ -
operator.__iconcat__(a, b)¶ a = iconcat(a, b)эквивалентноa += bдля последовательностей a и b.
