我之前仍然在使用相同的加密程序而且我目前卡住了。
choice = ""
def program (str,my_fn):
global i
i=0
while i<len(str):
my_fn
i += 1
def encrypt(my_result):
message.append(ord(answer[i]))
while choice != "Exit":
choice = input("Do you want to Encrypt, Decrypt, or Exit?\n")
if choice == "Encrypt":
answer = input("What would you like to encrypt:\n")
message = []
program(answer,encrypt(message))
print (answer)
print (message)
因此,程序的第一部分只是询问用户是否希望加密,解密或退出程序,这部分工作正常。但是,我的问题在于功能。函数“program”旨在用作字符串中每个字母的内部函数的转发器。但是,当我尝试运行程序时,它继续告诉我“i”没有为“加密”功能定义,什么都不做。我确信我将“i”设置为全局变量,为什么这不起作用。如果你想知道为什么我选择制作两个函数,那是因为我以后必须多次使用函数“program”,对于这个特定的赋值,我需要使用函数和抽象。谢谢!
答案 0 :(得分:1)
在第一行后添加一行
choice = ""
i = 0
关键字global
表示您声明对全局名称的访问权限。
此外,使用全局变量几乎不是一个好主意。您可能想要找到另一种设计函数的方法。
答案 1 :(得分:0)
program(answer,encrypt(message))
行没有按照您的意愿行事。它不是将函数encrypt
及其参数message
传递给program
(稍后可以调用它),而是立即调用该函数。 将将返回值传递给program
,但由于encrypt(message)
在没有定义i
的情况下无效,因此您会收到异常。
有几种方法可以解决这个问题。到目前为止,最好的方法是不在函数中使用全局变量,而是始终将您关心的对象作为参数传递或返回值。
例如,您可以将一个加密单个字母的函数传递给另一个函数,该函数将第一个函数重复应用于字符串(这与内置map
函数非常相似):
def my_map(function, string):
result = []
for character in string:
result.append(function(character))
return result
def my_encryption_func(character):
return ord(character)
如果确实想要坚持使用当前的架构,可以使用functools.partial
将answer
参数绑定到encrypt
函数,使其工作正常,然后在program
中调用部分对象:
from functools import partial
def program (str,my_fn):
global i
i=0
while i<len(str):
my_fn() # call the passed "function"
i += 1
def encrypt(my_result):
message.append(ord(answer[i]))
choice = ""
while choice != "Exit":
choice = input("Do you want to Encrypt, Decrypt, or Exit?\n")
if choice == "Encrypt":
answer = input("What would you like to encrypt:\n")
message = []
program(answer, partial(encrypt, message)) # pass a partial object here!
print (answer)
print (message)