2013-03-20 53 views
7

我注意到,虽然“最大”功能上无类型做好:的Python分钟的无类型/最大

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

“分钟”功能不返回任何内容:

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

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

回答

7

由于jamylak写,None根本就没有被Python炮弹打印。

这是方便,因为所有函数返回的东西:没有指定值时,他们返回None

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

这就是为什么Python的弹不打印返回无值。但是,print None是不同的,因为它明确要求Python打印None值。


至于比较,None认为是负无穷。

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

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

Python 3中引发一个例外,对于像1 > None非有意义的比较,并通过max(1, None)所做的比较。


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

+0

那么,为什么max(None,1)返回1呢?它是任意的? – mclafee 2013-03-20 12:47:01

+1

请注意,此规则仅适用于Python 2.在Python 3中,它是固定的,并且您会得到一个有意义的错误消息'unorderable types:int() jamylak 2013-03-20 12:57:38

+1

@mclafee:'max(None,1)'确实没有定义。我引用的CPython 2的“按类型命名的顺序”规则似乎不适用于整数和None之间的比较,因为“None”的类型是'NoneType',后面是'int' '。也许第二条规则适用,尽管(在一个测试中,我做了'id(1)> id(None)'为'True')。 – EOL 2013-03-20 12:59:55

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'比其他任何东西都小。例如,以相同的方式定义的任何其他类在放置在比较的左侧时会生成较小的对象。原因是比较中* first *对象的'__cmp __()'被首先调用(所以'__cmp __()'可能不会被调用)。 – EOL 2013-03-20 14:20:40

+0

大跳蚤的背上有小跳蚤咬他们, 而小跳蚤只有较小的跳蚤,因此无穷无尽。 – PaulMcG 2013-03-20 14:31:14