operator.md
1> **Источник:** https://python-all.ru/3.3/library/operator.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 10.3. [`operator`](https://python-all.ru/3.3/library/operator.html#module-operator) – Стандартные операторы как функции89Модуль [`operator`](https://python-all.ru/3.3/library/operator.html#module-operator) предоставляет набор эффективных функций, соответствующих встроенным операторам Python. Например, `operator.add(x, y)` эквивалентно выражению `x+y`. Имена функций такие же, как у специальных методов классов; для удобства также предоставляются варианты без ведущих и завершающих `__`.1011Функции делятся на категории: сравнение объектов, логические операции, математические операции и операции с последовательностями.1213Функции сравнения объектов полезны для всех объектов и названы по именам поддерживаемых операторов расширенного сравнения:1415#### `operator.lt(a, b)`1617#### `operator.le(a, b)`1819#### `operator.eq(a, b)`2021#### `operator.ne(a, b)`2223#### `operator.ge(a, b)`2425#### `operator.gt(a, b)`2627#### `operator.__lt__(a, b)`2829#### `operator.__le__(a, b)`3031#### `operator.__eq__(a, b)`3233#### `operator.__ne__(a, b)`3435#### `operator.__ge__(a, b)`3637#### `operator.__gt__(a, b)`3839Выполняет «расширенные сравнения» между *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`. Обратите внимание, что эти функции могут возвращать любое значение, которое может трактоваться или не трактоваться как булево. См. [*Сравнения*](https://python-all.ru/3.3/reference/expressions.html#comparisons) для получения дополнительной информации о расширенных сравнениях.4041Логические операции также в целом применимы ко всем объектам и поддерживают проверки истинности, проверки тождественности и булевы операции:4243#### `operator.not_(obj)`4445#### `operator.__not__(obj)`4647Возвращает результат [`not`](https://python-all.ru/3.3/reference/expressions.html#not) *obj*. (Обратите внимание, что для экземпляров объектов не существует метода [`__not__()`](https://python-all.ru/3.3/library/operator.html#operator.__not__); только ядро интерпретатора определяет эту операцию. Результат зависит от методов [`__bool__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__bool__) и [`__len__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__len__).)4849#### `operator.truth(obj)`5051Возвращает [`True`](https://python-all.ru/3.3/library/constants.html#True), если *obj* истинно, и [`False`](https://python-all.ru/3.3/library/constants.html#False) в противном случае. Это эквивалентно вызову конструктора [`bool`](https://python-all.ru/3.3/library/functions.html#bool).5253#### `operator.is_(a, b)`5455Возвращает `a is b`. Проверяет идентичность объектов.5657#### `operator.is_not(a, b)`5859Возвращает `a is not b`. Проверяет идентичность объектов.6061Математические и побитовые операции – самые многочисленные:6263#### `operator.abs(obj)`6465#### `operator.__abs__(obj)`6667Возвращает абсолютное значение *obj*.6869#### `operator.add(a, b)`7071#### `operator.__add__(a, b)`7273Возвращает `a + b`, для чисел *a* и *b*.7475#### `operator.and_(a, b)`7677#### `operator.__and__(a, b)`7879Возвращает побитовое И от *a* и *b*.8081#### `operator.floordiv(a, b)`8283#### `operator.__floordiv__(a, b)`8485Возвращает `a // b`.8687#### `operator.index(a)`8889#### `operator.__index__(a)`9091Возвращает *a*, преобразованный в целое число. Эквивалентно `a.__index__()`.9293#### `operator.inv(obj)`9495#### `operator.invert(obj)`9697#### `operator.__inv__(obj)`9899#### `operator.__invert__(obj)`100101Возвращает побитовую инверсию числа *obj*. Эквивалентно `~obj`.102103#### `operator.lshift(a, b)`104105#### `operator.__lshift__(a, b)`106107Возвращает *a*, сдвинутое влево на *b*.108109#### `operator.mod(a, b)`110111#### `operator.__mod__(a, b)`112113Возвращает `a % b`.114115#### `operator.mul(a, b)`116117#### `operator.__mul__(a, b)`118119Возвращает `a * b`, для чисел *a* и *b*.120121#### `operator.neg(obj)`122123#### `operator.__neg__(obj)`124125Возвращает отрицание *obj* (`-obj`).126127#### `operator.or_(a, b)`128129#### `operator.__or__(a, b)`130131Возвращает побитовое ИЛИ *a* и *b*.132133#### `operator.pos(obj)`134135#### `operator.__pos__(obj)`136137Возвращает *obj* с положительным знаком (`+obj`).138139#### `operator.pow(a, b)`140141#### `operator.__pow__(a, b)`142143Возвращает `a ** b`, для чисел *a* и *b*.144145#### `operator.rshift(a, b)`146147#### `operator.__rshift__(a, b)`148149Возвращает *a*, сдвинутое вправо на *b*.150151#### `operator.sub(a, b)`152153#### `operator.__sub__(a, b)`154155Возвращает `a - b`.156157#### `operator.truediv(a, b)`158159#### `operator.__truediv__(a, b)`160161Возвращает `a / b`, где 2/3 равно .66, а не 0. Это также называется «истинным» делением.162163#### `operator.xor(a, b)`164165#### `operator.__xor__(a, b)`166167Возвращает побитовое исключающее ИЛИ *a* и *b*.168169Операции, которые работают с последовательностями (некоторые также с отображениями), включают:170171#### `operator.concat(a, b)`172173#### `operator.__concat__(a, b)`174175Возвращает `a + b` для последовательностей *a* и *b*.176177#### `operator.contains(a, b)`178179#### `operator.__contains__(a, b)`180181Возвращает результат проверки `b in a`. Обратите внимание: операнды переставлены.182183#### `operator.countOf(a, b)`184185Возвращает количество вхождений *b* в *a*.186187#### `operator.delitem(a, b)`188189#### `operator.__delitem__(a, b)`190191Удаляет значение *a* по индексу *b*.192193#### `operator.getitem(a, b)`194195#### `operator.__getitem__(a, b)`196197Возвращает значение *a* по индексу *b*.198199#### `operator.indexOf(a, b)`200201Возвращает индекс первого вхождения *b* в *a*.202203#### `operator.setitem(a, b, c)`204205#### `operator.__setitem__(a, b, c)`206207Устанавливает значение *a* по индексу *b* равным *c*.208209Пример: построить словарь, сопоставляющий порядковые номера от `0` до `255` с соответствующими символами.210211```python212>>> d = {}213>>> keys = range(256)214>>> vals = map(chr, keys)215>>> map(operator.setitem, [d]*len(keys), keys, vals) 216```217218Модуль [`operator`](https://python-all.ru/3.3/library/operator.html#module-operator) также определяет инструменты для обобщённого поиска атрибутов и элементов. Они полезны для создания быстрых извлекателей полей в качестве аргументов для [`map()`](https://python-all.ru/3.3/library/functions.html#map), [`sorted()`](https://python-all.ru/3.3/library/functions.html#sorted), [`itertools.groupby()`](https://python-all.ru/3.3/library/itertools.html#itertools.groupby) или других функций, ожидающих аргумент-функцию.219220#### `operator.attrgetter(attr)`221222#### `operator.attrgetter(*attrs)`223224Возвращает вызываемый объект, который извлекает *attr* из своего операнда. Если запрошено более одного атрибута, возвращает кортеж атрибутов. Имена атрибутов могут также содержать точки. Например:225226- После `f = attrgetter('name')`, вызов `f(b)` возвращает `b.name`.227- После `f = attrgetter('name', 'date')`, вызов `f(b)` возвращает `(b.name, b.date)`.228- После `f = attrgetter('name.first', 'name.last')`, вызов `f(b)` возвращает `(b.name.first, b.name.last)`.229230Эквивалентно следующему:231232```python233def attrgetter(*items):234 if any(not isinstance(item, str) for item in items):235 raise TypeError('attribute name must be a string')236 if len(items) == 1:237 attr = items[0]238 def g(obj):239 return resolve_attr(obj, attr)240 else:241 def g(obj):242 return tuple(resolve_attr(obj, attr) for attr in items)243 return g244245def resolve_attr(obj, attr):246 for name in attr.split("."):247 obj = getattr(obj, name)248 return obj249```250251#### `operator.itemgetter(item)`252253#### `operator.itemgetter(*items)`254255Возвращает вызываемый объект, который извлекает *элемент* из своего операнда с помощью метода [`__getitem__()`](https://python-all.ru/3.3/library/operator.html#operator.__getitem__) операнда. Если указано несколько элементов, возвращает кортеж полученных значений. Например:256257- После `f = itemgetter(2)`, вызов `f(r)` возвращает `r[2]`.258- После `g = itemgetter(2, 5, 3)`, вызов `g(r)` возвращает `(r[2], r[5], r[3])`.259260Эквивалентно следующему:261262```python263def itemgetter(*items):264 if len(items) == 1:265 item = items[0]266 def g(obj):267 return obj[item]268 else:269 def g(obj):270 return tuple(obj[item] for item in items)271 return g272```273274Элементы могут быть любого типа, принимаемого методом [`__getitem__()`](https://python-all.ru/3.3/library/operator.html#operator.__getitem__) операнда. Словари принимают любое хешируемое значение. Списки, кортежи и строки принимают индекс или срез:275276```python277>>> itemgetter(1)('ABCDEFG')278'B'279>>> itemgetter(1,3,5)('ABCDEFG')280('B', 'D', 'F')281>>> itemgetter(slice(2,None))('ABCDEFG')282'CDEFG'283```284285Пример использования [`itemgetter()`](https://python-all.ru/3.3/library/operator.html#operator.itemgetter) для извлечения определённых полей из записи-кортежа:286287```python288>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]289>>> getcount = itemgetter(1)290>>> list(map(getcount, inventory))291[3, 2, 5, 1]292>>> sorted(inventory, key=getcount)293[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]294```295296#### `operator.methodcaller(name[, args...])`297298Возвращает вызываемый объект, который вызывает метод *name* у своего операнда. Если заданы дополнительные аргументы и/или именованные аргументы, они также будут переданы методу. Например:299300- После `f = methodcaller('name')`, вызов `f(b)` возвращает `b.name()`.301- После `f = methodcaller('name', 'foo', bar=1)`, вызов `f(b)` возвращает `b.name('foo', bar=1)`.302303Эквивалентно следующему:304305```python306def methodcaller(name, *args, **kwargs):307 def caller(obj):308 return getattr(obj, name)(*args, **kwargs)309 return caller310```311312## 10.3.1. Отображение операторов на функции313314В этой таблице показано соответствие абстрактных операций операторам Python и функциям модуля [`operator`](https://python-all.ru/3.3/library/operator.html#module-operator).315316| Операция | Синтаксис | Функция |317| --- | --- | --- |318| Сложение | `a + b` | `add(a, b)` |319| Конкатенация | `seq1 + seq2` | `concat(seq1, seq2)` |320| Проверка вхождения | `obj in seq` | `contains(seq, obj)` |321| Деление | `a / b` | `truediv(a, b)` |322| Деление | `a // b` | `floordiv(a, b)` |323| Побитовое И | `a & b` | `and_(a, b)` |324| Побитовое исключающее ИЛИ | `a ^ b` | `xor(a, b)` |325| Побитовая инверсия | `~ a` | `invert(a)` |326| Побитовое ИЛИ | `a \| b` | `or_(a, b)` |327| Возведение в степень | `a ** b` | `pow(a, b)` |328| Тождественность | `a is b` | `is_(a, b)` |329| Тождественность | `a is not b` | `is_not(a, b)` |330| Присваивание по индексу | `obj[k] = v` | `setitem(obj, k, v)` |331| Удаление по индексу | `del obj[k]` | `delitem(obj, k)` |332| Индексация | `obj[k]` | `getitem(obj, k)` |333| Сдвиг влево | `a << b` | `lshift(a, b)` |334| Остаток от деления | `a % b` | `mod(a, b)` |335| Умножение | `a * b` | `mul(a, b)` |336| Отрицание (арифметическое) | `- a` | `neg(a)` |337| Отрицание (логическое) | `not a` | `not_(a)` |338| Положительный знак | `+ a` | `pos(a)` |339| Сдвиг вправо | `a >> b` | `rshift(a, b)` |340| Присваивание среза | `seq[i:j] = values` | `setitem(seq, slice(i, j), values)` |341| Удаление среза | `del seq[i:j]` | `delitem(seq, slice(i, j))` |342| Срез | `seq[i:j]` | `getitem(seq, slice(i, j))` |343| Форматирование строк | `s % obj` | `mod(s, obj)` |344| Вычитание | `a - b` | `sub(a, b)` |345| Проверка истинности | `obj` | `truth(obj)` |346| Упорядочение | `a < b` | `lt(a, b)` |347| Упорядочение | `a <= b` | `le(a, b)` |348| Равенство | `a == b` | `eq(a, b)` |349| Различие | `a != b` | `ne(a, b)` |350| Упорядочение | `a >= b` | `ge(a, b)` |351| Упорядочение | `a > b` | `gt(a, b)` |352353## 10.3.2. Операторы на месте354355Многие операции имеют версию «на месте». Ниже перечислены функции, предоставляющие более низкоуровневый доступ к операторам на месте, чем обычный синтаксис; например, [*оператор*](https://python-all.ru/3.3/glossary.html#term-statement) `x += y` эквивалентен `x = operator.iadd(x, y)`. Другими словами, `z = operator.iadd(x, y)` эквивалентен составному оператору `z = x; z += y`.356357В этих примерах обратите внимание, что при вызове метода на месте вычисление и присваивание выполняются в два отдельных шага. Функции на месте, приведённые ниже, делают только первый шаг – вызов метода на месте. Второй шаг, присваивание, не выполняется.358359Для неизменяемых объектов, таких как строки, числа и кортежи, новое значение вычисляется, но не присваивается обратно входной переменной:360361```python362>>> a = 'hello'363>>> iadd(a, ' world')364'hello world'365>>> a366'hello'367```368369Для изменяемых объектов, таких как списки и словари, метод на месте выполняет обновление, поэтому последующее присваивание не требуется:370371```python372>>> s = ['h', 'e', 'l', 'l', 'o']373>>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])374['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']375>>> s376['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']377```378379#### `operator.iadd(a, b)`380381#### `operator.__iadd__(a, b)`382383`a = iadd(a, b)` эквивалентно `a += b`.384385#### `operator.iand(a, b)`386387#### `operator.__iand__(a, b)`388389`a = iand(a, b)` эквивалентно `a &= b`.390391#### `operator.iconcat(a, b)`392393#### `operator.__iconcat__(a, b)`394395`a = iconcat(a, b)` эквивалентно `a += b` для последовательностей *a* и *b*.396397#### `operator.ifloordiv(a, b)`398399#### `operator.__ifloordiv__(a, b)`400401`a = ifloordiv(a, b)` эквивалентно `a //= b`.402403#### `operator.ilshift(a, b)`404405#### `operator.__ilshift__(a, b)`406407`a = ilshift(a, b)` эквивалентно `a <<= b`.408409#### `operator.imod(a, b)`410411#### `operator.__imod__(a, b)`412413`a = imod(a, b)` эквивалентно `a %= b`.414415#### `operator.imul(a, b)`416417#### `operator.__imul__(a, b)`418419`a = imul(a, b)` эквивалентно `a *= b`.420421#### `operator.ior(a, b)`422423#### `operator.__ior__(a, b)`424425`a = ior(a, b)` эквивалентно `a |= b`.426427#### `operator.ipow(a, b)`428429#### `operator.__ipow__(a, b)`430431`a = ipow(a, b)` эквивалентно `a **= b`.432433#### `operator.irshift(a, b)`434435#### `operator.__irshift__(a, b)`436437`a = irshift(a, b)` эквивалентно `a >>= b`.438439#### `operator.isub(a, b)`440441#### `operator.__isub__(a, b)`442443`a = isub(a, b)` эквивалентно `a -= b`.444445#### `operator.itruediv(a, b)`446447#### `operator.__itruediv__(a, b)`448449`a = itruediv(a, b)` эквивалентно `a /= b`.450451#### `operator.ixor(a, b)`452453#### `operator.__ixor__(a, b)`454455`a = ixor(a, b)` эквивалентно `a ^= b`.456