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__().Изменено в версии 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 - это .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(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.
Операция |
Синтаксис |
Функция |
|---|---|---|
Дополнение |
|
|
Конкатенация |
|
|
Испытание контейнера |
|
|
Подразделение |
|
|
Подразделение |
|
|
Побитовое и |
|
|
Побитовое исключающее или |
|
|
Побитовая инверсия |
|
|
Побитовое или |
|
|
Экспонирование |
|
|
Идентичность |
|
|
Идентичность |
|
|
Индексированное назначение |
|
|
Индексированное удаление |
|
|
Индексирование |
|
|
Левая смена |
|
|
Modulo |
|
|
Умножение |
|
|
Матричное умножение |
|
|
Отрицание (арифметика) |
|
|
Отрицание (логическое) |
|
|
Позитив |
|
|
Правый Shift |
|
|
Назначение ломтиков |
|
|
Удаление срезов |
|
|
Нарезка |
|
|
Форматирование строк |
|
|
Вычитание |
|
|
Тест на истинность |
|
|
Заказ |
|
|
Заказ |
|
|
Равенство |
|
|
Разница |
|
|
Заказ |
|
|
Заказ |
|
|
Операторы на месте¶
Многие операции имеют «in-place» версию. Ниже перечислены функции, обеспечивающие более примитивный доступ к операторам in-place, чем это делает обычный синтаксис; например, оператор statement x += y эквивалентен x = operator.iadd(x, y). По-другому можно сказать, что z = operator.iadd(x, y) эквивалентен составному оператору z = x; z += y.
В этих примерах обратите внимание, что при вызове метода in-place вычисление и присвоение выполняются в два отдельных этапа. Функции in-place, перечисленные ниже, выполняют только первый шаг - вызов метода in-place. Второй шаг, присвоение, не обрабатывается.
Для неизменяемых объектов, таких как строки, числа и кортежи, обновленное значение вычисляется, но не присваивается обратно входной переменной:
>>> 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.