Python初学者编程

时间:2017-03-11 03:28:38

标签: python encryption

我之前仍然在使用相同的加密程序而且我目前卡住了。

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”,对于这个特定的赋值,我需要使用函数和抽象。谢谢!

2 个答案:

答案 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.partialanswer参数绑定到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)