字符串类型和数字类型怎么比较大小?

收藏
比较运算
37
Feb 1, 2018
#!/usr/bin/env python
age = raw_input("age: ")
if age > 18:
   print "can to netbar"
else :
   print "no to wang ba"

Python2.7 中,raw_input 的默认返回值类型是 str, 和 int 型做比较,比较结果是什么?

回答

Bravian回答

在Python2中,比较运算遵循以下规则:

1. 数字和数字按大小排序 (数字类型包括 int, float, long, complex, bool)

2. 字符串和字符串按字典序排序(str, 按 unicode 编码比较每个字符的大小)

3. 数字类型和非数字类型比较,除None外,数字类型总是小于非数字类型。

4. 两个非数字不同类型,按其类型名的字典序排序

5. 第4点有一个特例,老式类的实例总是小于新式类

6. 非数字/字符串类型的同一类型的不同实例的比较,如果类定义了__cmp__()方法,则用该方法比较

7. 同上,若类型没定义__cmp__()方法, 则按实例在内存中的地址排序

8. None < None

9. 3,4,5,7 是CPython的实现,不是Python语言自身的标准,参见CPython implementation detail。Python语言规范只要求对非数字、非字符串类型的不同类型对象的比较,总是不相等的,比较结果可以是任意的,但必须是一致的(即多次比较,结果恒定)。

在实际工程中,一般不会对不同类型的对象进行比较,因为没有实际意义。

Python3对这个特性进行了改进 ( What’s New In Python 3.0 ), 规则如下:

1. incomparable类型对象比较 <, <=, >=, > 会 raise TypeError 异常,比如1 < '', 0 > None ,len <= len 都不再有意义,但是 None < None 会返回 Fasle

2. incomparable类型对象比较 !=, == 仍是合法的,不同类型的对象比较,总为False

3. cmp()和__cmp__()方法被弃置了,取而代之的是__lt__(),__eq__(),__hash__() ...

Python2  当初会设计这种比较规则,可能是为了便于对包含不同类型对象的容器排序。list.sort()和sorted()都仿照了C/C++里的sort。Python2.4后sort使用key来比较不同对象就更Pythonic。

(1)

提交成功