Python min / max на типе None

Я заметил, что, хотя функция " max " хорошо работает ни на одном типе:

In [1]: max(None, 1)
Out[1]: 1

функция "min" ничего не возвращает:

In [2]: min(None, 1)
In [3]: 

может быть, это потому, что нет определения для min(None, 1)? Так почему же в max case он возвращает номер? Это не рассматривается как 'бесконечность'?

3 ответов


как jamylak писал, None просто не печатается оболочками Python.

это удобно, потому что все функции возвращают что-то: если значение не указано, они возвращаются None:

>>> def f():
...     print "Hello"
...     
>>> f()
Hello
>>> print f()  # f() returns None!
Hello
None

вот почему оболочки Python не печатают вернулся значение "None". print None отличается, хотя, поскольку он явно просит Python распечатать None значение.


для сравнения None is не считается -бесконечность.

на общие правила для Python 2 это то, что объекты, которые нельзя сравнить каким-либо значимым образом, не вызывают исключения при сравнении, а вместо этого возвращают некоторый произвольный результат. В случае CPython произвольным правилом является следующее:

объекты разных типов, кроме чисел, упорядочены по их типу имена; объекты тех же типов, которые не поддерживают правильное сравнение являются заказано по их адресу.

Python 3 вызывает исключение для несущественных сравнений, таких как 1 > None и сравнение сделано через max(1, None).


Если вам нужно-бесконечность, Python предлагает float('-inf').


он возвращает что-то, оболочка python просто не печатает None

>>> min(None, 1)
>>> print min(None, 1)
None

если вы действительно хотите значение, которое всегда будет сравнивать меньше, чем любое другое, вам нужно создать небольшой класс:

class ValueLessThanAllOtherValues(object):
    def __cmp__(self, other):
        return -1

# really only need one of these
ValueLessThanAllOtherValues.instance = ValueLessThanAllOtherValues()

этот класс будет сравниваться со значениями любого другого типа:

tiny = ValueLessThanAllOtherValues.instance
for v in (-100,100,0,"xyzzy",None):
    print v
    print v > tiny
    print tiny < v
    # use builtins
    print min(tiny,v)
    print max(tiny,v)
    # does order matter?
    print min(v,tiny)
    print max(v,tiny)
    print

принты:

-100
True
True
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
-100
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
-100

100
True
True
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
100
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
100

0
True
True
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
0
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
0

xyzzy
True
True
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
xyzzy
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
xyzzy

None
True
True
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
None
<__main__.ValueLessThanAllOtherValues object at 0x2247b10>
None

крошечный, даже меньше, чем себе!

print tiny < tiny
True