2013-03-20 5 views
7

я заметил, что в то время как 'Макс' функция хорошо по типу Нет:Python мин/макс на None типа

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

Может быть:

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

функция 'мин' ничего не вернуть это потому, что нет определения для min (None, 1)? Итак, почему в макс. Случае он возвращает номер? Не рассматривается ли «как-нить»?

ответ

7

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

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

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

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


Что касается сравнений, None является не считается -infinity.

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

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

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


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

+0

Итак, почему max (None, 1) return 1? это произвольно? – mclafee

+1

Обратите внимание, что это правило применимо только к Python 2. В Python 3 он исправлен, и вы получаете осмысленное сообщение об ошибке 'unorderable types: int() jamylak

+1

@mclafee: 'max (None, 1)' действительно не определено. Правило «порядок по типу» для CPython 2, которое я цитировал, похоже, не применяется к сравнению между целым и «Нет», потому что «Нет» имеет тип «NoneType», который появляется после '' int ' '. Возможно, второе правило применимо, хотя (в тесте I id (1)> id (None) 'был' True'). – EOL

7

Это что-то вернуть, питон оболочка просто не печатает None

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

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

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 
+0

Не совсем верно, что ваш 'ValueLessThanAllOtherValues' меньше, чем что-либо еще. Например, любой другой класс, определенный таким же образом, дает меньшие объекты, если положить их в левую сторону сравнения. Причина в том, что сначала сначала вызывается '__cmp __()' объекта * first * в сравнении, поэтому ваш '__cmp __()' не может быть вызван). – EOL

+0

У больших блох есть немного блох на спине, чтобы их укусить, И у маленьких блох есть меньше блох, и так до бесконечности. – PaulMcG

Смежные вопросы