V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
V2EX  ›  Python

关于 Python 的 len 函数

  •  
  •   piaochen · Apr 25, 2019 · 4787 views
    This topic created in 2563 days ago, the information mentioned may be changed or developed.
    一直不理解 Python 中为嘛有 len 这种函数存在
    例如要获取字符串的长度
    要使用:
    len('ABC')
    实际上是调用的
    'ABC'.__ len __()
    为嘛不直接像其他语言那样设计成调用'ABC'.len()???
    请指教。
    27 replies    2019-04-27 14:26:59 +08:00
    lithiumii
        1
    lithiumii  
       Apr 25, 2019   ❤️ 2
    前两天刚有人水了一贴
    https://www.v2ex.com/t/557286
    shintendo
        2
    shintendo  
       Apr 25, 2019   ❤️ 2
    因为对世界本质的洞察
    mimzy
        3
    mimzy  
       Apr 25, 2019
    1. 一种选择而已,避免你拿到一个对象去猜它到底是 .len() .length() 还是 .size()
    2. 在 CPython 中 len() 对于内置类型会读取 ob_size 字段而不是调用 __len__ 方法,更快

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

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

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

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

    当然,这一设计是否比后缀形式更好就是另一个话题了。我个人认为后缀 /管道一类的设计减少了括号嵌套,语序符合实际执行顺序,有利于可读性;但是,你不能指着一门 1991 年发布的语言,问他的调用规范为什么没有学 1995 年的 Java 和,1995 年的 Ruby 和 1998 年的 C++。
    mizuku
        27
    mizuku  
       Apr 27, 2019
    这是 Python 哲学的一部分.不然就到处都是 getLength,setLength 了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   814 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 20:24 · PVG 04:24 · LAX 13:24 · JFK 16:24
    ♥ Do have faith in what you're doing.