operator
— Standard operators as functions¶
Вихідний код: 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)
is equivalent toa <= b
,eq(a, b)
is equivalent toa == b
,ne(a, b)
is equivalent toa != b
,gt(a, b)
is equivalent toa > b
, аge(a, b)
еквівалентноa >= b
. Зауважте, що ці функції можуть повертати будь-яке значення, яке може інтерпретуватися як логічне значення. Перегляньте Порівняння для отримання додаткової інформації про розширені порівняння.
Логічні операції також зазвичай застосовуються до всіх об’єктів і підтримують тести істинності, перевірки ідентичності та логічні операції:
- operator.not_(obj)¶
- operator.__not__(obj)¶
Return the outcome of
not
obj. (Note that there is no__not__()
method for object instances; only the interpreter core defines this operation. The result is affected by the__bool__()
and__len__()
methods.)
- operator.truth(obj)¶
Повертає
True
, якщо obj має значення true, іFalse
в іншому випадку. Це еквівалентно використанню конструктораbool
.
- operator.is_(a, b)¶
Повернути
a is b
. Перевіряє ідентичність об’єкта.
- operator.is_not(a, b)¶
Повернути
a не є 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 в a
. Зверніть увагу на зворотні операнди.
- operator.countOf(a, b)¶
Повертає кількість входжень b у a.
- operator.indexOf(a, b)¶
Повертає індекс першого входження b в a.
- operator.length_hint(obj, default=0)¶
Return an estimated length for the object obj. First try to return its actual length, then an estimate using
object.__length_hint__()
, and finally return the default value.Нове в версії 3.4.
The following operation works with callables:
- operator.call(obj, /, *args, **kwargs)¶
- operator.__call__(obj, /, *args, **kwargs)¶
Return
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)
Return a callable object that fetches item from its operand using the operand’s
__getitem__()
method. If multiple items are specified, returns a tuple of lookup values. For example:Після
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
The items can be any type accepted by the operand’s
__getitem__()
method. Dictionaries accept any hashable value. Lists, tuples, and strings accept an index or a slice:>>> 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)¶
Повертає викликаний об’єкт, який викликає метод ім’я свого операнда. Якщо надано додаткові аргументи та/або ключові аргументи, вони також будуть надані методу. Наприклад:
Після
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
.
Операція |
Синтаксис |
функція |
---|---|---|
Доповнення |
|
|
Конкатенація |
|
|
Тест на утримання |
|
|
Поділ |
|
|
Поділ |
|
|
Порозрядне І |
|
|
Порозрядне виняткове або |
|
|
Побітова інверсія |
|
|
Побітове або |
|
|
Піднесення до степеня |
|
|
Ідентичність |
|
|
Ідентичність |
|
|
Індексоване призначення |
|
|
Індексоване видалення |
|
|
Індексація |
|
|
Ліворуч |
|
|
Модуло |
|
|
Множення |
|
|
Множення матриць |
|
|
Заперечення (арифметика) |
|
|
Заперечення (логічне) |
|
|
Позитивний |
|
|
Правий Shift |
|
|
Призначення фрагмента |
|
|
Видалення фрагмента |
|
|
Нарізка |
|
|
Форматування рядка |
|
|
Віднімання |
|
|
Тест на правду |
|
|
Замовлення |
|
|
Замовлення |
|
|
Рівність |
|
|
Різниця |
|
|
Замовлення |
|
|
Замовлення |
|
|
Оператори на місці¶
Багато операцій мають версію «на місці». Нижче наведено функції, які забезпечують примітивніший доступ до операторів на місці, ніж звичайний синтаксис; наприклад, раз (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'
Для змінних цілей, таких як списки та словники, метод на місці виконає оновлення, тому подальше призначення не потрібне:
>>> 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.