我正在尝试使用函数在python中创建一个简单的加密程序但我遇到了一个问题,当我运行程序说(' msgReversed'未定义)时,我收到错误消息。
程序的工作原理是首先反转用户消息,然后将字母移动到Key的值
alphabet=("abcdefghijklmnopqrstuvwxyz ")
def userInput():
plaintext=input("Enter message to encript")
k=int(input("Enter encription Key you want to use (1-25)"))
return (k,plaintext)
def reverseMsg(plaintext):
msgReversed=''
leng=len(plaintext)-1
for c in plaintext:
msgReversed+=plaintext[leng]
leng=leng-1
print(msgReversed)
return(msgReversed)
def encript(msgReversed,k):
cipher=''
for c in msgReversed:
if c in alphabet:
cipher+=alphabet[(alphabet.index(c)+k)%(len(alphabet))]
print(cipher)
(k,plaintext)=userInput()
reverseMsg(plaintext)
(cipher)=encript(msgReversed,k)
错误消息如下所示:
Line 26, in <module>
(cipher)=encript(msgReversed,k)
NameError: name 'msgReversed' is not defined
答案 0 :(得分:0)
在最后一行中,您传递了一个名为&#39; msgReversed&#39;的变量。进入你的'encript&#39;功能。但是:msgReversed仅在您的&#39; reverseMsg&#39;中本地定义。功能。 变量可以是仅存在于函数内部的局部变量。或全局变量,它们存在于整个脚本中。一个简单的解决方法是通过简单地添加&#39; global&#39;来使你的msgReversed成为一个全局变量。在你的反向行动的第一行前面功能。第一行到最后一行的另一个解决方案: msgReversed = reverseMsg(明文)
关于此问题的简化教程:http://www.python-course.eu/global_vs_local_variables.php
添加了一个简单的例子:
myname = "Marc"
def printName():
myname = "Sonder"
print (myname)
printName()
print (myname)
在功能之外,&#39; myname&#39;功能将产生&#34; Marc&#34;。但是在函数内部,myname将产生&#34; Sonder&#34;。如果您要删除第一行,并尝试执行最后一行,要打印全局版本的&#39; myname&#39;,您将得到与您现在完全相同的错误。
要掌握这一点,我会复制这个脚本,看看你在评论某些部分时会发生什么变化。
答案 1 :(得分:0)
改变你的最后几行:
reverseMsg(plaintext)
(cipher)=encript(msgReversed,k)
对此:
(cipher)=encript(reverseMsg(plaintext),k)
答案 2 :(得分:0)
当您从msgReversed
函数返回reverseMsg()
变量时,需要将其分配给外部作用域中的新变量。
msgReversed = reverseMsg(plaintext)
(cipher)=encript(msgReversed,k)
我怀疑出现以下这一行引起的混淆:
return msgReversed # Note, the brackets aren't required here
在传递变量reverseMsg()
时从函数msgReversed
返回。但是,默认情况下,此变量不会分配到任何位置 - 名称msgReversed
特定于函数。要存储从函数返回的值,您需要提供一个变量名来存储它。因此,以下内容:
msgReversed = reverseMsg(plaintext)
...会将函数返回的值存储在名为msgReversed
的 new 变量中。您还可以将该变量命名为其他内容:
this_is_another_msgReversed = reverseMsg(plaintext)
如果你没有提供一个变量来赋值,那么它就会丢失:
reverseMsg(plaintext)
# No msgReversed variable here
答案 3 :(得分:0)
正如我的评论中所提到的,你的变量msgReversed并没有在你的函数之外声明,所以当你在它之外调用它时它没有被定义。为了避免发布重复的答案,这是另一种方法:
我不知道您之前是否曾使用过类,但这里有一个示例和pythons官方文档(https://docs.python.org/2/tutorial/classes.html)
class Encrypt:
def __init__(self):
(k,plaintext)=self.userInput()
self.reverseMsg(plaintext)
cipher =self.encript(self.msgReversed,k)
def userInput(self):
plaintext=input("Enter message to encript")
k=int(input("Enter encription Key you want to use (1-25)"))
return (k,plaintext)
def reverseMsg(self, plaintext):
self.msgReversed=''
leng=len(plaintext)-1
for c in plaintext:
self.msgReversed+=plaintext[leng]
leng=leng-1
print(self.msgReversed)
return(self.msgReversed)
def encript(slf, msgReversed, k):
alphabet=("abcdefghijklmnopqrstuvwxyz ")
cipher=''
for c in msgReversed:
if c in alphabet:
cipher += alphabet[(alphabet.index(c)+k)%(len(alphabet))]
print(cipher)
Encrypt()
对于全局变量,您可以在函数中声明全局变量。您所要做的就是将其声明为全局:
variable_name global
所以你的变量msgReversed的函数如下:
def reverseMsg(plaintext):
global msgReversed
msgReversed = ''
leng=len(plaintext)-1
for c in plaintext:
msgReversed+=plaintext[leng]
leng=leng-1
print(msgReversed)
return(msgReversed)