Оператор присваивания и сокращённые формы (+=, -=)
Оператор присваивания и сокращённые формы (+=, -=)
Из модуля 1 вы знаете, что = присваивает значение переменной. Но в программировании часто встречается одна и та же операция: «взять текущее значение переменной, применить к нему что-то, записать обратно». Для таких случаев Python предлагает сокращённые операторы присваивания — компактный и читаемый синтаксис.
Проблема: повторяющийся код
Представьте счётчик очков в игре. Каждый раз, когда игрок набирает очки, нужно прибавить их к счёту:
score = 0
score = score + 10 # игрок набрал 10 очков
score = score + 25 # ещё 25 очков
score = score + 5 # ещё 5 очков
print(score) # 40
Запись score = score + 10 работает, но выглядит громоздко: имя переменной повторяется дважды. Python предлагает сокращение — +=.
Оператор +=
x += y — это краткая запись x = x + y. Значение y прибавляется к x и результат записывается обратно в x:
score = 0
score += 10 # score = score + 10 → 10
score += 25 # score = score + 25 → 35
score += 5 # score = score + 5 → 40
print(score) # 40
Намного чище, правда?
Все сокращённые операторы присваивания
Python поддерживает сокращённые формы для всех арифметических операторов:
| Оператор | Эквивалент | Пример (x=10) | Результат |
|---|---|---|---|
x += y | x = x + y | x += 3 | 13 |
x -= y | x = x - y | x -= 3 | 7 |
x *= y | x = x * y | x *= 3 | 30 |
x /= y | x = x / y | x /= 4 | 2.5 |
x //= y | x = x // y | x //= 3 | 3 |
x %= y | x = x % y | x %= 3 | 1 |
x **= y | x = x ** y | x **= 2 | 100 |
n = 10
n += 5 # 15
print(n)
n -= 3 # 12
print(n)
n *= 2 # 24
print(n)
n //= 5 # 4
print(n)
n **= 3 # 64
print(n)
Сокращённые операторы и строки
Оператор += работает и со строками — он конкатенирует (склеивает):
message = "Привет"
message += ", мир"
message += "!"
print(message) # Привет, мир!
И оператор *= работает со строками — повторяет строку:
line = "-"
line *= 20
print(line) # --------------------
Важно: += создаёт новый объект для неизменяемых типов
Технически для чисел и строк (которые являются неизменяемыми типами) x += y создаёт новый объект и присваивает его переменной, а не изменяет существующий. Проверить это можно через id():
x = 10
print(id(x)) # например, 140234567890
x += 1
print(id(x)) # другое число — это другой объект!
Для понимания на начальном этапе это не критично. Просто знайте, что += для чисел и строк — это синтаксический сахар, а не «мутация в месте».
Оператор := (walrus operator)
Python 3.8 добавил новый оператор присваивания — := (называется «walrus operator», потому что похож на глаза и клыки моржа: 눈:=). Он позволяет присваивать значение и использовать его в одном выражении:
# Без walrus:
n = len("Hello")
if n > 3:
print(f"Длинное слово: {n} символов")
# С walrus:
if (n := len("Hello")) > 3:
print(f"Длинное слово: {n} символов")
Walrus особенно удобен в циклах while, когда нужно читать данные до получения специального значения:
# Читаем строки, пока пользователь не введёт "стоп"
line = input("Введите строку (или 'стоп'): ")
while line != "стоп":
print(f"Вы написали: {line}")
line = input("Ещё строку: ")
# С walrus — компактнее:
while (line := input("Введите строку: ")) != "стоп":
print(f"Вы написали: {line}")
Используйте := умеренно — только когда это действительно упрощает код.
Практический пример: накопитель
Сокращённые операторы идеально подходят для накопления значений:
total = 0
count = 0
# Допустим, обрабатываем список покупок (к спискам вернёмся в модуле 5)
price1, price2, price3 = 100, 250, 75
total += price1 # 100
total += price2 # 350
total += price3 # 425
count += 1
count += 1
count += 1
average = total / count
print(f"Итого: {total} руб.") # 425
print(f"Среднее: {average:.0f} руб.") # 142 руб.
Ошибка: +=на несуществующей переменной
Важный момент: сокращённые операторы не создают переменную с нуля. Если переменная не существует — получите NameError:
# counter += 1 # NameError: name 'counter' is not defined
counter = 0
counter += 1 # теперь работает
Всегда инициализируйте переменную перед использованием +=.
Проверь себя
Какое значение будет в x после выполнения?
x = 2
x **= 3
x -= 4
x *= 2
x **= 3→2 ** 3 = 8x -= 4→8 - 4 = 4x *= 2→4 * 2 = 8
Итог: 8.
Итог
- Сокращённые операторы (
+=,-=,*=,/=,//=,%=,**=) компактно записывают изменение переменной на основе её текущего значения. x += yполностью эквивалентноx = x + y— никакой магии, просто удобная запись.+=работает не только с числами, но и со строками (конкатенация) и другими типами.- Перед использованием
+=переменная должна быть инициализирована. - Оператор
:=(walrus) позволяет присваивать и использовать значение в одном выражении — удобен в циклах.
В следующем уроке подробно разберём операции со строками: конкатенацию, повторение и индексацию (срезы).