[英]Make basic cipher function more readable
我有这个基本的密码功能:
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
。是否有办法成功缩短此功能?
您可以通过从in_or_out
参数计算±10使其成为in_or_out
。 例如,
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范围内时,它无法处理字符代码。
通常,函数应该做一件事; 将两个函数组合为一个,然后使用一个参数触发哪个“嵌入式”函数实际运行是有点反模式的。 您仍然可以提取通用代码(在这里,按照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
函数中。
(即使您确实合并了它们,也不要使用两组单独的术语。选择“ encrypt” /“ decrypt”或“ in” /“ out”中的一个,并坚持使用它来表示函数名称和要传递的值争论)。
如果确实需要根据参数的值在加密和解密之间进行选择,请将两个函数存储在字典中:
d = {"encrypt": encrypt, "decrypt": decrypt}
d[in_or_out](value)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.