2015-07-01 2 views
0

Результат, который я должен получить, если я набираю «eat», должен быть «hdw», если я его сдвиг на 3. Однако конечный результат - «w». Я уверен, что у меня есть все, что мне нужно, но, возможно, это форматирование?Caesar Cipher в Python 3.4.3

def shifter(): 
    phrase = input("Please enter a message: ") 
    key = eval(input("Please enter the number of places to be shifted: ")) 
    list = phrase.split() 
    for word in list: 
     for ch in word: 
      conversion = (chr)((ord(ch) - ord("a") + key) % 26 + ord("a")) 
     newPhrase = " " 
     newPhrase = newPhrase + conversion 
    print(newPhrase) 
shifter() 
+1

вам нужен номер, но почему вам нужно 'eval' ... попробовать' int'. – HuStmpHrrr

+0

Использование 'eval' для преобразования типов просто глупо, поскольку оно создает огромную проблему безопасности. –

ответ

2

Вопрос заключается в том, что вы настраиваете преобразование внутри вашего цикл, вместо добавления к нему, поэтому только последний символ в слове добавляется к newPhrase в конце.

Вы должны добавить к преобразованию, а не устанавливать его.

Кроме того, вы должны инициализировать newPhrase вне цикла, а затем добавить к нему внутри.

Пример -

def shifter(): 
    phrase = input("Please enter a message: ") 
    key = eval(input("Please enter the number of places to be shifted: ")) 
    list = phrase.split() 
    newPhrase = "" 
    for word in list: 
     conversion = '' 
     for ch in word: 
      conversion += (chr)((ord(ch) - ord("a") + key) % 26 + ord("a")) 
     newPhrase = newPhrase + conversion + " " 
    print(newPhrase) 
shifter() 
+0

Я заметил, что по сравнению с моей кодировкой вы также добавили conversion = '' , и я думаю, что это могла быть ключевая точка. Я попытался добавить newPhrase = "" перед циклом for, и ничего не сделано. Поэтому я ценю помощь! –

+0

Это один из главных моментов, наиболее важным моментом является 'conversion =' изменено на 'conversion + =' (для добавления вместо прямой настройки) –

+0

@RickyRodSpanish ключевой момент в том, что вам нужно сделать конкатенацию для каждого символа, который вы попал в цикл 'for ch in word'. Как показал Ананд С Кумар. –

0

Я думаю, что это с вашим отступом! Прямо сейчас, прежде чем делать что-либо с переменным преобразованием, вы уже зациклились на каждом ch в слове, так что вы застряли в последнем ch.

Попробуйте сделать преобразование + = ... Вместо преобразования = ... (Вы, возможно, потребуется инициализировать преобразование до этого, но ВШП.)

+0

Это на самом деле оказалось ОСНОВНОЙ частью решения, поэтому спасибо. Я посмотрел, что делает это + = вещь, и она, по сути, берет левую часть уравнения и добавляет ее себе, в то время как какое-то другое уравнение может случиться с правой стороны. Извините, если я сбиваю с толку, но я не доволен словами. –