繁体   English   中英

使基本密码功能更具可读性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM