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