2013-03-20 9 views
7

Zauważyłem, że podczas gdy funkcja 'max' zrobić dobrze na Brak Typ:Python min/max na Brak Typ

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

Może:

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

funkcja 'min' nie zwraca niczego to dlatego, że nie ma definicji min (None, 1)? Dlaczego w maksymalnym przypadku zwracana jest liczba? Czy nic nie jest traktowane jak "-infinity"?

Odpowiedz

7

Jak jamylak napisał None nie jest po prostu wydrukowane przez muszli Pythona.

Jest to wygodne, ponieważ wszystkie funkcje coś powrotu: gdy wartość nie jest określona, ​​wracają None:

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

To dlatego pociski Python nie wydrukować powrócił Brak wartości. print None jest inny, ponieważ wyraźnie prosi Pythona o wydrukowanie wartości None.


Co do porównań, None jest nie uważane za nieskończoność.

W przypadku Pythona 2 obiekt general rule oznacza, że ​​obiekty, których nie można porównywać w żaden znaczący sposób, nie podnoszą wyjątku w porównaniu, ale zwracają pewien arbitralny wynik. W przypadku CPython arbitralna reguła jest następująca:

Obiekty różnych typów z wyjątkiem liczb są uporządkowane według ich typów: nazw; obiekty tego samego typu, które nie obsługują właściwego porównania, są uporządkowane według ich adresu.

Python 3 podnosi wyjątek, dla non-sensownych porównań jak 1 > None i porównania wykonanej przez max(1, None).


Jeśli potrzebujesz - infinity, Python oferuje float('-inf').

+0

Dlaczego więc max (None, 1) return 1? to jest arbitralne? – mclafee

+1

Zauważ, że ta reguła dotyczy tylko Pythona 2. W Pythonie 3 jest ona naprawiona i otrzymujesz znaczący komunikat o błędzie 'unorderable types: int() jamylak

+1

@mclafee: 'max (None, 1)' jest nieokreślone. Wydaje się, że reguła "order według typu" dla CPython 2, którą zacytowałem, nie ma zastosowania do porównania między liczbą całkowitą a 'None', ponieważ' None' jest typu ''NoneType'', który pojawia się po'' int ' '. Może ta druga zasada ma zastosowanie, chociaż (w teście zrobiłem "id (1)> id (None)' było 'True'). – EOL

7

robi coś zwrócić, powłoka Pythona prostu nie drukuje None

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

Jeśli naprawdę chcesz wartość, która zawsze będzie porównać mniej niż każdy inny, trzeba utworzyć małą klasę:

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

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

Ta klasa będzie porównać z wartościami innego rodzaju:

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 

Wydruki:

-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 

mały jest jeszcze mniej niż on sam!

print tiny < tiny 
True 
+0

Nie jest prawdą, że wartość 'ValueLessThanAllOtherValues' jest mniejsza niż cokolwiek innego. Na przykład każda inna klasa zdefiniowana w ten sam sposób daje obiekty, które są mniejsze, po umieszczeniu po lewej stronie porównania. Powodem jest to, że '__cmp __()' z * pierwszego * obiektu w porównaniu jest wywoływane jako pierwsze (więc twoje '__cmp __()' może nie zostać wywołane). – EOL

+0

Wielkie pchły mają małe pchły na plecach, aby je ugryźć, A małe pchły mają mniejsze pchły, a więc ad infinitum. – PaulMcG

Powiązane problemy