№8 Операторы в Python / Уроки по Python для начинающих
Операторами пользуются для выполнения операций с переменными и значениями.
Python делит операторы на следующие группы:
- Арифметические операторы
- Операторы присваивания
- Операторы сравнения
- Логические операторы
- Операторы тождественности
- Операторы принадлежности
- Побитовые операторы
Арифметические операторы в Python
Арифметические операторы используются с числовыми значениями для выполнения общих математических операций:
Оператор | Значение | Пример |
---|---|---|
+ | добавление | 4 + 5 |
— | вычитание | 8 — 3 |
* | умножение | 5 * 5 |
/ | деление | 4 / 2 |
% | остаток от деления | 7 % 2 |
** | возведение в степень | 2 ** 3 |
// | целочисленное деление | 15 // 4 |
Операторы присваивания в Python
Операторы присваивания используются для присваивания значений переменным:
Оператор | Пример | Так же как |
---|---|---|
= | x = 5 | x = 5 |
+= | x += 3 | x = x + 3 |
-= | x -= 3 | x = x — 3 |
*= | x *= 3 | x = x * 3 |
/= | x /= 3 | x = x / 3 |
%= | x %= 3 | x = x % 3 |
//= | x //= 3 | x = x // 3 |
**= | x **= 3 | x = x ** 3 |
&= | x &= 3 | x = x & 3 |
|= | x |= 3 | x = x | 3 |
^= | x ^= 3 | x = x ^ 3 |
>>= | x >>= 3 | x = x >> 3 |
x | x = x |
Операторы сравнения в Python
Операторы сравнения используются для сравнения двух значений:
Оператор | Значение | Пример |
---|---|---|
== | равно | x == y |
!= | не равно | x != y |
> | больше чем | x > y |
меньше чем | x < y | |
>= | больше чем или равно | x >= y |
меньше чем или равно | x |
Логические операторы в Python
Логические операторы используются для объединения условных операторов:
Оператор | Значение | Пример |
---|---|---|
and | Возвращает значение True если оба утверждения верны | x < 5 and x < 10 |
or | Возвращает True если одно из утверждений верно | x < 5 or x < 4 |
not | Меняет результат, возвращает False если результат True | not(x < 5 and x < 10) |
Операторы тождественности в Python
Операторы тождественности используются для сравнения объектов. Являются ли они одним и тем же объектом с одинаковым местоположением в памяти:
Оператор | Значение | Пример |
---|---|---|
is | Возвращает true если переменные являются одним объектом | x is y |
is not | Возвращает true если переменные разные | x is not y |
Операторы принадлежности в Python
Операторы принадлежности используются для проверки того, представлена ли последовательность в объекте:
Оператор | Значение | Пример |
---|---|---|
in | Возвращает True если последовательность присутствует в объекте | x in y |
not in | Возвращает True если последовательность не присутствует в объекте | x not in y |
Побитовые операторы в Python
Побитовые операторы используются для работы в битовом (двоичном) формате:
Оператор | Название | Значение |
---|---|---|
& | И | Устанавливает каждый бит в 1, если оба бита 1 |
| | Или | Устанавливает каждый бит в 1 если один из двух битов 1 |
^ | только или | Устанавливает каждый бит в 1 если только один из битов 1 |
~ | Не | Переставляет все биты |
Сдвиг влево | Сдвигает влево на количество бит указанных справа | |
>> | Сдвиг вправо | Сдвигает вправо на количество бит указанных справа |
- ТЕГИ
- Уроки Python для начинающих
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: Почта
Python Q https://yandex.ru/q/loves/python Online
Python Q CEO Pythonru admin@pythonru.com https://secure.gravatar.com/avatar/b16f253879f7349f64830c64d1da4415?s=96&d=mm&r=g CEO Pythonru Python Александр Редактор https://t.me/cashncarryhttps://pythonru.com/https://yandex.ru/q/profile/cashnc/ PythonRu.com admin@pythonru.com Alex Zabrodin 2018-10-26 Online Python, Programming, HTML, CSS, JavaScript
Оператор in вхождения/членства элемента в Python
Оператор in и отрицание not in проверяет наличие элемента в последовательности. Выражение x in s принимает значение True , если x является членом s , и False в противном случае.
Выражение x not in s возвращает отрицание наличие элемента x в s .
Все встроенные последовательности и типы множеств set / frozenset поддерживают эту операцию, а также словарь, для которого проверяется, имеет ли словарь данный ключ.
Для типов контейнеров, таких как list , tuple , set , frozenset , dict или collections.deque , выражение x in y эквивалентно вызову any(x is e or x == e for e in y)
Для строковых и байтовых типов x in y имеет значение True тогда и только тогда, когда x является подстрокой y . Эквивалентный тест y.find(x) != -1 . Пустые строки всегда считаются подстрокой любой другой строки, поэтому » in ‘abc’ возвращает True .
Для определяемых пользователем классов, которые имеют метод __contains__() , выражение x in y возвращает True , если y.__contains__(x) возвращает истинное значение, и False в противном случае.
Для определяемых пользователем классов, которые НЕ определяют метод __contains__() , но определяют __iter__() , выражение x in y имеет значение True , если некоторое значение z создается при итерации по y и для которого выражение x is z or x == z истинно.
Наконец, используется протокол итерации старого стиля: если класс определяет метод __getitem__() , выражение x in y возвращает True тогда и только тогда, когда существует неотрицательный целочисленный индекс i , такой что x is y[i] or x == y[i] и ни один из младших целочисленных индексов не вызывает исключение IndexError .
Оператор not in имеет значение обратной истинности in .
Примеры использования in , тестирование наличия элемента:
Вхождение/наличие элемента в список, кортеж множество
>>> x = [1, 2, 3, 4, 5, 6, 7, 8] >>> 5 in x # True >>> 5 not in x # False >>> 0 in x # False >>> 0 not in x # True
Вхождение/наличие подстроки в строке
>>> x = 'возвращает отрицание наличие элемента' >>> 'отрицание' in x # True >>> 'наличие' not in x # False >>> x = 'абракадабра' >>> 'б' in x # True >>> 'б' not in x # False >>> 'н' in x # False >>> 'у' not in x # True
Вхождение/наличие ключа в словаре
>>> x = 'one':1, 'two':2, 'three':3, 'four':4> >>> 'one' in x # True >>> 'one' not in x # False >>> 'five' in x # False >>> 'five' not in x # True
ОПЕРАТОРЫ ПРИНАДЛЕЖНОСТИ В PYTHON
В Python существует два оператора принадлежности: in и not in.
Эти операторы проверяют, является ли значение частью какой либо последовательности: строки, списка, кортежа, словаря.
Оператор «in»
Возвращает True, если значение присутствует в последовательности, иначе возвращает False.
Пример со строкой:
a = "b" in "abc" print(a)
True
Пример со списком:
a = 7 in [3, 4, 5] print(a)
False
Оператор «not in»
Возвращает True, если значения нет в последовательности. Если значение присутствует в последовательности, то возвращает False. Пример:
a = 5 not in (2, 3, 4) print(a)
Когда и зачем использовать оператор := в Python
Совсем недавно Python 3.8 представил оператор присвоения с двоеточием := , аналогичный оператору присвоения = . Использование этого оператора позволяет ускорить и сократить код.
Эта нотация берёт своё начало в математике. При записи уравнений можно написать что-то вроде a=5, a+b=7. Тогда, используя простую алгебраическую операцию, легко вычислить, что b=2. В этом контексте знак равенства означает тождество. Переменные a и b являются постоянными числами, и, хотя их значение неизвестно при инициализации задачи, они существуют и не изменяются.
С другой стороны, в математике существует другая нотация для обозначения отношения ‘x определяется как y’. Запись x := y не означает, что x и y равны друг другу. Здесь x определён как любое значение y. Уравнение скорее одностороннее, чем симметричное, что несколько сложно понять. Эта нотация применяется только для длинных списков определений переменных в узкоспециализированных научных статьях.
Однако в самой последней версии Python 3.8 стало общепринятым использование := или оператора “морж” (он действительно похож на голову лежащего моржа). С его помощью можно определить переменную в границах выражения в контексте программирования.
Так разработчики Python обосновали введение оператора “морж”:
Присвоение имени является важной частью программирования, которая позволяет использовать «описательное» имя вместо более длинного выражения, а также упрощает повторное использование значений. В настоящее время это возможно сделать лишь в виде инструкции, что делает эту операцию недоступной при генерации списков, а также в других выражениях.
Это очень технический способ выразить простую идею, которая вскоре станет более понятна. Давайте посмотрим на оператор “морж” в действии.
Рассмотрим следующий код с функцией f , определённой как f = lambda x : x+2 , которая просто прибавляет 2 к любым введённым данным:
data = [1,2,3,4]
f_data = [y for x in data if (y := f(x)) is not 4]
Получим [3, 5, 6] , поскольку эти результаты функции не равны 4. Это значительно более эффективная реализация, чем её альтернатива, дважды прогоняющая введённые данные через функцию:
f_data = [f(x) for x in data if f(x) is not 4]
Будьте осторожны: поскольку версия 3.8 является совсем новой, некоторые не обновлённые среды могут не поддерживать её.
Давайте рассмотрим другой пример. Есть некий текстовый файл text.txt . Он содержит три строки с буквами от a до i .
abc
def
ghi
Допустим, мы хотим пройти циклом по файлу строка за строкой. Существует несколько способов сделать это. Например, использовать встроенную функцию .readlines() .
for line in open('text.txt','r').readlines():
print(line)
И это неплохое решение — оно делает то, что нужно. Но что, если у вас нет возможности использовать встроенные функции? Не для всех приложений это доступно. Тогда возьмём следующее решение, которое разбивает текст на строки:
for line in open('text.txt','r').read().split('\n'):
print(line)
Оно тоже работает, но составные функции не настолько просты и понятны, как могли бы быть. Запишем с помощью оператора “морж”:
while chunk := open('text.txt').read():
print(chunk)
Здесь мы просто определяем chunk как чтение файла. Просто, коротко и чисто. С другой стороны, запись while chunk = open… была бы неверной, потому что нельзя создавать присвоение переменных при вычислении отдельного выражения.
В качестве следующего примера возьмём заданное выше определение функции f(x), добавлявшей двойку к вводу. Следующая конструкция списка g полностью допустима с использованием оператора “морж”:
g = [y := f(3), y**2, y**3] #содержимое: [5, 25, 125]
Здесь y определяется как f(3) и используется в том же выражении. Нельзя написать что-то вроде g = [y=f(3), …] , поскольку присвоение переменных с использованием = должно выполняться отдельной строкой, а не внутри другого выражения. С помощью стандартного оператора равенства то же самое записывается в две строки:
y = f(3)
g = [y, y**2, y**3]
Теперь использование оператора морж должно быть довольно ясным.
Оператор := может использоваться для присвоения переменных во время вычисления другого выражения.
Поскольку присвоение переменной в форме var = expr должно записываться в отдельной строке, оператор “морж” позволяет сократить пространство, запуская присвоение переменной с выполнением внутри другого выражения, будь то создание списка или чтение файла.
Во многих случаях оператор := аналогичен определению переменных-заполнителей, например for i in range(x): , в котором переменная i инициализируется внутри выражения цикла for. Его можно рассматривать как расширение или обобщение этих “инициализаций скрытых переменных”.
Конечно, оператор “морж” нельзя использовать везде. Следующее недопустимо:
a := 3 # должно быть a=3.
a = b := 4 # должно быть a=b=4
a = (b := 4) # допустимо, но не рекомендуется
Давайте разберём, почему работает выражение a=(b:=4) . Это происходит потому, что b:=4 не только устанавливает b равным четырём, но и возвращает его значение. Поэтому работает и приведённый выше оператор генератора списков ( if y := f(x)) is not 4] ). Он вычисляет b:=4 как выражение, возвращающее значение, в итоге и a , и b имеют значение 4.
Со скобками вокруг первого оператора (a := 3) он выполняется корректно, потому что использование скобок помечает всё внутри них как выражение. Операторы “морж” могут использоваться только внутри других выражений.
Давайте немного выйдет за пределы каноничного Python. Здесь мы рассмотрим некоторые полезные способы использования оператора “морж”, которые могут привести в ярость фанатичных последователей Python.
Рассмотрим функцию exponent , которая увеличивает base по exp .
def exponent(base,exp):
return base**exp
Допустим, нам нужно получить значение четырёх в кубе, сохранив при этом значение степени (3). Воспользуемся оператором “морж”:
exponent(base=4, exp=(storage:=3))
Тройка сохраняется в хранилище переменных, функция выполняется нормально, мы сэкономили строку кода и некоторое время выполнения. При широкомасштабном использовании оператора “морж” эта экономия заметно ощутима.
Оператор “морж” можно использовать даже в операторах if. В примере ниже (placeholder:=x) вычисляется независимо от значения x . Если выход равен четырём, он всё равно сохраняется в плейсхолдере. Обычно такое использование не имеет особой практической ценности, поскольку выполняется избыточное присваивание (что если x!=4 ?), но полезно знать, что такое возможно.
x = 4
if (placeholder:=x) == 4:
print(placeholder) #output: 4
В качестве ещё одного примера кода не в стиле Python, рассмотрим следующую допустимую функцию:
f = lambda x : (m := x+1) + (m**2)
f(3) возвращает 20, потому что (m := x+1) оценивается как 4 и (m**2) оценивается как 16 . Их сумма равна 20, это вычисляется довольной чистым, но при этом несколько хитрым методом.
Как бы то ни было, оператор “морж” — это весьма полезная функция.
Ключевые моменты
- Оператор “морж” записывается так := и представлен в Python 3.8.
- Этот оператор используется только для присваивания переменных внутри других выражений. По крайней мере он помогает сэкономить несколько строк кода, а в некоторых случаях способен значительно ускорить обработку больших данных.
- Операторы “морж” можно использовать везде — от циклов до функций генераторов списка или операторов if для обходного присваивания переменных.
- Менеджеры контекста в Python — выходим за пределы «with open() file»
- 10 популярных проектов GitHub, написанных на Python
- 5 доказательств силы итерируемых объектов в Python