Сделай самый большой номер в питоне

Я ищу объект Python, который гарантированно сравнивать больше, чем любой int, Он должен быть переносимым, независимым от платформы и работать на Python 2.7+ и 3.x.

Например:

x = float('inf')
while True:
    n = next(my_gen)
    if my_calc(n):
        x = min(n, x)
        if my_cond(x):
            break

Здесь я использовал float('inf') для этой цели, потому что, кажется, ведет себя правильно. Но это кажется грязным, потому что я думаю, что это зависит от некоторой базовой спецификации float, и я не знаю, будет ли это зависеть от платформы или сломаться неожиданным образом.

Я знаю, что мог бы создать свой собственный класс и определить операторы сравнения, но я думал, что может быть существующий встроенный способ.

Безопасно ли использовать float('inf') как это? Есть ли менее уродливый способ создания этого "наибольшего целого числа"?

3 ответа

Решение

float('inf') гарантированно будет проверено как большее, чем любое число, включая целые числа. Это не зависит от платформы.

От floatobject.c исходный код:

else if (!Py_IS_FINITE(i)) {
    if (PyInt_Check(w) || PyLong_Check(w))
        /* If i is an infinity, its magnitude exceeds any
         * finite integer, so it doesn't matter which int we
         * compare i with.  If i is a NaN, similarly.
         */
        j = 0.0;

Сами целые числа Python ограничены только памятью, поэтому использование 10 ** 3000 не будет достаточно большим, наверное.

float('inf') всегда доступен; Python будет обрабатывать специфику базовой платформы для вас, чтобы сделать это так.

Почему бы просто не использовать:

x = float('inf')

вместо:

x = 1e3000

Прочтите этот пост для получения дополнительной информации.

В следующем я убираю необходимость в этом первом страже x значение с помощью внешнего цикла while для захвата первого действительного x затем используем его в сохраненном внутреннем цикле while:

while True:
    n = next(my_gen)
    if my_calc(n):
        x = n
        if my_cond(x):
            break
        else:
            while True:
                n = next(my_gen)
                if my_calc(n):
                    x = min(n, x)
                    if my_cond(x):
                        break  
            break

Это больше кода. Обычно удаление дозорных значений является хорошим, но все вышеперечисленное должно оцениваться на предмет ремонтопригодности.

Дальнейшее разложение кода дает следующее, но приведенный выше код сохраняет больше исходных условий.

while True:
    n = next(my_gen)
    if my_calc(n):
        x = n
        if not my_cond(x):
            while True:
                n = next(my_gen)
                if my_calc(n):
                    x = min(n, x)
                    if my_cond(x):
                        break  
        break
Другие вопросы по тегам