凯撒密码程序出现UnboundLocalError

时间:2019-03-02 21:59:04

标签: python

目前,我正在为我的计算机科学课开发一个Caesar Cipher程序。但是,在这种情况下,我不知道如何使用用户定义的函数。我一直收到UnboundLocalError

#user defined functions

def encrypt(message, distance):
    """Will take message and rotate it the distance, in order to create an encrypted message"""


    for ch in message:
        ordvalue = ord(ch)
        cipherValue = ordvalue + distance
        if cipherValue > ord("z"):
            cipherValue = ord("a") + distance - (ord("z") - ordvalue + 1)
        encryption += chr(cipherValue)
        return encryption

#input 

message = input("Enter word to be encrypted: ") #original message
distance = int(input("Enter the distance value: ")) #distance letters will be moved

# test
fancy = encrypt(message, distance)

#encryption

print(fancy)

2 个答案:

答案 0 :(得分:0)

您正在访问变量encryption,而未声明它。在for循环之前将其声明为空字符串,以准备为其添加部分字符串。

here网站上的相关讨论中查看更多讨论。

另一方面,函数中的return语句在for循环中缩进,这意味着它将在循环一次迭代后退出该函数,从而使循环毫无意义。这看起来像是一个错误,应该缩进一个级别。

答案 1 :(得分:0)

出现UnboundLocalError的原因是,在编写encryption时,在定义encryption += chr(cipherValue)之前先引用了encryption,因为return从未被首先定义。要解决此问题,您可以在函数开始时将其定义为空字符串。

此外,您需要将def encrypt(message, distance): """Will take message and rotate it the distance, in order to create an encrypted message""" encryption = "" for ch in message: ordvalue = ord(ch) cipherValue = ordvalue + distance if cipherValue > ord("z"): cipherValue = ord("a") + distance - (ord("z") - ordvalue + 1) encryption += chr(cipherValue) return encryption 语句移出一个程序段,以便它在循环之后而不是在循环之后出现。

这是一个例子:

SELECT student_number, subject, exam_date
FROM tables t
WHERE EXISTS (
  SELECT 1 FROM tables
  WHERE 
    student_number = t.student_number
    AND
    exam_date = t.exam_date
    AND
    subject <> t.subject
)