Функция, которая принимает и вращает символ - шифр Цезаря

Я пытаюсь создать функцию

rotate_character(char, rot)

который получает символ «char» (строка длиной 1) и целое число «rot». Функция должна вернуть новую строку длиной 1, которая является результатом поворота char на количество разрядов вправо.

Таким образом, ввод «A» для char и «13» для rot вернет

N

(где A имеет начальное значение 0, а B имеет начальное значение 1 и т. д.). Во время ротации следует сохранять заглавные буквы.

Я уже создал функцию, которая с помощью словаря возвращает позицию буквы в алфавите:

letter = input("Enter a letter: ")

def alphabet_position(letter):
    alphabet_pos = {'A':0, 'a':0, 'B':1, 'b':1, 'C':2, 'c':2, 'D':3,
                    'd':3, 'E':4, 'e':4, 'F':5, 'f':5, 'G':6, 'g':6,
                    'H':7, 'h':7, 'I':8, 'i':8, 'J':9, 'j':9, 'K':10,
                    'k':10, 'L':11, 'l':11, 'M':12, 'm':12, 'N': 13,
                    'n':13, 'O':14, 'o':14, 'P':15, 'p':15, 'Q':16,
                    'q':16, 'R':17, 'r':17, 'S':18, 's':18, 'T':19,
                    't':19, 'U':20, 'u':20, 'V':21, 'v':21, 'W':22,
                    'w':22, 'X':23, 'x':23, 'Y':24, 'y':24, 'Z':25, 'z':25 }
    pos = alphabet_pos[letter]
    return pos  

Я полагаю, что могу использовать эту функцию, чтобы получить начальное значение (char) перед вращением.

def rotate_character(char, rot)
    initial_char = alphabet_position(char)
    final_char = initial_char + rot

Но моя проблема в том, что если initial_char + rot больше 25, мне нужно вернуться к началу алфавита и продолжить подсчет. Таким образом, ввод «w» (начальное значение 22) + ввод 8 для rot должны вернуть

e

Как я могу сказать это, используя Python?

if final_char > 25, start at the beginning of the list and continue counting

И обязательно ли мне использовать словарь, который я создал в функции алфавит_позиция? Также было предложено, чтобы я найдите номер символа, используя встроенный список букв Python, например:

import string

letter = input('enter a letter: ')

def alphabet_position(letter):
    letter = letter.lower()
    return list(string.ascii_lowercase).index(letter)

return(alphabet_position(letter))

Я не уверен, какой из них лучший вариант, если вам нужно обернуть, пока вы считаете. Спасибо за вашу помощь / предложения!

ИЗМЕНИТЬ:

Теперь мой код выглядит так:

letter = input("enter a letter")
rotate = input("enter a number")

def rotate(letter, rotate):
    letter = letter.lower()
    return chr((ord(letter) + rotate - 97) % 26 + 97)

print(rotate(letter))

ИЗМЕНИТЬ 2:

def rotate(letter, number):
    letter = letter.lower()
    shift = 97 if letter.islower() else 65
    return chr((ord(letter) + number - shift) % 26 + shift)

letter = input('Enter a letter: ')
number = int(eval(input('Enter a number: ')
print(rotate(letter, number))

дал мне ParseError: "ParseError: неправильный ввод в строке 8" (строка печати)


person HappyHands31    schedule 07.12.2016    source источник
comment
Относительно ошибки из вашего второго редактирования: в строке перед print количество круглых скобок несбалансировано. Кстати: Прекратите использовать eval! Просто number = int(input('Enter a number: ')) достаточно.   -  person Matthias    schedule 07.12.2016


Ответы (2)


Вы можете использовать модуль string, а затем использовать оператор по модулю, чтобы «обернуть» конец алфавита:

from string import lowercase

def rotate_char(char, rot):

    i = lowercase.index(char)
    return lowercase[(i + rot) % 25]
person kiliantics    schedule 07.12.2016

person    schedule
comment
Значит ли это, что мне нужно избавиться от моей первой функции, алфавита_позиции? Пожалуйста, посмотрите правку выше, чтобы узнать, что я использую сейчас. Я попытался запустить его и получил ошибку TypeError: TypeError: rotate () принимает ровно 2 аргумента (1 задан) в строке 8. Также мне нужно сохранить заглавные буквы, т.е. если я введу A + 13, он должен вернуть N вместо n. - person HappyHands31; 07.12.2016
comment
Да, в этой функции нет необходимости. ord(letter) + rotate - 97 делает то же самое и вращается. Затем % 26 + 97 гарантирует, что функция chr будет довольна. Лучше всего то, что это решение не требует ничего, кроме встроенных функций. Нет необходимости в импорте. - person Thmei Esi; 07.12.2016
comment
Ладно, ты хоть понимаешь, почему я получаю сообщение об ошибке? TypeError: rotate () принимает ровно 2 аргумента (1 задан) в строке 8. См. Мою правку выше для того, что я использую. - person HappyHands31; 07.12.2016
comment
Я изменил свой ответ, чтобы он соответствовал вашему коду. Ошибка типа возникла из-за того, что rotate нужно указать два значения letter и rotate, но в вашем коде вы указываете только одно rotate(letter) должно быть rotate(letter, rot) - person Thmei Esi; 07.12.2016
comment
да. См. Мой измененный ответ, чтобы узнать, как разрешить этот конфликт имен. Я просто вызываю вход rot вместо rotate - person Thmei Esi; 07.12.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person Thmei Esi; 07.12.2016