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

时间:2017-11-03 13:05:04

标签: python function arguments

我的问题是如何处理我使用 Caesar密码的代码。

功能解密和加密必须处理字母(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)         

使用大量参数加密并控制负偏移

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))

主要加密部分在打印

的两行中使用多个参数
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)

3 个答案:

答案 0 :(得分:6)

在这种情况下,将代码编写为通常会更好。您的类的构造函数可以只使用 required 的最小参数(可能根本不是!),然后可以将可选参数设置为类的属性或使用其他方法。 / p>

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

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

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

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

如果您想提供encryptdecrypt便捷方法,这仍然很容易。例如,您可以编写如下函数:

def encrypt(text, offset):
    cypher = Cypher()
    cypher.offset = offset
    return cypher.encrypt(text)

答案 1 :(得分:2)

以下是datetime.datetime的文档字符串:

class datetime(date):
    """datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
    ...
    """

其构造函数的签名:

def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0, microsecond=0, tzinfo=None):

我们可以从中学到什么:

  • 添加与添加
  • 有意义的参数完全相同
  • 使用parameters并为参数
  • 提供合理的默认值

一边想:你认为图书馆的用户应该使用cycleencrypt()吗?你可以将它标记为私有(带下划线),这样每个人都会看到它不是公共API,而是应该使用encrypt()decrypt()代替。

答案 2 :(得分:0)

只要没有十几个参数,参数的数量就不重要了(也许有人可以链接到你提到的关于超过3个参数的内容,我可能是错的)。

为了在函数定义中更具可读性,请按照docstrings惯例编写注释。

为了在函数调用时更具可读性,请在定义中尽可能为更有用的值提供默认值(例如,offset默认值为1,索引为0)。

无论哪种方式,对于较长的一行,请使用PEP8指南来描述正确跳线的方法(根据PEP8,行数不得超过80个字符。)

price = client.get_spot_price(currency_pair = 'BTC-USD')