Функция Caesar-cypher: ord() получает строку, сообщает, что получает целое число
Я должен был создать функцию Цезаря-Сайфера. Было рекомендовано использовать встроенные функции ord() и chr(), чтобы помочь мне в этом (из учебника, который я использую). Это может или не может быть лучшим способом (определенно не из того, что я посмотрел), но это то, что они хотят, чтобы вы сделали.
Моя проблема заключается в том, что в цикле for, когда я отправляю переменную-заполнитель в функцию ord(), я получаю сообщение об ошибке, что она ожидает строку длины 1, но вместо этого получает целое число. Я поместил функцию print непосредственно перед ней, чтобы подтвердить, что переменная c в этом случае имеет значение 'i', но, похоже, она не работает независимо.
Вот функция, которую я создал:
def rotate_word(word, num):
count = 0
newWord = ''
while count < len(word):
for c in word:
print(c)
newWord += chr(((ord(c)) - (ord(num) -1)))
count += 1
print(newWord)
И это ошибка, которую я получаю:
rotate_word('ibm', -1)
i
Traceback (most recent call last):
File "<pyshell#95>", line 1, in <module>
rotate_word('ibm', -1)
File "<pyshell#94>", line 7, in rotate_word
newWord += chr(((ord(c)) - (ord(num) -1)))
TypeError: ord() expected string of length 1, but int found
Эта ошибка возникает и для целых чисел, отличных от -1. Честно говоря, я не совсем уверен, что сам код выполняет то, что я хочу (я застрял, пытаясь понять эту часть, и я не вижу смысла в обеспечении того, чтобы остальные работали, если эта часть не работает).
1 ответ
ord
принимает string
в качестве параметра и возвращает int
:
Если задана строка, представляющая один символ Unicode, вернуть целое число, представляющее кодовую точку Unicode для этого символа. Например, ord('a') возвращает целое число 97, а ord('€') (знак евро) возвращает 8364. Это обратное значение для chr().
В вашем коде вы передаете int
вместо этого, который дает вам ошибку, которую вы видите в командной строке. Вам не нужно конвертировать num
ни к чему. Просто преобразуйте символ в число, добавьте значение поворота и снова конвертируйте результат обратно в символ с помощью chr
:
def rotate_word(word, num):
count = 0
newWord = ''
while count < len(word):
for c in word:
newWord += chr(ord(c) + num)
count += 1
print(newWord)
rotate_word('ibm', -1) # 'hal'
Обратите внимание, что выше не обрабатывает случаи переполнения / недополнения, когда 'a'
поворачивается влево или 'z'
повернут вправо.