Python min / max on None类型

时间:2013-03-20 12:27:49

标签: python min nonetype

我注意到虽然'max'函数在None类型上表现良好:

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

'min'函数不会返回任何内容:

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

也许是因为min(None,1)没有定义? 那么为什么在最大的情况下,它返回数字? 没有被视为'-infinity'吗?

3 个答案:

答案 0 :(得分:10)

正如jamylak所写,None根本不是由Python shell打印的。

这很方便,因为所有函数都返回:当没有指定值时,它们返回None

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

这就是Python shell不打印返回的 None值的原因。 print None不同,因为它明确要求Python打印None值。


至于比较,None 被认为是-infinity。

Python 2的general rule是无法以任何有意义的方式进行比较的对象在比较时不会引发异常,而是返回一些任意结果。在CPython的情况下,任意规则如下:

  

除数字外的不同类型的对象按其类型排序   名称;不支持正确比较的相同类型的对象   按地址排序。

Python 3引发了一个异常,用于1 > None之类的无意义比较以及通过max(1, None)进行的比较。


如果确实需要-infinity,Python会提供float('-inf')

答案 1 :(得分:7)

它确实返回了一些内容,python shell只是不打印None

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

答案 2 :(得分:0)

如果你真的想要一个总是要比其他任何一个比较的值,你需要创建一个小类:

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