我的问题是如何处理我使用 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)
答案 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上提出一个关于它的问题!
如果您想提供encrypt
和decrypt
便捷方法,这仍然很容易。例如,您可以编写如下函数:
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):
我们可以从中学到什么:
一边想:你认为图书馆的用户应该使用cycleencrypt()
吗?你可以将它标记为私有(带下划线),这样每个人都会看到它不是公共API,而是应该使用encrypt()
和decrypt()
代替。
答案 2 :(得分:0)
只要没有十几个参数,参数的数量就不重要了(也许有人可以链接到你提到的关于超过3个参数的内容,我可能是错的)。
为了在函数定义中更具可读性,请按照docstrings惯例编写注释。
为了在函数调用时更具可读性,请在定义中尽可能为更有用的值提供默认值(例如,offset默认值为1,索引为0)。
无论哪种方式,对于较长的一行,请使用PEP8指南来描述正确跳线的方法(根据PEP8,行数不得超过80个字符。)
price = client.get_spot_price(currency_pair = 'BTC-USD')