Содержание страницы
10.3. 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. Обратите внимание, что эти функции могут возвращать любое значение, которое может трактоваться или не трактоваться как булево. См. Сравнения для получения дополнительной информации о расширенных сравнениях.
Логические операции также в целом применимы ко всем объектам и поддерживают проверки истинности, проверки тождественности и булевы операции:
- 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.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.setitem(a, b, c)¶
- operator.__setitem__(a, b, c)¶
Устанавливает значение a по индексу b равным c.
Пример: построить словарь, сопоставляющий порядковые номера от 0 до 255 с соответствующими символами.
>>> d = {}
>>> keys = range(256)
>>> vals = map(chr, keys)
>>> map(operator.setitem, [d]*len(keys), keys, vals)
Модуль 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)
Возвращает вызываемый объект, который извлекает элемент из своего операнда с помощью метода __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'
Пример использования 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...])¶
Возвращает вызываемый объект, который вызывает метод 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
10.3.1. Отображение операторов на функции¶Mapping Operators to Functions
В этой таблице показано соответствие абстрактных операций операторам 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 | 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) |
10.3.2. Операторы на месте¶Inplace Operators
Многие операции имеют версию «на месте». Ниже перечислены функции, предоставляющие более низкоуровневый доступ к операторам на месте, чем обычный синтаксис; например, оператор 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']