Python:缩短难看的代码?

Vio*_*let 3 python coding-style

我在我的节目一个可笑的代码段现在:

str(len(str(len(var_text)**255)))
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来缩短它?因为,坦率地说,这太荒谬了.

转换一个数> 500位到科学记数法一个选项也将是有益的(这就是我想要做的)

完整代码:

print("Useless code rating:" , str(len(var_text)**255)[1] + "e" + str(len(str(len(var_text)**255))))
Run Code Online (Sandbox Code Playgroud)

Pet*_*son 6

TL; DR:y = 2.408 * len(var_text)

让我们假设您的密钥是一个字符串,有256个字符可用(0-255).然后正如16位数字保持65536个数字(2**16)一样,相等长度的字符串的排列将是

n_perms = 256**len(passkey)
Run Code Online (Sandbox Code Playgroud)

如果你想要n_perms中的(十进制)数字,请考虑对数:

>>> from math import log10
>>> log10(1000)
3.0
>>> log10(9999)
3.9999565683801923
>>> 
Run Code Online (Sandbox Code Playgroud)

所以我们有length = floor(log10(n_perms)) + 1.在python中,int无论如何都会向下舍入,所以我想说你想要的

n_perms = 256**len(var_text)
length = int(log10(n_perms)) + 1
Run Code Online (Sandbox Code Playgroud)

我认为"缩短"丑陋的代码并不总是最好的方式 - 你希望它能清楚你正在做什么.

编辑:进一步考虑我意识到选择base-10来找到你的排列的长度无论如何都是任意的 - 所以为什么不选择base-256!

length = log256(256**len(var_text)
length = len(var_text) # the log and exp cancel!
Run Code Online (Sandbox Code Playgroud)

你实际上只是在不同的基础上找到密码的长度......

编辑2:退后一步,我要尝试数学!

if x = len(var_text), we want y such that
y = log10(256**x)
10**y = 256**x
10**y = (10**log10(256))**x
10**y = (10**(log10(256)x))
y = log10(256) * x
Run Code Online (Sandbox Code Playgroud)

那么,这是怎么回事:

length = log10(256) * len(var_text)     # or about (2.408 * x)
Run Code Online (Sandbox Code Playgroud)