B. Список квадратов 2

В этой задаче мы продолжаем работать со списочными выражениями, но теперь усложним логику: список квадратов должен строиться вне зависимости от порядка значений 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 значения не имеет.

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

Посмотреть код

Решение

Python
[number ** 2 for number in range(a, b + 1 if a < b else b - 1, 1 if a < b else -1)]

Решение

Python
[number**2 for number in range(a, b + (1 if a < b else -1), 1 if a < b else -1)]