流畅的 Python(8):Python 数据模型 1.4

阅读数:14 2019 年 11 月 20 日 16:50

流畅的Python(8):Python 数据模型 1.4

内容简介
本书致力于帮助 Python 开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道 Python 风格的代码。本书尤其深入探讨了 Python 语言的高级用法,涵盖数据结构、Python 风格的对象、并行与并发,以及元编程等不同的方面。

(为什么len不是普通方法)

我在 2013 年问核心开发者 Raymond Hettinger 这个问题时,他用“ Python 之禅”里的原话回答了我:“实用胜于纯粹。”在 1.2 节里我提到过,如果 x 是一个内置类型的实例,那么 len(x) 的速度会非常快。背后的原因是 CPython 会直接从一个 C 结构体里读取对象的长度,完全不会调用任何方法。获取一个集合中元素的数量是一个很常见的操作,在 strlistmemoryview 等类型上,这个操作必须高效。

换句话说,len 之所以不是一个普通方法,是为了让 Python 自带的数据结构可以走后门,abs 也是同理。但是多亏了它是特殊方法,我们也可以把 len 用于自定义数据类型。这种处理方式在保持内置类型的效率和保证语言的一致性之间找到了一个平衡点,也印证了“Python 之禅”中的另外一句话:“不能让特例特殊到开始破坏既定规则。”

如果把 abslen 都看作一元运算符的话,你也许更能接受它们——虽然看起来像面向对象语言中的函数,但实际上又不是函数。有一门叫作 ABC 的语言是 Python 的直系祖先,它内置了一个 # 运算符,当你写出 #s 的时候,它的作用跟 len 一样。如果写成 x#s 这样的中缀运算符的话,那么它的作用是计算 sx 出现的次数。在 Python 里对应的写法是 s.count(x)。注意这里的 s 是一个序列类型。

流畅的Python(8):Python 数据模型 1.4

图灵地址 https://www.ituring.com.cn/book/1564

评论

发布