减少Python中函数的参数数量?

luk*_*uky 5 python arguments function

我的问题是如何处理我使用凯撒密码的代码片段.

函数Decrypt和Encrypt必须处理字母表的限制(A - Z和a - z).我试图在一个名为cycleencrypt的循环函数中为两个字母编写两个可能的循环.

但是该函数需要大约6个参数,而且我已经阅读了一个在一个函数中具有3个以上参数的可读性和可理解性较低的地方,所以我的问题是:

我应该通过拆分两个函数来减少参数的数量,并使代码片段更长(但可能更容易理解)?谢谢你的回答,我很感激.

编辑:删除了函数周围的文档,以使我的问题的主要目的可见.

def offsetctrl(offset):
    while offset < 0:
        offset += 26
    return offset

def cycleencrypt(string, offset, index, listing, first, last):
    offset = offsetctrl(offset)
    if string >= ord(first) and string <= ord(last):
        string += offset
        while string > ord(last):
            string = ord(first) + (string - ord(last) -1)
        listing[index] = chr(string)         
Run Code Online (Sandbox Code Playgroud)

循环加密有大量参数和负偏移控制

def encrypt(retezec, offset):
    listing = list(retezec)
    for index in range(0, len(retezec)):
        string = ord(retezec[index])
        cycleencrypt(string, offset, index, listing, 'A', 'Z')
        cycleencrypt(string, offset, index, listing, 'a', 'z')
    print(''.join(listing))
Run Code Online (Sandbox Code Playgroud)

主加密部分采用两行打印 多个参数

def decrypt(retezec, offset):
    return encrypt(retezec, -offset)

if __name__ == "__main__":
encrypt("hey fellow how is it going", 5)
decrypt("mjd kjqqtb mtb nx ny ltnsl", 5)
Run Code Online (Sandbox Code Playgroud)

Dan*_*den 7

在这种情况下,将代码编写为通常会更好.您的类的构造函数可以只使用所需的最少数量的参数(可能根本不需要!),然后可以将可选参数设置为类的属性或使用其他方法.

在设计这样的类时,我发现最先写入客户端代码是最有用的- 也就是说,编写将首先使用该类的代码,然后从那里开始设计该类.

例如,我可能希望代码看起来像这样:

cypher = Cypher()
cypher.offset = 17
cypher.set_alphabet('A', 'Z')
result = cypher.encrypt('hey fellow how is it going')
Run Code Online (Sandbox Code Playgroud)

希望应该清楚如何从这里开始工作到Cypher类的设计,但如果没有,请在Stack Overflow上提出一个问题!

如果您想提供encryptdecrypt方便的方法,它仍然很容易做到.例如,您可以编写如下函数:

def encrypt(text, offset):
    cypher = Cypher()
    cypher.offset = offset
    return cypher.encrypt(text)
Run Code Online (Sandbox Code Playgroud)

  • 我将在这里离开[this](/sf/ask/145528491/)。 (2认同)