Python: 如何简化冗长代码?
我现在在我的一个程序里有一段非常冗长的代码:
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)