Содержание страницы
9.9. operator – Стандартные операторы как функции¶operator – Standard operators as functions
Модуль 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. Обратите внимание: в отличие от встроеннойcmp(), эти функции могут возвращать любое значение, которое может интерпретироваться как булево, а может и нет. См. Comparisons для получения дополнительной информации о расширенных сравнениях.Новое в версии 2.2.
Логические операции также в целом применимы ко всем объектам и поддерживают проверки истинности, проверки тождественности и булевы операции:
-
operator.not_(obj)¶ -
operator.__not__(obj)¶ Возвращает результат
notobj. (Обратите внимание, что для экземпляров объектов нет метода__not__(); только ядро интерпретатора определяет эту операцию. На результат влияют методы__nonzero__()и__len__().)
-
operator.truth(obj)¶ Возвращает
True, если obj истинно, иFalseв противном случае. Это эквивалентно использованию конструктораbool.
-
operator.is_(a, b)¶ Возвращает
a is b. Проверяет идентичность объектов.Новое в версии 2.3.
-
operator.is_not(a, b)¶ Возвращает
a is not b. Проверяет идентичность объектов.Новое в версии 2.3.
Математические и побитовые операции – самые многочисленные:
-
operator.div(a, b)¶ -
operator.__div__(a, b)¶ Возвращает
a / b, когда__future__.divisionне действует. Это также известно как «классическое» деление.
-
operator.index(a)¶ -
operator.__index__(a)¶ Возвращает a, преобразованное в целое число. Эквивалентно
a.__index__().Новое в версии 2.5.
-
operator.inv(obj)¶ -
operator.invert(obj)¶ -
operator.__inv__(obj)¶ -
operator.__invert__(obj)¶ Возвращает побитовое обратное значение числа obj. Это эквивалентно
~obj.Новое в версии 2.0: Имена
invert()и__invert__().
-
operator.truediv(a, b)¶ -
operator.__truediv__(a, b)¶ Возвращает
a / b, когда действует__future__.division. Этот режим также называется «настоящим» делением.Новое в версии 2.2.
Операции, которые работают с последовательностями (некоторые также с отображениями), включают:
-
operator.contains(a, b)¶ -
operator.__contains__(a, b)¶ Возвращает результат проверки
b in a. Операнды переставлены.Новое в версии 2.0: Название
__contains__().
-
operator.countOf(a, b)¶ Возвращает количество вхождений b в a.
-
operator.delslice(a, b, c)¶ -
operator.__delslice__(a, b, c)¶ Удалить срез a от индекса b до индекса c-1.
Устарело с версии 2.6: Эта функция удалена в Python 3.x. Используйте
delitem()с индексом среза.
-
operator.getslice(a, b, c)¶ -
operator.__getslice__(a, b, c)¶ Возвращает срез a от индекса b до индекса c-1.
Устарело с версии 2.6: Эта функция удалена в Python 3.x. Используйте
getitem()с индексом среза.
-
operator.indexOf(a, b)¶ Возвращает индекс первого вхождения b в a.
-
operator.repeat(a, b)¶ -
operator.__repeat__(a, b)¶ Устарело с версии 2.7: Используйте вместо этого
__mul__().Возвращает
a * b, где a – последовательность, а b – целое число.
-
operator.sequenceIncludes(...)¶ Устарело с версии 2.0: Вместо этого используйте
contains().Псевдоним для
contains().
-
operator.setitem(a, b, c)¶ -
operator.__setitem__(a, b, c)¶ Устанавливает значение a по индексу b равным c.
-
operator.setslice(a, b, c, v)¶ -
operator.__setslice__(a, b, c, v)¶ Устанавливает срез a от индекса b до индекса c-1 равным последовательности v.
Устарело с версии 2.6: Эта функция удалена в Python 3.x. Используйте
setitem()с индексом среза.
Пример использования функций операторов:
>>> # Поэлементное умножение
>>> map(mul, [0, 1, 2, 3], [10, 20, 30, 40])
[0, 20, 60, 120]
>>> # Скалярное произведение
>>> sum(map(mul, [0, 1, 2, 3], [10, 20, 30, 40]))
200
У многих операций есть версия, изменяющая объект на месте. Следующие функции предоставляют
более низкоуровневый доступ к операторам, изменяющим объект на месте, чем обычный синтаксис; например,
оператор x += y эквивалентен
x = operator.iadd(x, y). Другими словами
z = operator.iadd(x, y) эквивалентен составному оператору
z = x; z += y.
-
operator.iadd(a, b)¶ -
operator.__iadd__(a, b)¶ a = iadd(a, b)эквивалентноa += b.Новое в версии 2.5.
-
operator.iand(a, b)¶ -
operator.__iand__(a, b)¶ a = iand(a, b)эквивалентноa &= b.Новое в версии 2.5.
-
operator.iconcat(a, b)¶ -
operator.__iconcat__(a, b)¶ a = iconcat(a, b)эквивалентенa += bдля последовательностей a и b.Новое в версии 2.5.
-
operator.idiv(a, b)¶ -
operator.__idiv__(a, b)¶ a = idiv(a, b)эквивалентенa /= b, когда__future__.divisionне действует.Новое в версии 2.5.
-
operator.ifloordiv(a, b)¶ -
operator.__ifloordiv__(a, b)¶ a = ifloordiv(a, b)эквивалентноa //= b.Новое в версии 2.5.
-
operator.ilshift(a, b)¶ -
operator.__ilshift__(a, b)¶ a = ilshift(a, b)эквивалентноa <<= b.Новое в версии 2.5.
-
operator.imod(a, b)¶ -
operator.__imod__(a, b)¶ a = imod(a, b)эквивалентноa %= b.Новое в версии 2.5.
-
operator.imul(a, b)¶ -
operator.__imul__(a, b)¶ a = imul(a, b)эквивалентноa *= b.Новое в версии 2.5.
-
operator.ipow(a, b)¶ -
operator.__ipow__(a, b)¶ a = ipow(a, b)эквивалентноa **= b.Новое в версии 2.5.
-
operator.irepeat(a, b)¶ -
operator.__irepeat__(a, b)¶ Устарело с версии 2.7: Используйте вместо этого
__imul__().a = irepeat(a, b)эквивалентноa *= b, где a – последовательность, а b – целое число.Новое в версии 2.5.
-
operator.irshift(a, b)¶ -
operator.__irshift__(a, b)¶ a = irshift(a, b)эквивалентноa >>= b.Новое в версии 2.5.
-
operator.isub(a, b)¶ -
operator.__isub__(a, b)¶ a = isub(a, b)эквивалентноa -= b.Новое в версии 2.5.
-
operator.itruediv(a, b)¶ -
operator.__itruediv__(a, b)¶ a = itruediv(a, b)эквивалентноa /= b, когда действует__future__.division.Новое в версии 2.5.
-
operator.ixor(a, b)¶ -
operator.__ixor__(a, b)¶ a = ixor(a, b)эквивалентноa ^= b.Новое в версии 2.5.
Модуль operator также определяет несколько предикатов для проверки типа объектов; однако не все они надёжны. Вместо этого предпочтительнее проверять абстрактные базовые классы (подробнее см. collections и numbers).
-
operator.isCallable(obj)¶ Устарело с версии 2.0: Вместо этого используйте
isinstance(x, collections.Callable).Возвращает true, если объект obj можно вызывать как функцию, иначе возвращает false. True возвращается для функций, связанных и несвязанных методов, объектов классов и объектов экземпляров, поддерживающих метод
__call__().
-
operator.isMappingType(obj)¶ Устарело с версии 2.7: Используйте вместо этого
isinstance(x, collections.Mapping).Возвращает true, если объект obj поддерживает интерфейс отображения. Это верно для словарей и всех объектов экземпляров, определяющих
__getitem__().
-
operator.isNumberType(obj)¶ Устарело с версии 2.7: Используйте вместо этого
isinstance(x, numbers.Number).Возвращает true, если объект obj представляет собой число. Это верно для всех числовых типов, реализованных на C.
-
operator.isSequenceType(obj)¶ Устарело с версии 2.7: Используйте вместо этого
isinstance(x, collections.Sequence).Возвращает true, если объект obj поддерживает протокол последовательности. Это возвращает true для всех объектов, определяющих методы последовательности на C, и для всех объектов экземпляров, определяющих
__getitem__().
Модуль 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 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
Новое в версии 2.4.
Изменено в версии 2.5: Добавлена поддержка нескольких атрибутов.
Изменено в версии 2.6: Добавлена поддержка атрибутов с точкой.
-
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'
Новое в версии 2.4.
Изменено в версии 2.5: Добавлена поддержка извлечения нескольких элементов.
Пример использования
itemgetter()для извлечения определённых полей из записи-кортежа:>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)] >>> getcount = itemgetter(1) >>> map(getcount, inventory) [3, 2, 5, 1] >>> sorted(inventory, key=getcount) [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
-
operator.methodcaller(name[, args...])¶ Возвращает вызываемый объект, который вызывает метод 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
Новое в версии 2.6.
9.9.1. Сопоставление операторов и функций¶Mapping Operators to Functions
В этой таблице показано, как абстрактные операции соответствуют символам операторов в
синтаксисе Python и функциям в модуле operator.
Операция |
Синтаксис |
Функция |
|---|---|---|
Сложение |
|
|
Конкатенация |
|
|
Проверка вхождения |
|
|
Деление |
|
|
Деление |
|
|
Деление |
|
|
Побитовое И |
|
|
Побитовое исключающее ИЛИ |
|
|
Побитовая инверсия |
|
|
Побитовое ИЛИ |
|
|
Возведение в степень |
|
|
Тождественность |
|
|
Тождественность |
|
|
Присваивание по индексу |
|
|
Удаление по индексу |
|
|
Индексация |
|
|
Сдвиг влево |
|
|
Остаток от деления |
|
|
Умножение |
|
|
Отрицание (арифметическое) |
|
|
Отрицание (логическое) |
|
|
Положительный знак |
|
|
Сдвиг вправо |
|
|
Повторение последовательности |
|
|
Присваивание среза |
|
|
Удаление среза |
|
|
Срез |
|
|
Форматирование строк |
|
|
Вычитание |
|
|
Проверка истинности |
|
|
Упорядочение |
|
|
Упорядочение |
|
|
Равенство |
|
|
Различие |
|
|
Упорядочение |
|
|
Упорядочение |
|
|