Python:缩短难看的代码?

时间:2010-09-06 22:54:40

标签: python coding-style

我现在的一个程序中有一个荒谬的代码段:

str(len(str(len(var_text)**255)))

有没有简单的方法来缩短它? “坦率地说,这是荒谬的。”

将数字> 500位数转换为科学计数法的选项也会有所帮助 (这就是我想要做的)

完整代码:

print("Useless code rating:" , str(len(var_text)**255)[1] + "e" + str(len(str(len(var_text)**255))))

4 个答案:

答案 0 :(得分:6)

TL; DR y = 2.408 * len(var_text)

让我们假设您的密钥是一个包含256个字符的字符串(0-255)。然后就像16位数字保持65536个数字(2 ** 16)一样,相等长度的字符串的排列将是

n_perms = 256**len(passkey)

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

>>> from math import log10
>>> log10(1000)
3.0
>>> log10(9999)
3.9999565683801923
>>> 

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

n_perms = 256**len(var_text)
length = int(log10(n_perms)) + 1

我认为“缩短”难看的代码并不总是最好的方式 - 你希望它能清楚你正在做什么。

编辑:进一步考虑后,我意识到选择base-10来查找排列长度实际上是任意的 - 所以为什么不选择base-256!

length = log256(256**len(var_text)
length = len(var_text) # the log and exp cancel!

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

编辑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

那么,简而言之:

length = log10(256) * len(var_text)     # or about (2.408 * x)

答案 1 :(得分:0)

这看起来像是在字符串长度的第255次幂中生成数字位数的字符串版本。是对的吗?我很好奇这是用来做什么的。

你可以用不同的方式计算数字,但它并不短,我不确定它更漂亮:

str(int(math.ceil(math.log10(len(var_text))*255)))

或:

"%d" % math.ceil(math.log10(len(v))*255)

答案 2 :(得分:0)

您是否尝试确定与var_text长度相同的可能字符串数?如果是这样,你的基数和指数就会反转。您想使用255**len(var_text)代替len(var_text)**255

但是,我不得不问......这些密码有多长,你用它们做什么?

而且,为什么不使用密码的长度作为其长度的指标?

答案 3 :(得分:0)

首先,如果您的主要问题是操纵巨大的浮点表达式,请使用bigfloat package

>>> import bigfloat
>>> bigfloat.BigFloat('1e1000')
BigFloat.exact('1.0000000000000001e+1000', precision=53)

至于您问题中的详细信息:len(str(num))大约等于log(num, 10) + 1。这并没有明显缩短,但它肯定是一种在代码中表达它的更好方式(为了任何不知道这一点的人的利益)。然后,您可以使用日志法来简化它:

  len(str(x**y))
= log(x**y, 10) + 1
= y * log(x, 10) + 1

所以也许你会发现:

"%i" % (log(len(var_text),10)*255 + 1)

......更好?它并没有明显缩短,但输入和输出之间的数学关系更清晰。