Типичное представление Цезаря Шифра использует оператор модуля. Вероятно, я бы начал там с отладки вашего кода.
Я считаю, что код легче отлаживать, если он плоский , а не вложенный . Если каждая функция выполняет одну маленькую вещь, проще полностью протестировать эту маленькую функцию и собрать их вместе, чтобы иметь правильное поведение. Возьмите следующий пример:
def _caesarLetter(c, k, offset):
return chr((ord(c)-offset+k)%26+offset)
def caesarLetter(c, k):
if not c.alpha():
return c
return _caesarLetter(c, k, ord('a') if c.islower() else ord('A'))
def caesarCipher(s, k):
return ''.join(caesarLetter(c, k) for c in s)
Первый метод _caesarLetter
применяет шифр к одной букве и только для фиксированной кодировки символов. Он в основном берет весь алфавит и переводит его в начало с 0, применяет шифр и перемещает алфавит туда, где он начал. Для строчных букв ascii это 97, а для прописных 65.
Второй метод caesarLetter
позволяет выяснить, где строчные и прописные алфавиты начинаются в кодировке ascii. Вместо того, чтобы явно кодировать 65 и 97, которые подвержены опечаткам и неясным ошибкам, мы просто вычисляем их на лету. Процессорное время дешево. Время разработки дорого. Это проясняет намерение.
Третий метод caesarCipher
просто делает это для всех букв в вашей строке и соединяет их вместе.