我有这个基本的密码功能:
def encrypt_decrypt(data, in_or_out):
pass_lst = list(data)
return_list = []
if in_or_out == "in":
for i in pass_lst:
num = ord(i) + 10
return_list.append(chr(num))
else:
for i in pass_lst:
num = ord(i) - 10
return_list.append(chr(num))
return ''.join(return_list)
我想让这个密码更具可读性和一点DRY
呃..有没有办法可以成功缩短这个功能?
答案 0 :(得分:1)
您可以通过从in_or_out
参数计算±10来使其干燥。例如,
def encrypt_decrypt(data, in_or_out):
delta = {'in': 10, 'out': -10}[in_or_out]
return_list = []
for i in list(data):
num = ord(i) + delta
return_list.append(chr(num))
return ''.join(return_list)
使用列表理解可以使其更加紧凑:
def encrypt_decrypt(data, in_or_out):
delta = {'in': 10, 'out': -10}[in_or_out]
return ''.join([chr(ord(i) + delta) for i in data])
请注意,我正在直接迭代data
。如果data
是字符串,列表或元组,那将会有效。
但是,您应该知道您的代码不安全:它不处理ord(i) + delta
超出0-255范围的字符代码。
答案 1 :(得分:1)
作为一般规则,函数应该一个事物;将两个函数合并为一个,然后使用一个参数来触发实际运行的“嵌入”函数,这是一个反模式。你仍然可以抽象出公共代码(这里,遵循PM 2Ring的定义):
def encrypt(data):
return _modify(data, 10)
def decrypt(data):
return _modify(data, -10)
def _modify(data, delta):
return ''.join([chr(ord(i) + delta) for i in data])
一般来说,你的这对函数不会是这种对称的,并且就一个明确的函数而言,实现它们并不容易。在这种情况下,您肯定不希望将两个实现都填充到一个encrypt_or_decrypt
函数中。
(即使你做组合它们,也不要使用两组不同的术语。选择“加密”/“解密”或“进入”/“出”之一并坚持下去用于函数名称和传递给参数的值。)
如果您确实需要根据参数值选择加密和解密,请将两个函数存储在字典中:
d = {"encrypt": encrypt, "decrypt": decrypt}
d[in_or_out](value)