Python: 如何简化冗长代码?

3 投票
4 回答
704 浏览
提问于 2025-04-16 03:47

我现在在我的一个程序里有一段非常冗长的代码:

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

你是在想要计算和 var_text 一样长的字符串有多少种可能吗?如果是这样的话,你的基础和指数搞反了。你应该用 255**len(var_text),而不是 len(var_text)**255

不过,我得问一下……这些密码的长度到底有多长,你是用它们来做什么的呢?

还有,为什么不直接用密码的长度来表示它的长度呢?

0

这段话的意思是,它看起来是在计算一个字符串长度的255次方的数字有多少位,也就是把这个数字变成字符串的形式。这样理解对吗?我很好奇这个计算有什么用。

你可以用不同的方法来计算这个数字,但这样做并不会更简短,我也不确定这样做是否更好看:

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

或者:

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

总结: 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

我认为“简化”丑陋的代码并不总是最好的方法——你希望代码清晰明了。

编辑: 经过进一步考虑,我意识到选择10作为基数来计算排列组合的长度其实是随意的——那为什么不选择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)

撰写回答