
Операторы Python помогают работать со значениями или операндами. Они также помогают изменять их и связывать вместе. Операторы могут быть логическими или арифметическими.
- Что такое операторы Python и как они работают?
- Каковы различные типы операторов Python?
- Что такое старшинство операторов?
- Что такое перегруженные операторы, методы Дандера и функции операторов Python?
- Обзор операторов Python
- Арифметические операторы
- Операторы сравнения
- Логические операторы
- Побитовые операторы
- Операторы присваивания
- Операторы тождества
- Условный оператор
- Операторы присваивания
- Операторы членства
- Оператор конкатенации
- Операторы index и slice
Что такое операторы Python и как они работают?
Оператор — это символ, обозначающий операцию. Операторы обычно используются для соединения нескольких операндов для формирования нового значения. Применение оператора к одному операнду изменяет его.
Самым простым примером использования операторов Python может быть соединение двух чисел с помощью оператора сложения, который представляет собой знак плюс между числами. Python оценивает выражение и возвращает соответствующее значение:
1 + 1
Особенностью Python является то, что в качестве операторов помимо символов используются короткие слова, такие как «and», «or», «is», «not» или «in». Комбинация операторов и операндов дает выражение:
1 + 1 == 2
Каковы различные типы операторов Python?
Python знает несколько классов операторов. Они работают с различными типами операндов и возвращают результаты определенного типа. Ниже приведен обзор различных типов операторов Python:
Классы операторов Python |
Объяснение |
Операнды |
Результат |
Операторы с первого взгляда |
Арифметические операторы |
Объединение двух чисел для получения нового числа |
Числа |
Число |
+, -, *, /, //, %, **, @ |
Операторы сравнения |
Сравнивают два выражения друг с другом |
Выражения |
Булевы |
<, >, ==, !=, <=, >= |
Логические операторы |
Объединение выражений в булевом контексте |
Выражения |
Последнее оцененное выражение / булево |
и, или, не |
Побитовые операторы |
Манипулирование целыми числами как двоичными последовательностями |
Числа |
Число |
<<, >>, &, |, ^, ~ |
Операторы присваивания |
Присвоение значения имени |
Lvalue, Rvalue |
— / Оцениваемое выражение |
=, :=, +=, -=, *= и т.д. |
Операторы идентификации |
Определяют, относятся ли два имени к одному и тому же объекту |
Объекты |
Булевы |
является, не является |
Условный оператор |
Возвращает одно из двух значений в зависимости от условия |
Выражение, условие, альтернатива |
Выражение / Альтернатива |
… if … else … |
Операторы множеств |
Связать два множества / Сравнить множества |
Количества |
Количество / Булево |
&, |, ^, -, <, >, <=, >= |
Операторы принадлежности |
Проверка, содержит ли итерируемое множество определенный объект |
Объект, итерабельность |
Булево |
в, не в |
Оператор конкатенации |
Цепные последовательности |
Строки / списки / кортежи |
Строка / список / кортеж |
+ |
Операторы индекса и среза |
Возвращают один или несколько элементов итерабельной таблицы |
Iterable, Index / Slice |
Строка / Список / Кортеж |
[], [::] |
Операторы классифицируются в зависимости от их «четкости», а также типа операндов и возвращаемого значения. Четкость оператора не имеет ничего общего с «aric». Этот термин объясняет, сколько операндов объединяет оператор. В большинстве случаев используются «бинарные» операторы с двумя операндами. Существуют также некоторые «унарные» операторы с одним операндом, а также «троичный» оператор, который связывает три операнда:
Четкость оператора | Количество операндов | Пример |
---|---|---|
Унарный | Один операнд | не единственное_значение |
Двоичный | Два операнда | левый_операнд + правый_операнд |
Тернарный | Три операнда | некоторое_значение if условие else другое_значение |
Что такое старшинство операторов?
Понимание старшинства операторов является основополагающим при использовании операторов Python. Это понятие пришло из арифметики и известно как «точка перед тире». Напомним, что выражение 3 * 8 + 2 интерпретируется как (3 * 8) + 2, а не 3 * (8 + 2). Что касается знака плюс и знака умножения, то для всех операторов Python существуют правила старшинства. Ниже приведен пример выражения с логическими операторами «и», «или» и «не»:
if is_user and is_user_logged_in or is_admin and not login_blocked:
...
Не зная правил старшинства для соответствующих операторов Python, невозможно определить, как должны быть составлены отдельные термины. Все может усложниться, если в одном выражении используется несколько операторов. Как правило, лучше не полагаться на идеальное понимание неявных правил. Вы должны использовать явные фигурные скобки, чтобы уточнить, как термины выражения связаны между собой:
if (is_user and is_user_logged_in) or (is_admin and not login_blocked):
...
Одни и те же термины, сгруппированные по-разному, приводят к разным высказываниям:
if (is_user and is_user_logged_in or is_admin) and not login_blocked:
...
Что такое перегруженные операторы, методы Дандера и функции операторов Python?
Некоторые операторы Python используются для выполнения более чем одной операции. Ярким примером является знак плюс. Знак плюс действует как оператор сложения для чисел и как оператор конкатенации для объединения последовательностей, таких как строки и списки. Мы складываем два числа с помощью оператора сложения:
8 + 3 == 11
Мы объединяем две строки с помощью того же оператора:
"Walter" + "White" == "WalterWhite"
Мы также объединяем списки с помощью оператора плюс:
['Jack', 'Jim'] + ['John'] == ['Jack', 'Jim', 'John']
Многофункциональность знака плюс как оператора отражает общую концепцию в информатике. Возможно, вы слышали о «перегруженных операторах», когда один и тот же оператор выполняет различные операции в зависимости от типа данных операндов.
Как работают перегруженные операторы в Python? Оператор и его операнды интерпретируются как подсказка к соответствующей функции. Включается метод Dunder первого операнда, который получает остальные операнды в качестве аргументов. «Dunder» означает «двойное подчеркивание». Поэтому оператор plus соответствует методу __add__() Dunder. Объекты, реализующие метод __add__(), могут быть связаны с оператором plus. Что именно представляет собой связь, зависит от объекта.
В дополнение к методам Дандера модуль operator содержит функции, которые заключают в себе функциональность операторов Python. Например, «operator.add(a, b)» включает метод Дандера a.__add__(b), который эквивалентен выражению a + b. Мы будем перечислять операторную функцию для каждого оператора по мере возможности на протяжении всей статьи. Имя операторной функции соответствует имени соответствующего метода Дандера. Вы можете использовать эту таблицу в качестве справочника для реализации собственной операторной функции:
Оператор Python | Функция оператора | Метод Дандера |
---|---|---|
a + b | operator.add(a, b) | a.__add__(b) |
Операторы используют инфиксную нотацию, которая вставляет оператор между операндами, в то время как функциональный стиль использует префиксную нотацию. Обе нотации эквивалентны:
Нотация | Использовать | Пример |
---|---|---|
Инфиксная | Операторы | a + b |
Префиксные | Функции | + a b / add(a, b) |
Рассмотрим пример. Мы определяем два числа и складываем их с помощью оператора, операторной функции и соответствующего метода Дандера:
import operator
a = 42
b = 69
assert a + b == operator.add(a, b) == a.__add__(b)
Более сложные выражения также могут быть записаны с помощью оператор-функций. Комбинация операторов сложения и равенства Python в префиксной нотации приведена ниже:
import operator
assert 'Py' + 'thon' == 'Python'
assert operator.eq(operator.add('Py', 'thon'), 'Python')
Обзор операторов Python
Теперь мы рассмотрим одиннадцать различных классов операторов Python.
Арифметические операторы
Арифметические операторы Python оперируют с числами для создания нового числа. Все они являются двоичными операторами, за исключением унарных «плюс» и «минус». Их обзор приведен ниже:
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
+ | Сложение / унарный плюс | add(a, b) / pos(a) | 5 + 3 == 8 / +8 == 4 + 4 |
— | Вычитание / унарный минус | sub(a, b) / neg(a) | 7 — 2 == 5 / -4 == 2 — 6 |
* | Умножение | mul(a, b) | 2 * 3 == 6 |
/ | «Реальное» деление | truediv(a, b) | 8 / 2 == 4.0, 7 / 2 == 3.5 |
// | Деление целого числа на следующее меньшее целое число | floordiv(a, b) | 8 // 2 == 4, 7 // 2 == 3 |
% | Модуль: остаток от целочисленного деления | mod(a, b) | 8 % 2 == 0, 7 % 2 == 1 |
** | Экспоненция | pow(a, b) | 2 ** 3 == 8, 10 ** -1 == 0.1 |
@ | Матричное умножение | matmul(a, b) | — |
Для определения четности числа по умолчанию используется операция модуляции. Это связано с тем, что четное число, деленное на два, имеет остаток, равный нулю. Мы определяем соответствующую функцию Python с оператором modulus:
def is_even(number):
return number % 2 == 0
# test
assert is_even(8) and not is_even(7)
Для матричного умножения требуется пакет, такой как NumPy.
Операторы сравнения
Операторы сравнения Python указывают, как два элемента могут быть упорядочены относительно друг друга. Они дают булевский результат и используются, в частности, в алгоритмах сортировки:
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
< | Меньше, чем | lt(a, b) | 3 < 1, ‘a’ < ‘z’ |
> | Больше, чем | gt(a, b) | 4 > 2, ‘z’ > ‘a’ |
== | Равно | eq(a, b) | ‘a’ == ‘a’ |
!= | Не равно | ne(a, b) | 1 ! = 2, ‘Jim’ != ‘Jack’ |
<= | Меньшие равенства | le(a, b) | 9 <= 10, 10 <= 10 |
>= | Большее равенство | ge(a, b) | 11 >= 10, 10 >= 10 |
Логические операторы
Логические операторы Python «и» и «или» связывают несколько операндов, следуя булевой логике. В результате оба оператора возвращают последний оцененный объект. Логический оператор Python «not» интерпретирует объект в булевом контексте и отрицает его истинностное значение:
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
и | Логическое И | нет прямого соответствия | True и False == False, ‘name’ и … == … |
или | Логическое ИЛИ | нет прямого соответствия | False или True == True, a = » или ‘Default’; assert a == ‘Default’. |
не | Отрицание | not_(a) | не Истина == Ложь |
Полезно визуализировать эффект от логических операций на таблицах истинности. Ниже показано логическое «И»:
и |
Истина |
Ложь |
Истинно |
True |
Ложь |
Ложь |
Ложь |
Ложь |
И логическое «ИЛИ»:
или |
Истинно |
Ложь |
Истинно |
True |
Правда |
Ложь |
Правда |
Ложь |
Операнды булевых операторов Python ни в коем случае не ограничиваются булевыми переменными. Любой объект Python может быть интерпретирован в булевом контексте. Следующие объекты оцениваются как false в булевом контексте и называются «ложными»:
Объект | Объяснение |
---|---|
Ложь, Нет | Константы, которые являются ложными в соответствии с определением |
0, 0.0, Decimal(0), Fraction(0, 1) и т.д. | Число, представляющее собой ноль |
», (), [], {}, set(), range(0) и т.д. | Пустая последовательность или коллекция |
Побитовые операторы
Побитовые операторы Python работают с целыми числами, которые интерпретируются как битовые последовательности. Все они являются бинарными операторами, за исключением побитового оператора «NOT»:
Оператор Python |
Значение |
Функция оператора |
Пример |
<< |
Сдвиг битовой последовательности влево |
lshift(a, b) |
5 << 3 == 5 * 2 ** 3 |
>> |
Сдвиг битовой последовательности вправо |
rshift(a, b) |
1 >> 1 == 0, 8 >> 1 == 4 |
& |
Объедините две битовые последовательности методом «AND» |
and_(a, b) |
« |
| |
Объединить две битовые последовательности по «ИЛИ» |
or_(a, b) |
« |
^ |
Соединение двух битовых последовательностей с помощью «XOR» |
xor(a, b) |
« |
~ |
Инвертирование битовой последовательности с помощью «NOT» |
invert(a) |
« |
Битовые операторы подходят для оптимизированных математических операций. Сдвиг влево соответствует умножению на степень двойки:
Выражение |
23 = 8 |
22 = 4 |
21 = 2 |
20 = 1 |
Десятичная дробь |
b = 6 |
0 |
1 |
1 |
0 |
6 |
b << 1 |
1 |
1 |
0 |
0 |
12 |
b >> 1 |
0 |
0 |
1 |
1 |
3 |
Мы построили таблицу отдельных битов для иллюстрации побитовых операций «И», «ИЛИ» и «НЕ». Эти операции применяются к числу в двоичном представлении с помощью битовой маски:
Выражение |
23 = 8 |
22 = 4 |
21 = 2 |
20 = 1 |
Десятичная система |
биты = 6 |
0 |
1 |
1 |
0 |
6 |
маска = 5 |
0 |
1 |
0 |
1 |
5 |
биты & маска |
0 |
1 |
0 |
0 |
4 |
биты | маска |
0 |
1 |
1 |
1 |
7 |
биты ^ маска |
0 |
0 |
1 |
1 |
3 |
Побитовый оператор «NOT» в Python инвертирует битовую последовательность. При этом каждая 1 превращается в 0 и наоборот. Кроме того, знак числа меняется на противоположный:
Выражение |
23 = 8 |
22 = 4 |
21 = 2 |
20 = 1 |
Десятичная дробь |
b = 6 |
0 |
1 |
1 |
0 |
6 |
~ b |
1 |
0 |
0 |
1 |
-7 |
Операторы присваивания
Операторы присваивания являются одним из основных операторов в большинстве языков программирования. Операторы присваивания в Python связывают значение с именем переменной. В дополнение к оператору присваивания существует более новый оператор «морж», который позволяет выполнять присваивание внутри выражения. Существует также несколько расширенных операторов присваивания, которые объединяют присваивание с другими операциями:
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
= | Оператор присваивания | нет прямого соответствия | имя = ‘Walter’ |
:= | Выражение присваивания (оператор «морж») | нет прямого соответствия | [ half for x in range(10) if (half := x / 2) < 5 ] |
+= | Расширенное присваивание сложения | iadd(a, b) | x = 1; x += 4; assert x == 5 |
Python знает расширенные операторы присваивания для арифметических и побитовых операций. Здесь мы не будем перечислять их по отдельности. Мы просто покажем общую схему на примере расширенного присваивания конкатенации. Сначала показан код, который добавляет еще одну часть к существующей строке:
name = 'Walter'
name = name + 'White'
assert name == 'WalterWhite'
Эквивалентный пример с использованием расширенного оператора конкатенации Python «+=» дает тот же результат, но код более лаконичен и выразителен:
name = 'Walter'
name += 'White'
assert name == 'WalterWhite'
Операторы тождества
Оператор Python is проверяет, ссылаются ли две переменные на один и тот же объект в хранилище. Идентичность объектов отличается от равенства объектов, которое проверяется оператором сравнения Python «==». Оператор «is» в Python аналогичен оператору строгого равенства JavaScript «===». В Python также есть тест на отрицание идентичности с помощью оператора «is not»:
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
есть | Тест на идентичность | is_(a, b) | a = 42; b = a; assert a is b |
не | Тест на отрицание идентичности | is_not(a, b) | assert [42] is not [42] |
Давайте рассмотрим несколько примеров. Мы создаем ссылку на объект в хранилище. Позже мы создадим другую ссылку в качестве псевдонима. Оператор is возвращает true, если обе переменные указывают на один и тот же объект в хранилище:
# assign value to name
a = [42]
# reference existing object
b = a
# if this holds
assert a is b
# so will this
assert a == b
В приведенном ниже примере мы создаем две ссылки на независимые объекты в памяти. Хотя объекты одинаковы, они различны. В этом случае оператор is возвращает false:
# assign the same value to different names
a = [42]
b = [42]
# `a`, `b` are two different objects
assert a is not b
# that contain the same value
assert a == b
Условный оператор
Условный оператор Python можно использовать вместо ключевых слов «if-else». Условный оператор часто используется для различения двух возможных значений в присваиваниях. Он также известен как троичный оператор, поскольку условный оператор объединяет условие и два выражения.
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
… if … else … | Условное выражение | нет прямого соответствия | имя = ‘Джим’ если возраст == 42 иначе ‘Джек’ |
Давайте сначала рассмотрим пример с использованием оператора if-else в Python. Следующий код устанавливает градусы Цельсия или Фаренгейта в качестве единицы измерения температуры в зависимости от выбранной системы измерения:
if system == 'metric':
unit = 'C'
else:
unit = 'F
Этот код можно упростить до одного присваивания с помощью условного оператора:
unit = 'C' if system == 'metric' else 'F'.
Операторы присваивания
В дополнение к строкам, кортежам, спискам и словарям, Python по умолчанию поддерживает множества как составной тип данных. Для обычных операций с множествами определены перегруженные операторы:
Оператор Python | Значение | Функция оператора | Пример | ||
---|---|---|---|---|---|
& | Объединение двух множеств | and_(a, b) | {‘a’, ‘b’} & {‘a’, ‘c’} == {‘a’} | ||
Пересечение двух множеств | or_(a, b) | {‘a’, ‘b’} | {‘a’, ‘c’} == {‘a’, ‘c’, ‘b’} | ||
^ | Образует симметричную разность двух множеств | xor(a, b) | {‘a’, ‘b’} ^ {‘a’, ‘c’} == {‘c’, ‘b’} | ||
— | Разность двух множеств | sub(a, b) | {‘a’, ‘b’} — {‘a’} == {‘b’} | ||
> | Проверяет, является ли количество истинным супермножеством | gt(a, b) | assert {‘a’, ‘b’} > {‘a’} | ||
>= | Проверяет, является ли множество супермножеством | ge(a, b) | assert {‘a’} >= {‘a’} | ||
< | Проверяет, является ли количество истинным подмножеством | lt(a, b) | assert {‘a’} < {‘a’, ‘b’} | ||
<= | Проверяет, является ли количество подмножеством | le(a, b) | assert {‘a’} <= {‘a’} |
Операторы членства
Операторы членства Python «in» и «not in» позволяют определить, включен ли объект в коллекцию.
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
in | Проверяет, содержится ли объект в итерабле | contains(a, b) | ‘y’ в ‘Python’ |
не в | Отрицание оператора in | not contains(a, b) | ‘x’ не в ‘Python’ |
Операторы членства работают с итерациями и используют проверку на равенство, чтобы определить, находится ли целевой объект в коллекции:
'Py' in 'Python'
'Px' not in 'Python'
'Jack' in ['Jim', 'Jack']
Использование оператора «in» позволяет сэкономить на написании кода следующего вида:
def my_in(target, collection):
for element in collection:
if element == target:
return true
return False
# test
word = 'Python'
letter = 'y'
assert (my_in(letter, word)) == (letter in word)
Оператор конкатенации
Оператор конкатенации используется для объединения последовательностей одного типа. Символом оператора является знак плюс.
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
+ | Соединяет две последовательности | add(a, b) | [‘Джим’] + [‘Джек’, ‘Джон’]. |
Давайте рассмотрим несколько примеров. Мы конкатенируем две строки, два списка и два кортежа:
assert "Walter" + "White" == 'WalterWhite'
assert ['a', 'b'] + ['c'] == ['a', 'b', 'c']
assert ('q', 'r') + ('s', 't') == ('q', 'r', 's', 't')
Python используется как язык интернет-программирования. Оператор конкатенации можно использовать для сборки HTML-тегов:
site_title = 'Welcome'
print('<h1>' + site_title + '</h1>')
Операторы конкатенации различаются в Python и PHP. Это связано с тем, что PHP использует точку «.» в качестве символа. Ниже показан тот же пример в PHP:
$siteTitle = 'Welcome';
echo '<h1>' . $siteTitle . '</h1>';
Операторы index и slice
Оператор index в Python используется для извлечения определенного элемента коллекции. Оператор slice используется для извлечения подпоследовательности.
Оператор Python | Значение | Функция оператора | Пример |
---|---|---|---|
iterable[index] | Возвращает элемент итерабельной таблицы, расположенный под индексом. | getitem(iterable, index) | ‘Python'[1] == ‘y’ |
sequence[start:stop:step] | Возвращает фрагмент последовательности | getitem(iterable, slice(start, stop, step)) | ‘Python'[0:1] == ‘Py’, ‘Python'[0:-1:2] == ‘Pto’ |
Операторы index и slice в Python возвращаются к методу __getitem__() в Dunder. Для этого используется либо числовой индекс, либо объект slice:
names = ['Jim', 'Jack', 'John']
names[0] == names.__getitem__(0)
names[0:2] == names.__getitem__(slice(0, 2))
Оператор slice удобен тем, что позволяет извлекать подпоследовательность без использования циклов Python for-loop или Python while-loop. Это избавляет программистов от написания кода в следующем виде:
word = 'Python'
start, stop, step = 0, 5, 2
index, substring = start, ''
while index in range(start, stop, step):
substring += word[index]
index += step
# test
assert substring == word[start:stop:step]