关于 Python 的 len 函数

2019-04-25 15:22:16 +08:00
 piaochen
一直不理解 Python 中为嘛有 len 这种函数存在
例如要获取字符串的长度
要使用:
len('ABC')
实际上是调用的
'ABC'.__ len __()
为嘛不直接像其他语言那样设计成调用'ABC'.len()???
请指教。
3782 次点击
所在节点    Python
27 条回复
lithiumii
2019-04-25 15:27:27 +08:00
前两天刚有人水了一贴
https://www.v2ex.com/t/557286
shintendo
2019-04-25 15:31:35 +08:00
因为对世界本质的洞察
mimzy
2019-04-25 15:44:57 +08:00
1. 一种选择而已,避免你拿到一个对象去猜它到底是 .len() .length() 还是 .size()
2. 在 CPython 中 len() 对于内置类型会读取 ob_size 字段而不是调用 __len__ 方法,更快

具体参见 Fluent Python 英文版第 14 页
lihongjie0209
2019-04-25 15:48:12 +08:00
@mimzy
1. 你的 IDE 没有自动补全吗?
2. 更快??只要数据结构内部维护一个 size 字段, 怎么取都一样快吧, 都是访问对象字段而已
shuax
2019-04-25 15:54:40 +08:00
代码可以短一个字节
wwqgtxx
2019-04-25 16:37:39 +08:00
@lihongjie0209 自动补全?你都不知道你一个函数传进来的会是什么类型,怎么自动补全?( type annotation 是 py3 才支持的,而且仅仅是个标记,也不是什么强验证)
karllynn
2019-04-25 16:37:48 +08:00
无所谓吧,go 不也是内置函数
lihongjie0209
2019-04-25 17:26:54 +08:00
@wwqgtxx 你怕是用的假的 IDE 吧
youngce
2019-04-25 17:32:26 +08:00
1. 假如有人给一个对象自定义了一个方法叫 XXX.len()
2. 上面这种情况,你不知道返回的数据类型会是什么,因为任何人都可以定义一个类似的接口,并给你返回一些让你意想不到的返回值。
3. 这样看来 len(XXX)返回一个 int 是不是方便快捷
wwqgtxx
2019-04-25 17:58:27 +08:00
@lihongjie0209 你怕是 java 写多了吧
def func1(a):
然后你告诉我 a 有没有 len()方法?神一般 ide 也猜不出来好吧
iorilu
2019-04-25 20:43:15 +08:00
其实就是定一个标准

所谓的 magic 方法, 我理解就是定一个内部标准

只要支持取长度的, 开发人员默认加一个__len__, 调用的人比较方便, 不需要查到底是什么方法
lihongjie0209
2019-04-25 20:48:32 +08:00
@wwqgtxx 你觉得在这个问题上用 python 内置的 len ()可以解决?
lhx2008
2019-04-25 20:59:53 +08:00
我有一个想法,就是作者的灵感来自操作符重载,如果把 len 看成一个操作符(内置关键字),或许你就可以理解了。
iamxiaoq
2019-04-25 21:06:47 +08:00
同意楼上,把 len 看作求一个对象长度的运算符,这样只要实现了__len__就相当于重载了这样一个求长度的运算符。不是函数的角度,而是运算符。
Cbdy
2019-04-25 21:38:17 +08:00
不好的设计,历史遗留问题,没有必要强行解释
Vegetable
2019-04-25 21:45:25 +08:00
没谁逼着用吧?我有的时候不喜欢用 str()也会用.__str__()
len()/str()/int()这样我觉得挺好的
1iuh
2019-04-25 22:11:51 +08:00
就是一个标准,一个共识, 你 len()一个对象,一定会得到它长度。 大家都遵循这个共识,就不用去猜是 a.length、a.len 、还是 a.len(), a.length() 。 至于 IDE 能不能补全,不是设计语言的人会去考虑的东西。
1iuh
2019-04-25 22:15:49 +08:00
如果不愿意遵循这个共识,python 也没拦着你去实现 a.length a.len a.len() a.length() 。
huangzhe8263
2019-04-25 22:27:49 +08:00
@lihongjie0209 #12 可以啊
当大家都遵守这个标准的时候,len(a) 能保证能获取得到
不遵守的话才会去翻文档然后顺便骂一句不 pythonic
MonoLogueChi
2019-04-25 22:34:50 +08:00
@youngce 给一个返回值是确定的,如果返回值不确定,编译通不过的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558616

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX