关于 Python 的 len 函数 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
piaochen

关于 Python 的 len 函数

  •  
  •   piaochen 2019 年 4 月 25 日 4765 次点击
    这是一个创建于 2554 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一直不理解 Python 中为嘛有 len 这种函数存在
    例如要获取字符串的长度
    要使用:
    len('ABC')
    实际上是调用的
    'ABC'.__ len __()
    为嘛不直接像其他语言那样设计成调用'ABC'.len()???
    请指教。
    27 条回复    2019-04-27 14:26:59 +08:00
    lithiumii
        1
    lithiumii  
       2019 年 4 月 25 日   2
    前两天刚有人水了一贴
    t/557286
    shintendo
        2
    shintendo  
       2019 年 4 月 25 日   2
    因为对世界本质的洞察
    mimzy
        3
    mimzy  
       2019 年 4 月 25 日
    1. 一种选择而已,避免你拿到一个对象去猜它到底是 .len() .length() 是 .size()
    2. 在 CPython 中 len() 对于内置类型会读取 ob_size 字段而不是调用 __len__ 方法,更快

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

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

    只要支持取长度的, 开发人员默认加一个__len__, 调用的人比较方便, 不需要查到底是什么方法
    lihongjie0209
        12
    lihongjie0209  
       2019 年 4 月 25 日
    @wwqgtxx 你觉得在这个问题上用 python 内置的 len ()可以解决?
    lhx2008
        13
    lhx2008  
       2019 年 4 月 25 日
    我有一个想法,就是作者的灵感来自操作符重载,如果把 len 看成一个操作符(内置关键字),或许你就可以理解了。
    iamxiaoq
        14
    iamxiaoq  
       2019 年 4 月 25 日 via Android
    同意楼上,把 len 看作求一个对象长度的运算符,这样只要实现了__len__就相当于重载了这样一个求长度的运算符。不是函数的角度,而是运算符。
    Cbdy
        15
    Cbdy  
       2019 年 4 月 25 日 via Android
    不好的设计,历史遗留问题,没有必要强行解释
    Vegetable
        16
    Vegetable  
       2019 年 4 月 25 日
    没谁逼着用吧?我有的时候不喜欢用 str()也会用.__str__()
    len()/str()/int()这样我觉得挺好的
    1iuh
        17
    1iuh  
       2019 年 4 月 25 日
    就是一个标准,一个共识, 你 len()一个对象,一定会得到它长度。 大家都遵循这个共识,就不用去猜是 a.length、a.len 、还是 a.len(), a.length() 。 至于 IDE 能不能补全,不是设计语言的人会去考虑的东西。
    1iuh
        18
    1iuh  
       2019 年 4 月 25 日
    如果不愿意遵循这个共识,python 也没拦着你去实现 a.length a.len a.len() a.length() 。
    huangzhe8263
        19
    huangzhe8263  
       2019 年 4 月 25 日
    @lihongjie0209 #12 可以啊
    当大家都遵守这个标准的时候,len(a) 能保证能获取得到
    不遵守的话才会去翻文档然后顺便骂一句不 pythonic
    MonoLogueChi
        20
    MonoLogueChi  
       2019 年 4 月 25 日 via Android
    @youngce 给一个返回值是确定的,如果返回值不确定,编译通不过的
    msg7086
        21
    msg7086  
       2019 年 4 月 25 日
    有洁癖可以去用 Ruby ……
    Dvel
        22
    Dvel  
       2019 年 4 月 25 日
    《流畅的 Python 》中文版在 12 页,说的好像有点道理:
    lihongjie0209
        23
    lihongjie0209  
       2019 年 4 月 26 日
    @huangzhe8263 你怎么保证它传给你的对象支持 len ?你又没有静态检查
    chinesehuazhou
        24
    chinesehuazhou  
       2019 年 4 月 26 日 via Android
    @lithiumii 那篇帖是我发的,没想到才几天就有人问。不过,这里的回复,相比起来,友善的、有理性的多些。(目前来看)
    kuangwinnie
        25
    kuangwinnie  
       2019 年 4 月 26 日
    我感觉这个是个特别特别特别好的设计

    并没有必要分清 size(), .length, .length() 这种结构啊。。。
    如果你需要弄清一个有长度的东西,那就直接 len() 非常符合 py 本身的哲学。
    Arnie97
        26
    Arnie97  
       2019 年 4 月 26 日 via Android
    从设计者的角度来看,可以类比做 sizeof 单目运算符,然后为了跟其他运算符的调用规范保持一致。

    当然,这一设计是否比后缀形式更好就是另一个话题了。我个人认为后缀 /管道一类的设计减少了括号嵌套,语序符合实际执行顺序,有利于可读性;但是,你不能指着一门 1991 年发布的语言,问他的调用规范为什么没有学 1995 年的 Java 和,1995 年的 Ruby 和 1998 年的 C++。
    mizuku
        27
    mizuku  
       2019 年 4 月 27 日
    这是 Python 哲学的一部分.不然就到处都是 getLength,setLength 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4976 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 112ms UTC 03:53 PVG 11:53 LAX 20:53 JFK 23:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86