Función que recibe y rota el carácter – Cifrado César

Estoy tratando de crear una función

rotate_character(char, rot) 

que recibe un carácter, “char” (una cadena con una longitud de 1) y un entero “rot”. La función debe devolver una nueva cadena con una longitud de 1, que es el resultado de rotar el carácter por número de lugares de rotación a la derecha.

Así que una entrada de “A” para char y “13” para podredumbre volvería

 N 

(con A que tiene un valor inicial de 0, y B que tiene un valor inicial de 1, etc.). La capitalización debe mantenerse durante la rotación.

Ya creé una función que devuelve la posición de una letra en el alfabeto usando un diccionario:

 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 

Me imagino que puedo usar esta función para obtener el valor inicial de (char) antes de la rotación.

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

Pero mi problema es que, si initial_char + rot es mayor que 25, necesito volver al principio del alfabeto y continuar contando. Así que una entrada de “w” (valor inicial de 22) + una entrada de 8 para la podredumbre debería volver

 e 

¿Cómo digo esto usando python?

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

¿Y necesariamente necesito usar el diccionario que creé en la función de alphabet_position? También se sugirió que encontrara el número de carácter utilizando la lista integrada de letras de Python, como esta:

 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)) 

No estoy seguro de cuál de estos es la mejor opción para ir cuando tienes que envolver mientras cuentas. Gracias por su ayuda / sugerencias!

EDITAR :

Ahora mi código se ve así:

 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)) 

EDIT 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)) 

me dio un ParseError: “ParseError: entrada incorrecta en la línea 8” (la línea de impresión)

 def rotate(letter, rot): shift = 97 if letter.islower() else 65 return chr((ord(letter) + rot - shift) % 26 + shift) letter = input('Enter a letter: ') rot = int(input('Enter a number: ')) print(rotate(letter, rot)) 

Puede usar el módulo de string y luego usar el operador de módulo para “envolver” el final del alfabeto:

 from string import lowercase def rotate_char(char, rot): i = lowercase.index(char) return lowercase[(i + rot) % 25]