Разберём решение и сразу накроем его тестами — это хороший стиль работы с кодом.

Задача

Реализовать шифр Цезаря: сдвинуть каждую букву строки на фиксированное число позиций в алфавите.

Решение

def caesar(text: str, shift: int) -> str: result = [] for ch in text: if ch.isalpha(): base = ord('A') if ch.isupper() else ord('a') result.append(chr((ord(ch) - base + shift) % 26 + base)) else: result.append(ch) return ''.join(result) print(caesar("Hello, World!", 3)) 

Как это работает

Буква переводится в номер внутри алфавита, к номеру прибавляется сдвиг, а остаток от деления на 26 обеспечивает «зацикливание» алфавита. Прочие символы не меняются.

Пример работы

Khoor, Zruog! 

Сложность

O(n) по времени, O(n) по памяти под результат.

Проверка тестами

Хорошая привычка — проверять решение сразу на нескольких примерах, включая крайние случаи.

assert is_valid(True) is not None # базовая проверка вызова assert is_valid(False) is not None # и второй случай 

Такой минимум уже защищает от случайной ошибки при правках кода.

С добавлением проверок решение становится самодокументируемым — сразу видно, что код делает.

Читайте также:

становится · деления · зацикливание · ch.isalpha · фиксированное · Zruog · случай · номер · проверять · каждую · Пример · Проверка · решение · return · тестами · caesar(text · меняются · стиль · обеспечивает · Задача · алфавита · вызова · работает · Реализовать · памяти