Шифр Цезаря возвращает только первое переведенное письмо?

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

import string

def encrypt(message,key):
    cryptotext=""
    for character in message:
        if character in string.uppercase:
            old_ascii=ord(character)
            new_ascii=(old_ascii+key-65)%26+65
            new_char=chr(new_ascii)
            cryptotext+=new_char
            return cryptotext

        elif character in string.lowercase:
            old_ascii=ord(character)
            new_ascii=(old_ascii+key-97)%26+97
            new_char=chr(new_ascii)
            cryptotext += new_char
            return cryptotext

        else:
            return character

person Fredrik Engblom    schedule 10.05.2015    source источник
comment
Как создать минимальный, полный и поддающийся проверке пример, вы здесь друг, вам даже не придется задавать вопрос, если вы буду следовать приведенным там советам.   -  person Łukasz Rogalski    schedule 10.05.2015


Ответы (2)


Оператор return прерывается из текущего цикла, что означает, что функция шифрования должна дождаться возврата из цикла: также обратите внимание, что вы должны добавить символ, если он не в верхнем или нижнем регистре, или он просто вернет первый неправильный письмо.
Итак, encrypt(message,key) должен выглядеть так:

def encrypt(message,key):
    cryptotext=""
    for character in message:
        if character in string.uppercase:
            old_ascii=ord(character)
            new_ascii=(old_ascii+key-65)%26+65
            new_char=chr(new_ascii)
            cryptotext+=new_char


        elif character in string.lowercase:
            old_ascii=ord(character)
            new_ascii=(old_ascii+key-97)%26+97
            new_char=chr(new_ascii)
            cryptotext += new_char


        else:
            #Also, append character to cryptotext instead of returning it
            cryptotext+= character
    return cryptotext
person IronManMark20    schedule 10.05.2015
comment
Я только что зарегистрировался, поэтому не могу поставить +1 к вам, но вы мне очень помогли! Вроде все работает! - person Fredrik Engblom; 10.05.2015
comment
Без проблем. Рад, что смог помочь. @mkrieger имеет хороший ответ, он / она просто пропустил изменение return character на cryptotext+= character - person IronManMark20; 10.05.2015

Вы помещаете операторы return внутрь цикла. Это означает, что после первой итерации вы выходите из функции, и в результате у вас остается только один символ.

Ваш код должен выглядеть примерно так:

cryptotext = ""
for character in message:
    # ...
    # do the encryption, without returning
    # ...
return cryptotext # after the loop has finished
person mkrieger1    schedule 10.05.2015