Python: сократить уродливый код? - PullRequest
3 голосов
/ 07 сентября 2010

У меня сейчас есть смешной сегмент кода в одной из моих программ:

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 ]

6 голосов
/ 07 сентября 2010

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. В питоне 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)
0 голосов
/ 07 сентября 2010

Вы пытаетесь определить количество возможных строк, имеющих такую ​​же длину, как var_text?Если это так, ваша база и показатель степени меняются местами.Вы хотите использовать 255**len(var_text) вместо len(var_text)**255.

Но я должен спросить ... как долго эти ключи и как долго вы их используете?

А почему бы просто не использовать длину ключа доступа в качестве индикатора его длины?

0 голосов
/ 07 сентября 2010

Во-первых, если вашей главной проблемой является манипулирование с огромными выражениями с плавающей запятой, используйте пакет bigfloat :

>>> 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)

... лучше?Это не намного короче, но это намного более четкие математические отношения между входом и выходом.

0 голосов
/ 07 сентября 2010

Похоже, что он производит строковую версию числа цифр в 255-й степени длины строки.Это правильно?Мне было бы любопытно, для чего он используется.

Вы можете вычислить число по-другому, но оно не короче, и я не уверен, что оно красивее:

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

или:

"%d" % math.ceil(math.log10(len(v))*255)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...