Моя программа должна кодировать входные сообщения, используя шифр Цезаря. Я попытался разбить строку на множество букв, поставив между ними «/». Тогда все, собственно, и заработало (как я думаю). В конце концов, когда сообщение приближается к chr(ord(ch)+ 2), появляется ошибка. Как я могу исправить это?
def main():
print("This program will encode your messages using a Caesar Cipher")
message = input("Enter the message: ")
load = ("")
codedMessage = ("")
for i in message:
load = load + i + "/"
''.join(load)
for ch in load.split("/"):
codedMessage = codedMessage + chr(ord(ch)+ 2)
print("The coded message is:", codedMessage)
main()
Вставка косой черты, а затем разделение этого символа совершенно бессмысленно; вы можете напрямую перебирать символы через for ch in message:
. На самом деле, ты сделал именно это, в процессе генерации строки с косой чертой!
см. ул.макетранс и ул.перевод для более простого способа перевода строк.
Что за ошибка выскакивает?
Вы должны сделать это:
print("This program will encode your messages using a Caesar Cipher")
message = input("Enter the message: ")
codedMessage = ""
for ch in message:
codedMessage = codedMessage + chr(ord(ch) + 2)
print("The coded message is:", codedMessage)
Вам не нужно load
и разделение на '/'. Вы добавили лишние символы только для того, чтобы разделить и удалить их. Хуже того, в этом случае после того, как вы добавили /
, у вас теперь остается завершающий /
, и поэтому, когда вы выполняете split(), последняя часть является символом пробела.
Итак, удалите первую петлю for
и сразу же перейдите к следующей. Если вы все еще видите проблему, возможно, input()
дает вам завершающие символы, поэтому ошибка, которую вы видите, имеет смысл.
Просто запустите input("The message").trimspace()
, чтобы удалить конечные пробельные символы, и код должен работать. Вы можете работать над оптимизацией своего кода отдельно, но проблема должна заключаться в этом.
В вашем первом цикле for
вы всегда добавляете символ /
в конец строки, что означает, что у вас есть конечный /
в конце вашей последней строки. Когда вы делаете load.split('/')
, строка в конце разделяется вправо, оставляя вас с пустой строкой в конце, которая выдает ошибку, поскольку вы пытаетесь получить ord
из ничего:
Вот пример кода того, о чем я говорю:
>>> "o/".split('/')
['o', '']
Последнее ''
- это то, что дает вам ошибку. Есть множество способов исправить это, но я думаю, что лучше всего пропустить разделители /
и просто использовать входную строку, как говорят некоторые другие люди.
load = ''.join(load)
; строкаload
не изменяется на месте. (Действительно, это не можем может быть изменено; значенияstr
неизменяемы.)