Как использовать операторы Python

Операторы Python помогают работать со значениями или операндами. Они также помогают изменять их и связывать вместе. Операторы могут быть логическими или арифметическими.

Что такое операторы 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]

Оцените статью
cdelat.ru
Добавить комментарий