В этой задаче мы продолжаем работать со списочными выражениями, но теперь усложним логику: список квадратов должен строиться вне зависимости от порядка значений a
и b
.
Если a < b
, счёт идёт вперёд. Если a > b
, счёт идёт назад. Результат — один список, содержащий квадраты всех чисел от a до b включительно, в соответствующем порядке.
Вашему решению даны переменные a
и b
. Сформируйте список квадратов всех целых чисел от a
до b
включительно — в прямом или обратном порядке, в зависимости от того, какое значение больше.
Подсказка:
Возьмите за основу решение предыдущей задачи, добавьте в качестве третьего параметра range
условное выражение 1 if a < b else -1
.
Примечание
В решении не должно быть ничего, кроме списочного выражения.
Пример
Ввод
a = 1
b = 5
Вывод
[1, 4, 9, 16, 25]
Ввод
a = 5
b = -4
Вывод
[25, 16, 9, 4, 1, 0, 1, 4, 9, 16]
Решение
Наше решение из предыдущей задачи пройдет первый тест, но сломается на втором. Это связано с тем, что оно не учитывает ситуацию a > b. Нам дают подсказку, как это учесть, но простое следование подсказке не приводит к нужному результату. Дело в том, что как мы знаем из параграфа 2.3. Циклы, в python начало range включено в интервал, а конец – нет. Что происходит когда мы даем на вход a = 1, b = 5? Мы получаем квадраты чисел от 1 до 4. Чтобы исправить ситуацию, в прошлом примере мы увеличивали верхнюю границу на 1 (b + 1) и таким образом перекрывали весь интервал от 1 до 5. Но в случае, когда у нас a > b эта модификация играет с нами злую шутку. Рассмотрим второй пример, a = 5, b = -4. наш алгоритм проходит от a (5) до b + 1 (-3). Что совсем не соответствует тому, что нам необходимо по условию задачи. Выход довольно прост – надо эту же подсказку применить к концу диапазона. Таким образом при a > b наш конец диапазона будет равен b + 1, а при a < b будет соответствовать b – 1. Учитывать равенство при a > b или при a < b значения не имеет.
Представлено два решения. Первое полностью переопределяет конец диапазона, в то время как второе – в зависимости от условия увеличивает или уменьшает конец диапазона. Второе, в данной ситуации более грамотно, но в других случаях может потребоваться и первый вариант.
Посмотреть код
Решение
[number ** 2 for number in range(a, b + 1 if a < b else b - 1, 1 if a < b else -1)]
Решение
[number**2 for number in range(a, b + (1 if a < b else -1), 1 if a < b else -1)]