可爱的 Python: Python 之优雅与瑕疵,第 1 部分
2008-09-30 12:57:47 来源:WEB开发网更糟糕的是,复数现在不能与大多数 数字值进行比较,但是可以通过大多数非数字值判断出绝对的不等性。例如,考虑到理论纯洁性,我知道 1+1j 与 2-3j 的比较是没有意义的,但是为什么有下面这样的结果:
清单 2. 令人吃惊的比较结果
>>> 2-3j < 'spam'
True
>>> 4+0j < decimal.Decimal('3.14')
True
>>> 4+0j < 5+0j
TypeError: no ordering relation is defined for complex numbers
从理论上来讲,这全无 “纯” 可言。
一个真正的瑕疵:对异构集合进行排序
自变量有时候会造成编程错误,试图对不可比较的类型进行比较。但是 Python 可以顺利地执行许多这种类型的比较;并且依照 “duck typing” 哲学来完成这样的任务(duck typing 是指 “如果看起来像鸭子,听起来像鸭子,就可以把它当作鸭子”,也就是说,不管对象是 什么,只在乎它做 什么。)Python 集合常常将不同类型的对象组织在一起,希望能够做 与其中的各对象相似的事情。一种常见的用例是对一组不同类型的值进行编码,以便通过某种协议进行传输。
对于这其中的大多数值,不等比较是不必要的。但是,在一种常见的情况下,不等性是非常有用的;那就是对集合进行排序 时,通常是对列表或与列表类似的定制集合进行排序。有时候,需要以一种有意义的升序来处理集合(例如,按照数据值从小到大的次序)。在其他时候,需要为多个集合创建一种固定的次序,尤其是为了对两个集合执行某种类似于 “list diff” 的处理时。也就是说,如果一个对象在这两个集合中都存在,那么就执行一种操作;如果它只在一个集合中存在,就执行另一种操作。不断地检查 if x in otherlist 会导致效率成 big-O 式几何级数递减;在两个固定排序的列表之间进行平行匹配的效率要高得多。例如:
更多精彩
赞助商链接