Задачник · модуль 1 · Данные и имена

Справочник по Python · задачник · модуль 1

Задачи 1.6

1.6

Задачи к главе
«Множественное присваивание»

Несколько имён в одной строке и одновременное обновление связанных величин: обмен, сдвиг по кругу, перенос точки. Ключ ко всем задачам — правая часть вычисляется целиком до того, как изменится хоть одно имя.

Глава справочника
1.6 Множественное присваивание
Можно использовать
главы 1.1–1.6
Разборов
3 с решением
Практика
15 задач без решения
Уже изучено — этим и решаем

Условий и циклов пока нет — они в модулях 2 и 3. Все задачи решаются последовательностью строк сверху вниз. Разбирать строку вида "3 4" на части мы ещё не умеем — каждое значение вводится отдельной строкой.

§1Разборы: как решать и оформлять

Три задачи решены полностью. Смотрите не только на ответ, но и на оформление: исходные данные сверху, расчёт отдельными строками с понятными именами, вывод — в конце.

Разбор 1

Поменять значения местами

★☆☆базовая

Программа читает два числа в переменные a и b, меняет их значения местами и выводит.

Как рассуждаем

  1. Наивный вариант a = b, затем b = a теряет старое значение a на первой же строке.
  2. В записи a, b = b, a правая часть вычисляется первой: берутся текущие значения, потом раздаются по именам.
  3. Третья переменная для обмена не нужна.
main.pyрешение
# Ввод
a = int(input("a = "))
b = int(input("b = "))

# Обмен
a, b = b, a

# Вывод
print("a =", a)
print("b =", b)
Вывод в терминалсиним — то, что ввёл пользователь
a = 5
b = 9
a = 9
b = 5

Проверка на других данных

Пример 1
Ввод
-1
0
Вывод
a = 0
b = -1
Как не надо

a = b → в a уже 9, пятёрка потеряна; b = a → в b тоже 9. Обе переменные получили одно значение.

Разбор 2

Дежурство по кругу

★★☆средняя

Три сотрудника дежурят по очереди: сегодня первый, завтра второй, послезавтра третий. Каждую неделю очередь сдвигается: первый уходит в конец. Выведите очередь сейчас и через неделю.

Как рассуждаем

  1. Сдвиг по кругу: новый первый — это старый второй, новый второй — старый третий, новый третий — старый первый.
  2. Все три имени меняются одновременно, поэтому пишем одну строку: first, second, third = second, third, first.
  3. Имена — строки, преобразовывать ввод не нужно.
main.pyрешение
# Ввод
first = input("Первый дежурный: ")
second = input("Второй дежурный: ")
third = input("Третий дежурный: ")

print("Сейчас:", first, second, third, sep=" → ")

# Сдвиг очереди на неделю
first, second, third = second, third, first
print("Через неделю:", first, second, third, sep=" → ")
Вывод в терминалсиним — то, что ввёл пользователь
Первый дежурный: Анна
Второй дежурный: Борис
Третий дежурный: Вера
Сейчас: → Анна → Борис → Вера
Через неделю: → Борис → Вера → Анна
Проверка по шагам

Правая часть second, third, first — это значения «Борис», «Вера», «Анна». Они раздаются по порядку: first = Борис, second = Вера, third = Анна. Если бы присваивание шло по одному, Анна потерялась бы на первом шаге.

Разбор 3

Робот-пылесос на плане квартиры

★★☆средняя

Робот стартует в точке (0, 0). За один шаг он смещается на dx по горизонтали и dy по вертикали. Выведите координаты после первого и второго шага.

Как рассуждаем

  1. Координаты — пара связанных величин: задаём и обновляем их вместе, одной строкой.
  2. Новая точка = старая точка + смещение: x, y = x + dx, y + dy.
  3. Смещение вводится один раз и используется на обоих шагах.
main.pyрешение
# Старт и ввод
x, y = 0, 0
dx = int(input("Смещение по x: "))
dy = int(input("Смещение по y: "))

# Первый шаг
x, y = x + dx, y + dy
print(f"После шага 1: ({x}, {y})")

# Второй шаг
x, y = x + dx, y + dy
print(f"После шага 2: ({x}, {y})")
Вывод в терминалсиним — то, что ввёл пользователь
Смещение по x: 3
Смещение по y: -2
После шага 1: (3, -2)
После шага 2: (6, -4)

Проверка на других данных

Пример 1
Ввод
0
5
Вывод
После шага 1: (0, 5)
После шага 2: (0, 10)
Когда объединять в одну строку

x, y = 0, 0 читается как одна мысль — «точка в начале координат». А вот dx и dy приходят разными вводами, и склеивать их нечем: разбирать строку на части научимся в главе о строках.

§2Задачи для самостоятельной работы

Решений здесь нет — только условие и примеры, на которых решение нужно проверить. Сложность отмечена звёздами: ★☆☆ — прямое применение главы, ★★☆ — нужно собрать несколько шагов, ★★★ — есть подвох или требуется догадка.

Задача 1.6.1

Обмен двух чисел

★☆☆базовая

Прочитайте два целых числа и выведите их в одной строке в обратном порядке. Порядок нужно поменять в самих переменных, а не только при выводе.

Примеры для проверки

Пример 1
Ввод
5
9
Вывод
9 5
Пример 2
Ввод
100
-3
Вывод
-3 100
Подсказка

Одна строка обмена, затем print(a, b).

Задача 1.6.2

Показания счётчика воды

★☆☆базовая

Программа хранит предыдущее и текущее показание счётчика. Вводятся текущее показание и новое. После сдвига «текущее становится предыдущим, новое — текущим» выведите оба показания и расход между ними.

Примеры для проверки

Пример 1
Ввод
120
135
Вывод
Было: 120, стало: 135, расход: 15
Пример 2
Ввод
4580
4600
Вывод
Было: 4580, стало: 4600, расход: 20
Подсказка

Сдвиг двух значений — одна строка множественного присваивания.

Задача 1.6.3

Счётчики поста

★☆☆базовая

Три счётчика поста — лайки, просмотры и репосты — одной строкой обнуляются. Затем вводятся приросты каждого, и счётчики выводятся.

Примеры для проверки

Пример 1
Ввод
12
340
3
Вывод
Лайки: 12 Просмотры: 340 Репосты: 3
Пример 2
Ввод
0
5
0
Вывод
Лайки: 0 Просмотры: 5 Репосты: 0
Подсказка

Одно значение нескольким именам — цепочка знаков =.

Задача 1.6.4

Точка и её отражение

★☆☆базовая

Одной строкой прочитайте координаты точки в переменные x и y. Выведите точку и её отражение относительно диагонали — точку с переставленными координатами.

Примеры для проверки

Пример 1
Ввод
3
-2
Вывод
Точка: (3, -2)
Отражение: (-2, 3)
Пример 2
Ввод
0
7
Вывод
Точка: (0, 7)
Отражение: (7, 0)
Подсказка

Справа от = можно перечислить два вызова int(input()) через запятую.

Задача 1.6.5

Сдвиг по кругу вправо

★☆☆базовая

Прочитайте три числа в a, b, c. Сдвиньте значения по кругу вправо: a получает значение c, b — значение a, c — значение b. Выведите новые значения.

Примеры для проверки

Пример 1
Ввод
1
2
3
Вывод
3 1 2
Пример 2
Ввод
10
20
30
Вывод
30 10 20
Подсказка

Все три присваивания должны произойти одновременно — одной строкой.

Задача 1.6.6

Перевод между счетами

★★☆средняя

Вводятся балансы двух счетов и сумма перевода с первого счёта на второй. Обновите оба баланса одной строкой и выведите их.

Примеры для проверки

Пример 1
Ввод
1000
1000
300
Вывод
Счёт A: 700
Счёт B: 1300
Пример 2
Ввод
50
0
50
Вывод
Счёт A: 0
Счёт B: 50
Подсказка

Справа — оба новых значения, посчитанные из старых.

Задача 1.6.7

Температура за три последних дня

★★☆средняя

Метеостанция хранит температуру за три последних дня. Вводятся три значения, выводится средняя. Затем вводится температура нового дня: самый старый день выбывает, окно сдвигается, и снова выводится средняя. Средние — с двумя знаками.

Примеры для проверки

Пример 1
Ввод
12
15
9
20
Вывод
Средняя: 12.00
Средняя после сдвига: 14.67
Пример 2
Ввод
-3.5
0
1.5
4
Вывод
Средняя: -0.67
Средняя после сдвига: 1.83
Подсказка

Сдвиг окна — одна строка: каждый день получает значение следующего, последний — новое.

Задача 1.6.8

Фамилия вперёд

★★☆средняя

Вводятся имя и фамилия. Для списка группы их нужно поменять местами: выведите сначала фамилию, потом имя. Поменяйте значения в самих переменных.

Примеры для проверки

Пример 1
Ввод
Анна
Смирнова
Вывод
Смирнова Анна
Пример 2
Ввод
Иван
Петров
Вывод
Петров Иван
Подсказка

Это тот же обмен, что в разборе, только со строками.

Задача 1.6.9

Изменение курса

★★☆средняя

Программа хранит вчерашний и сегодняшний курс валюты. Вводится сегодняшний курс, затем завтрашний. Сдвиньте значения («сегодня» становится «вчера», «завтра» — «сегодня») и выведите изменение курса с двумя знаками.

Примеры для проверки

Пример 1
Ввод
92.35
93.1
Вывод
Было: 92.35, стало: 93.10
Изменение: 0.75
Пример 2
Ввод
100
98.75
Вывод
Было: 100.00, стало: 98.75
Изменение: -1.25
Подсказка

Сдвиг двух значений — одна строка.

Задача 1.6.10

Старая и новая цена

★★☆средняя

Вводится цена товара. Одной строкой запишите её в две переменные — «старая цена» и «цена», затем уменьшите цену на 10% и выведите обе. Убедитесь, что старая цена не изменилась.

Примеры для проверки

Пример 1
Ввод
2000
Вывод
Старая цена: 2000.00
Новая цена: 1800.00
Пример 2
Ввод
149.9
Вывод
Старая цена: 149.90
Новая цена: 134.91
Подсказка

Цепочка присваиваний даёт обоим именам одно число. Изменение одной переменной другую не трогает.

Задача 1.6.11

Ход конём

★★☆средняя

Шахматный конь стоит в клетке с координатами (x, y). Он делает два хода: сначала на +1 по x и +2 по y, затем на +2 по x и −1 по y. Выведите координаты после каждого хода.

Примеры для проверки

Пример 1
Ввод
1
1
Вывод
После хода 1: (2, 3)
После хода 2: (4, 2)
Пример 2
Ввод
4
5
Вывод
После хода 1: (5, 7)
После хода 2: (7, 6)
Подсказка

Обе координаты обновляются одной строкой.

Задача 1.6.12

Рост числа подписчиков

★★★повышенная

Блогер заметил, что число новых подписчиков за день равно сумме двух предыдущих дней. Вводятся приросты за два первых дня. Выведите в одну строку приросты за следующие пять дней через пробел.

Примеры для проверки

Пример 1
Ввод
1
2
Вывод
3 5 8 13 21
Пример 2
Ввод
10
10
Вывод
20 30 50 80 130
Подсказка

Храните два последних значения. Новый день: «последний» становится «предыдущим», а новое значение — сумма обоих. Выводите через end=" ", у последнего вызова — обычный перенос.

Задача 1.6.13

Две недели дежурств

★★★повышенная

Как в разборе, три сотрудника дежурят по кругу. Выведите очередь через одну и через две недели. В конце выведите, совпадает ли очередь через три недели с исходной, — посчитайте третий сдвиг и выведите имена ещё раз.

Примеры для проверки

Пример 1
Ввод
Анна
Борис
Вера
Вывод
Через 1 неделю: Борис Вера Анна
Через 2 недели: Вера Анна Борис
Через 3 недели: Анна Борис Вера
Пример 2
Ввод
1
2
3
Вывод
Через 1 неделю: 2 3 1
Через 2 недели: 3 1 2
Через 3 недели: 1 2 3
Подсказка

Одна и та же строка сдвига повторяется три раза. Сравните последний вывод с тем, что вводили.

Задача 1.6.14

Одновременно или по очереди

★★★повышенная

Вводятся два числа. Выполните над ними шаг «новый x — это старый y, новый y — сумма старых» двумя способами: одной строкой и двумя отдельными присваиваниями. Выведите оба результата и сравните.

Примеры для проверки

Пример 1
Ввод
2
5
Вывод
Одновременно: 5 7
По очереди: 5 10
Пример 2
Ввод
0
1
Вывод
Одновременно: 1 1
По очереди: 1 2
Подсказка

Перед вторым способом верните исходные значения. Во втором способе к моменту расчёта суммы x уже изменился.

Задача 1.6.15

Четыре места по кругу

★★★повышенная

За столом четыре гостя, их имена вводятся по порядку. Каждый тост все пересаживаются на одно место влево: второй садится на место первого, третий — второго, четвёртый — третьего, первый — четвёртого. Выведите рассадку после первого и второго тоста.

Примеры для проверки

Пример 1
Ввод
Аня
Боря
Вика
Глеб
Вывод
После тоста 1: Боря Вика Глеб Аня
После тоста 2: Вика Глеб Аня Боря
Подсказка

Та же идея, что в разборе про дежурства, только имён четыре.

§3Как проверить своё решение

  1. Запустите программу и введите значения из колонки «Ввод» — каждое значение отдельной строкой, после каждого Enter.
  2. Сравните то, что напечатала программа, с колонкой «Вывод» — символ в символ: пробелы, двоеточия, количество знаков после точки.
  3. Подсказки input() в примерах не показаны: текст подсказки у каждого свой, проверяется только результат.
  4. Прогоните все примеры, а не только первый: второй обычно ловит ошибку, которую первый пропускает.
Оформление, которое проверяют

Имена переменных называют смысл: total_cost, а не x. Данные — вверху, расчёт — отдельными строками, вывод — в конце. Одно и то же выражение не повторяется: результат сохраняется в переменную и дальше используется по имени.

Задачи к главе 1.6 · Множественное присваивание · Задачник по Python Автор: Макаров Максим Николаевич