"if mode is True" - не надо так. Так же не надо называть целое число, как letter и очередной символ строки, как i,
Ну и алгоритм можно гораздо проще имплементировать:
from typing import Callable
def encode(code: int) -> int:
""" Encode unicode code point of the character. """
return code * 2 - 9
def decode(code: int) -> int:
""" Decode unicode code point of the character. """
return (code + 9) // 2
def process(password: str, func: Callable[[int], int]) -> str:
""" Encode/decode password. """
return ''.join([chr(abs(func(ord(c)))) for c in password])
if __name__ == '__main__':
password = input('Введите пароль: ')
mode = input("Выберите режим (Code/Decode): ").capitalize()
if mode.startswith('Code'):
print(process(password, encode))
elif mode.startswith('Decode'):
print(process(password, decode))
else:
print('Вы ввели {}. Данного режима не существует.'.format(mode))
Ну и наконец, одно большое "но". Маленькая буква "z" кодируется в "ё", а русские буквы вообще черт знает во что. Т.е. вместо правильного utf-символа Windows может напечатать знак вопроса в квадратике - т.е. признак непечатного символа.