В основном вы пытаетесь реализовать версию шифра Цезаря, но работающую по всему диапазону печати ASCII вместо букв алфавита.
def encode_string(s, offset):
return ''.join(chr(32+((ord(ch)-32)+offset)%95) for ch in s)
# Examples:
encode_string('~~ Hello, World! ~~', 1)
' !Ifmmp-!Xpsme"! '
encode_string(' !Ifmmp-!Xpsme"! ', -1)
'~~ Hello, World! ~~'
Символ %
называется символом оператор модуля. Он вычисляет остаток от одного числа при делении на другое. Вычитая 32 из исходного значения ASCII, вы получите число в диапазоне 0–94. Затем вы можете добавить или вычесть все, что вам нравится из этого, а затем вы можете использовать этот оператор модуля, чтобы ограничить результат другим числом в диапазоне 0–94. Добавьте 32 к результату, и вы получите свой закодированный результат обратно.