2014-01-10 3 views
1

Я пытаюсь создать простую программу для шифрования строки и возврата ее зашифрованных символов.Запуск цикла с помощью скрипта шифрования

Однако у меня возникли проблемы с для цикла, который вызывает Python, чтобы отобразить сообщение об ошибке:

Traceback (most recent call last): 
File "C:/Users/Alex/Desktop/Uni/Programming/encrypt", line 18, in <module> 
encrypt(encin) 
File "C:/Users/Alex/Desktop/Uni/Programming/encrypt", line 12, in encrypt 
encout += e6 
UnboundLocalError: local variable 'encout' referenced before assignment 

Вот код:

key = 10 
encout = '' 
def encrypt(s): 
    for c in s: 
     if c != ' ' : 
      e1 = ord(s) 
      e2 = e1 - 97 
      e3 = e2 + key 
      e4 = e3 % 26 
      e5 = e4 + 97 
      e6 = chr(e5) 
      encout = encout + e6 
     else: 
      encout = encout + c 
a = input("To encrypt a string type 1, to decrypt a string type 2: ") 
if a == '1': 
    encin = input("Please type the string to encrypt: ")  
encrypt(encin) 
print(encout) 

Вы можете увидеть какие-либо проблемы с ним?

Спасибо.

ответ

3

Как сказано в сообщении об ошибке, вы считывая значение encout, локальную переменную функции encrypt, до, объявляя ее (то есть, прежде чем что-либо ей было присвоено).

Избавьтесь от глобальной переменной encout - это бесполезно и переместите линию encout = '' в начало encrypt. Затем добавьте return encout в самом конце encrypt (после окончания цикла for). Измените окончание своей программы так, чтобы она читала:

print(encrypt(encin)) 
+0

Спасибо за ваши ответы, я буду использовать это, поскольку я предпочитаю не использовать «глобальный encout». – user2975192

2

Я думаю, что вы пытаетесь сделать, это:

e1 = ord(c) 

Вы перебор персонажей струны еще применяя ord для всей строки (s) не индивидуального характера c. Это причина исключения.

UPDATE: О encout вопроса, вам нужно объявить переменную в верхней части метода для того, чтобы получить доступ к нему до того, как это:

def encrypt(s): 
    encout = '' 
    # remaining of the method 
+0

Спасибо, это было глупо от меня. Теперь я показываю ошибку 'UnboundLocalError: локальная переменная 'encout', на которую ссылаются перед присваиванием – user2975192

+0

Вы определяете переменную' encout' вне метода и переопределяете ее внутри. Это означает проблемы с переменным объемом. Лучше сделайте 'encrypt'' return encout' и назначьте его своей глобальной переменной 'encout'. Кроме того, можете ли вы обновить вопрос с помощью новой информации? –

Смежные вопросы