无类型上的Python最小值/最大值

无类型上的Python最小值/最大值,python,min,nonetype,Python,Min,Nonetype,我注意到,虽然“max”函数在None类型上表现良好: In [1]: max(None, 1) Out[1]: 1 “min”函数不返回任何内容: In [2]: min(None, 1) In [3]: 可能是因为min没有定义(None,1)? 那么为什么在max的情况下,它会返回数字呢? “无”是否被视为“-infinity”?它确实返回了一些东西,python shell只是不打印None >>> min(None, 1) >>> print

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

In [1]: max(None, 1)
Out[1]: 1
“min”函数不返回任何内容:

In [2]: min(None, 1)
In [3]: 
可能是因为min没有定义(None,1)? 那么为什么在max的情况下,它会返回数字呢?
“无”是否被视为“-infinity”?

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

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

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

这很方便,因为所有函数都会返回某些内容:如果未指定值,则返回
None

>>> def f():
...     print "Hello"
...     
>>> f()
Hello
>>> print f()  # f() returns None!
Hello
None
这就是pythonshell不打印返回的None值的原因<但是,code>print None是不同的,因为它明确要求Python打印
None


至于比较,
None
不被认为是-无穷大

Python2的关键在于,无法以任何有意义的方式进行比较的对象在比较时不会引发异常,而是返回一些任意结果。对于CPython,任意规则如下所示:

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

Python3引发了一个异常,对于无意义的比较,如
1>None
,以及通过
max(1,None)
完成的比较



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

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

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()
tiny=valuelessthanalothervalues.instance
对于v英寸(-100100,0,“xyzy”,无):
印刷品(五)
打印(v>tiny)
打印(微小
印刷品:

-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
-100
真的
真的
-100
-100
100
真的
真的
100
100
0
真的
真的
0
0
xyzzy
真的
真的
xyzzy
xyzzy
没有一个
真的
真的
没有一个
没有一个
tiny甚至比它自己还小

print(tiny < tiny)
True
打印(极小
那么,为什么max(None,1)返回1?这是任意的?请注意,此规则仅适用于Python 2。在Python3中,它是固定的,您会得到一条有意义的错误消息
无序类型:int()
@mclafee他们都返回了一个值,如果您阅读EOLs解释,这非常有用clear@mclafee:
max(无,1)
确实未定义。我引用的CPython 2的“按类型名称排序”规则似乎不适用于整数和
None
之间的比较,因为
None
属于
'NoneType'
类型,它位于
'int'
之后。也许第二条规则确实适用(在一次测试中,我做了
id(1)>id(无)
was
True
)。@EOL:我不确定你在“id(1)>id(无)”中测试了什么?id返回对象id。我试图测试“type(1)>type(None)”,这是错误的…@mclafee:
id()
在CPython()中返回对象的地址,这是在CPython()中比较某些对象的方式。您的
值sthanallothervalues
比任何其他值都小,这并不完全正确。例如,以相同方式定义的任何其他类在放在比较的左侧时都会生成更小的对象。原因是比较中第一个对象的
\uuu-cmp-uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
被首先调用(所以你的
\uuu-cmp-uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,至少对于数字来说是这样。请注意,这在python3中不起作用,在python3中,None和标量之间的关系是未定义的。该代码将引发类型错误。