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)¶
Возвращает результат
not
obj. (Обратите внимание, что для экземпляров object не существует метода__not__()
; только ядро интерпретатора определяет эту операцию. На результат влияют методы__bool__()
и__len__()
.)
- operator.truth(obj)¶
Верните
True
, если значение obj равно true, и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__()
.Изменено в версии 3.10: Результат всегда имеет точный тип
int
. Ранее результатом мог быть экземпляр подклассаint
.
- 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 равно 0,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.setitem(a, b, c)¶
- operator.__setitem__(a, b, c)¶
Установите значение a для индекса b равным c.
- operator.length_hint(obj, default=0)¶
Возвращает приблизительную длину объекта obj. Сначала попробуйте вернуть его фактическую длину, затем оцените с помощью
object.__length_hint__()
и, наконец, верните значение по умолчанию.Добавлено в версии 3.4.
Следующая операция выполняется с вызываемыми объектами:
- operator.call(obj, /, *args, **kwargs)¶
- operator.__call__(obj, /, *args, **kwargs)¶
Верните
obj(*args, **kwargs)
.Добавлено в версии 3.11.
Модуль 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 из своего операнда, используя метод operands
__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__()
. Словари принимают любое значение hashable. Списки, кортежи и строки могут содержать индекс или фрагмент:>>> 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
.
Операция |
Синтаксис |
Функция |
---|---|---|
Дополнение |
|
|
Сцепление |
|
|
Испытание на герметичность |
|
|
Деление |
|
|
Деление |
|
|
Побитовое И |
|
|
Побитовое Исключающее Или |
|
|
Побитовая инверсия |
|
|
Побитовый Или |
|
|
Возведение в степень |
|
|
Идентичность |
|
|
Идентичность |
|
|
Индексированное назначение |
|
|
Индексированное удаление |
|
|
Индексация |
|
|
Сдвиг влево |
|
|
По модулю |
|
|
Умножение |
|
|
Матричное умножение |
|
|
Отрицание (арифметика) |
|
|
Отрицание (логическое) |
|
|
Положительный |
|
|
Сдвиг вправо |
|
|
Назначение среза |
|
|
Удаление фрагмента |
|
|
Нарезка ломтиками |
|
|
Форматирование строк |
|
|
Вычитание |
|
|
Проверка на истинность |
|
|
Заказ |
|
|
Заказ |
|
|
Равенство |
|
|
Разница |
|
|
Заказ |
|
|
Заказ |
|
|
Операторы на месте¶
Многие операции имеют версию «на месте». Ниже перечислены функции, предоставляющие более примитивный доступ к операторам на месте, чем это делает обычный синтаксис; например, statement 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'
Для изменяемых целевых объектов, таких как списки и словари, метод in-place выполнит обновление, поэтому последующее назначение не требуется:
>>> 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.