Day03-简便_or_缺陷?Python_内置函数大揭秘!.pdfVIP

Day03-简便_or_缺陷?Python_内置函数大揭秘!.pdf

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
简便 or 缺陷?Python 内置函数⼤揭秘! 简便 or 缺陷 ?Python 内置函数大揭秘 ! 内置函数是 Python 的一大特色,用极简的语法实现很多常用的操作。 它们预先定义在 内置命名空间中 ,开箱即用、所见即所得。Python 被公认是一种新手 友好型的语言,这种说法能够成立,内置函数在其中起到了极关键的作用。 举个例子 ,求字符串 x 的长度,Python 的写法是 len(x) ,而且这种写法对列表、元组 和字典等对象也同样适用,只需要传入对应的参数即可。len() 函数是共用的。 这是一种极简哲学的体现:Simple is better than complex。 但是 ,有些语言并不是这样 ,例如在 Java 中 ,字符 串类有一个求长度的方法 ,其它类 也有自己的求长度的方法,它们无法共用。每次使用时,通过类或实例来调用。 同样是求字符串长度,Python 的写法: 而在 Java 中,写法可能如下(简化起见): Python 采用的是一种前缀表达式 ,而 Java 采用的则是后缀表达式 。 除了求长度,Python 的某些内置函数也能在 Java 中找到对应的表达。例如,数值型字 符串 s 转化为整型数字,Python 可以用 int(s) 函数,而 Java 可以 用 Integer.parseInt(s) ;整型数字转化为字符串,Python 可以用 str(i) ,而 Java 也有 String.valueOf(i)。 Python 的内置函数不与特定的类绑定 ,它们是一级对象。而 Java 的 “函数”则无法脱 离类而存在,它们只是附属品。 从直观角度来看,Python 的表达似乎是更优的。但是,它们并不具有可比性 ,因为这 是两套语言系统,各有独特的范畴背景,并不能轻易地化约。 就好比是,不能因为拉丁字母笔画简单,就说它优于汉字,因为在表意时,字母(表音 文字)是远逊于汉字(表意文字)的。 同样,日本借用了汉字的偏旁部首而造出来的文字,虽然更省笔墨,但是也完全丧失了 意蕴。 以此类比,Python 的内置函数虽有简便之美,但却丢失了某些表意功能。有些人在质 疑/抨击 Python 的时候,也喜欢拿这点说事,认为这是 Python 的设计缺陷。 这就引出本文最想讨论的一个问题来:为什么 Python 要设计成 len(x) 这种前缀表达, 而不是 x.len() 这样的后缀表达呢? 事实上,后缀设计也是可行的,以 Python 中列表的两个方法为例: 它们都是通过列表对象来调用 ,并不是凭空从 内置命名空间中拿来的。语义表达得也很 清楚,就是对 mylist 做排序和逆转。 恰恰那么巧,它们还有两个同父异母的兄弟 sorted() 与 reversed() ,这俩是前缀表达 型。 不同的写法,都在做同一件事(不考虑它们的副作用)。因此,后缀语法并非不可行, 之所以不用,那肯定是刻意的设计。 回到前面的问题:为什么是 len(x) ,而非 x.len(x) ,这源于 Python 的什么设计思想 呢? Python 之父 Guido van Rossum 曾经解释过这个问题,有两个原因: 对于某些操作 ,前缀符比后缀更好读——前缀 (和中缀 )表示法在数学中有着悠久 的历史 ,其视觉效果有助于数学家思考问题。我们可以简单地把公式 x*(a + b) 重写 成 x*a + x*b ,但同样的事,以原生的面向对象的方式实现,就比较笨拙。 当读到 len(x) 时 ,我就 知道 这是在求某对象的长度。它告诉我了两点 :返回值是一 个整数 ,参数是某种容器。但当读到 x.len() 时 ,我必须事先知道某种容器 x ,它实 现了一个接 口 ,或者继承了一个拥有标准 len() 方法的类。我们经常会 目睹到这种混 乱 :一个类并没有实现映射 (mapping )接 口 ,却拥有 get() 或 keys() 方法 ,或者 某些非文件对象,却拥有一个 write() 方法。 解释完这两个原因之后,Guido 还总结成一句话说:“I see len as a built-in operation ”。这已经不仅是在说 len() 更可读易懂了,而完全是在拔高 len() 的地位。 这就好比说,分数 ½ 中的横线是数学中的一个“内置”表达式,并不需要再实现什么 接口之类的,它自身已经表明了“某数除以某数 ”的意思。 不同类型的数(整数、浮点数、有理数、无理数…... )共用同一个操作符,不必为每类 数据实现一

文档评论(0)

JuanHuang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档