简便 or 缺陷?Python 内置函数大揭秘!| 技术头条

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 豌豆花下猫

责编 | 胡巍巍

内置函数是 Python 的一大特色,用极简的语法实现很多常用的操作。

它们预先定义在内置命名空间中,开箱即用、所见即所得。Python 被公认是一种新手友好型的语言,这种说法能够成立,内置函数在其中起到了极关键的作用。

举个例子,求字符串 x 的长度,Python 的写法是 len(x) ,而且这种写法对列表、元组和字典等对象也同样适用,只需要传入对应的参数即可。len() 函数是共用的。

这是一种极简哲学的体现:Simple is better than complex。

但是,有些语言并不是这样,例如在 Java 中,字符串类有一个求长度的方法,其它类也有自己的求长度的方法,它们无法共用。每次使用时,通过类或实例来调用。

同样是求字符串长度,Python 的写法:


 

saying = "Hello world!"
print(len(saying))

# 结果:12

而在 Java 中,写法可能如下(简化起见):


 

String saying = "Hello world!";
System.out.println(saying.length());

// 结果:12

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 = [21354]

mylist.sort()
print(mylist)   # [1, 2, 3, 4, 5]

mylist.reverse()
print(mylist)   # [5, 4, 3, 2, 1]

它们都是通过列表对象来调用,并不是凭空从内置命名空间中拿来的。语义表达得也很清楚,就是对 mylist 做排序和逆转。

恰恰那么巧,它们还有两个同父异母的兄弟 sorted() 与 reversed(),这俩是前缀表达型。


 

mylist = [2, 1, 3, 5, 4]

sort_list = sorted(mylist)
print(sort_list)   # [1, 2, 3, 4, 5]

reverse_list = reversed(mylist)
print(list(reverse_list))   # [4, 5, 3, 1, 2]

不同的写法,都在做同一件事(不考虑它们的副作用)。因此,后缀语法并非不可行,之所以不用,那肯定是刻意的设计。

回到前面的问题:为什么是 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() 的地位。

这就好比说,分数 ½ 中的横线是数学中的一个“内置”表达式,并不需要再实现什么接口之类的,它自身已经表明了“某数除以某数 ”的意思。

不同类型的数(整数、浮点数、有理数、无理数…...)共用同一个操作符,不必为每类数据实现一种求分数的操作。

优雅易懂是 Python 奉行的设计哲学 ,len() 函数的前缀表达方式是最好的体现。

我想起在《超强汇总:学习Python列表,只需这篇文章就够了》这篇文章中,曾引述过 Guido 对“为什么索引从 0 开始 ”的解释。其最重要的原因,也正是 0-based 索引最优雅易懂。

让我们来先看看切片的用法。可能最常见的用法,就是“取前 n 位元素”或“从第i 位索引起,取后 n 位元素”(前一种用法,实际上是 i == 起始位的特殊用法)。如果这两种用法实现时可以不在表达式中出现难看的 +1 或 -1,那将会非常的优雅。

使用 0-based 的索引方式、半开区间切片和缺省匹配区间的话(Python最终采用这种方式),上面两种情形的切片语法就变得非常漂亮:a[:n] 和 a[i:i+n],前者是 a[0:n] 的缩略写法。

所以,我们能说 len(x) 击败 x.len() ,支撑它的是一种化繁为简、纯粹却深邃的设计思想。

面向对象的编程语言自发明时起,就想模拟我们生活于其中的现实世界。可是什么类啊、接口啊、对象啊、以及它们的方法啊,这些玩意的毒,有时候蒙蔽了我们去看见世界本质的眼睛。

桌子类有桌子类的求长度方法,椅子类有椅子类的求长度方法,无穷无尽,可现实真是如此么?

求长度的方法就不能是一种独立存在的对象么?它之所以存在,是因为有“对象”存在,而不是因为有某个类才存在啊。

所以,我想说,len(x) 击败 x.len(),这还体现了 Python 对世界本质的洞察 。

求某个对象的长度,这种操作独立于对象之外而存在,并不是该对象内部所有的一种属性或功能。从这个角度理解,我们能够明白,为什么 Python 要设计出内置函数? 内置函数其实是对世界本质的一种捕捉。

这些见微知著的发现,足够使我们爱上这门语言了。人生苦短,我用 Python。

作者:豌豆花下猫,某985高校毕业生, 兼具极客思维与人文情怀。公众号Python猫,专注Python技术、数据科学和深度学习,力图创造一个有趣又有用的学习分享平台。

声明:本文为作者投稿,版权归作者个人所有。

Python 为何能成最强编程语言?

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

【END】

640?wx_fmt=jpeg

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓

640?wx_fmt=jpeg

 热 文 推 荐 

☞ 当过爱因斯坦助理,参加过曼哈顿计划,他还发明受欢迎的编程语言 | 人物志

 程序员版的「倚天屠龙」,看完泪奔!

 漫画:如何求图的最短路径? | 技术头条

准码农自述:我是如何从二本到日本留学,从 C 语言到人工智能的?

☞ 阿里半跪过,任正非差点跳楼,京东被骗光钱:成年人的生活哪有容易二字?

☞ 回报率29%! 大神用情感分析创建一个比特币交易算法, 原来交易玩的是心理战

☞ 硬核粉丝 | 清华双胞胎“YCY Dance Now”杀进超越杯编程大赛决赛

☞ 异构计算=未来?一文带你秒懂3大主流异构

☞ 她说:为啥程序员都特想要机械键盘?这答案我服!


 

System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"


 
你点的每个“在看”,我都认真当成了喜欢
展开阅读全文

AR技术揭秘,一小时快速掌握!

05-19

最近一只“3D小熊”忽然在网络爆火,这个软件的神奇之处在于3D小熊看上去是栩栩如生的浮现在你的手机上。看这么火笔者也忍不住也安装了一个体验了下,不过感觉并没有想象中的那么神奇。rnrn网上的效果图:rn[img=https://img-bbs.csdn.net/upload/201705/19/1495174637_500574.jpg][/img]rn而真相实际是:rn[img=https://img-bbs.csdn.net/upload/201705/19/1495174645_832036.jpg][/img]rn实际体验图rnrn在网上看到的图片基本上都是手机的截屏,后面是笔者拍摄的是手机显示的实际画面,所以很多不明真相的群众看到第一张图片后会以为是小熊真的跳出了屏幕,其实那只不过是用两个手机玩的障眼法。rnrn当然这种显示技术也并不是神秘,它其实是利用了增强现实技术的一个小应用,也就是我们常说的AR(Augmented Reality)技术。这是一种将真实世界信息和虚拟世界信息“无缝”集成的新技术,是把原本在现实世界的一定时间空间范围内很难体验到的实体信息(视觉信息,声音,味道,触觉等),通过电脑等科学技术,模拟仿真后再叠加,将虚拟的信息应用到真实世界,被人类感官所感知,从而达到超越现实的感官体验。真实的环境和虚拟的物体实时地叠加到了同一个画面或空间同时存在。目前,高通已经将AR技术制作成AR眼镜,帮助大家生活娱乐。在前段时间GMIC大会上已经发布了AR最新产品。rnrn现在的技术日新月异,只有紧跟时代的步伐,才不会被淘汰。AR技术无疑是当下最火爆,也是最有“钱途”的技术之一。市场上的AR技术人才相当稀缺,让我们一起提升技能,提高自身的含金量。为此,我们有幸邀请到了高通产品市场资深经理郭鹏,负责Qualcomm中国区VR/AR智能硬件,多年无限半导体行业从业经验,毕业于清华大学。来为我们精彩讲述AR技术课程。rn[img=https://img-bbs.csdn.net/upload/201705/19/1495174672_718057.jpg][/img]rn现在[b][color=#FF0000][url=http://edu.csdn.net/huiyiCourse/detail/382]报名公开课[/url][/color][/b],还有福利哦!在6月8日20:00-21:00,[url=http://edu.csdn.net/huiyiCourse/detail/382][b][color=#FF0000]参与公开课[/color][/b][/url]的同学都能获得礼物哟。上进的同学有福啦!干货内容,丰富奖品免费赠送。rnrn-----------------------------------------------------------获 奖 公 布------------------------------------------------------------rn领奖说明:rn1、您可以选择加我微信cc1559005434,截图您登陆ID的界面,以确认您是获奖者,并告知您的地址,我们将及时反馈您寄出奖品的快递单号。rn2、站内短信直接回复快递地址,可能略有延迟,不超过2日内回复。rn[img=https://img-bbs.csdn.net/upload/201706/13/1497347727_36007.jpg][/img]rn一等奖:rnxtc1230rnliang_704959721rndongfeng9gerndavid2006rnrn二等奖:rnm0_38025459rnsinat_38212444rnu012502355rnexceluserrnu011376884rnqq_38028993rnsixboxrnqditzrntitanniernqq_25926525rnrn三等奖:rnacejoyrnmabing993rnbennyhu621rnxzp191150196rnweixin_39065341rnwesternhillerrnMarnonrnwilliam7_138rngogusoftrnshuangyi119rnu012203715rntongbiaosrnsky0681315rnzhang19871112rnyanghongbin818rnwjz725rnlurenfurna50052353rnu012922981rnscienceyuanrnchengejunrnzjr2472265650rninetdogrnjinfeng105rnsuhao15330369126rnweixin_39064939rnE_mKsrnm0_37847034rnhxt22rnhnkboyrnmano521rnweixin_38117042rnbook_liangjlongrnsjun365rndong_beijingrnllww0208rn#N/Arnsurcreakrnq1178628373rnbcgznslwcrnyhsaernqq_34110019rnDelphirnaddicted_learningrnqq_34327269rnjw6018rnQQ1005498576rnwsnwsnrnweixin_37030435rnqq_28738419rnrn四等奖:rnqq_26666219rnweixin_38118108rnliu782726344rnzhy1991yhz1rnSunfly666rnqq_32205375rnqq_23555943rncheneyfanrnSherlock_shirnDerekgudu0913rnqq_28678927rnqq_34251059rnhushanparnu012398782rnqq_21482763rnappledf3rncowcrossrnchajianjin1410rnjiansheli2008rnNeil3Drnzxzx131rnweixin_36623221rnTrue_lightrnquickzhao3223rnwhyjldrnjiaoxin12366rnu013258844rntongsiwrnweixin_38879802rnyellowboyddrnxiaozhu12371237rnljq18868394180rnybszzlprndear_Alice_moonrnljheeernqq_38710990rnweixin_38115738rnii19910410rnm0_37082167rnjaccenrnweixin_38857963rngaolihuurntongjianwurnbeskcomrnQIURIGAOrnu013360850rnweixin_38856261rnA_BlackMoonrnzhf1206rnsqz10200rnzhaoqinlurnqq_23118305rnchenwg1991rnbaifanwudirnu011118206rnqq_30089923rnpkuzhxrnqq_30259689rnlaowan_good_manrnfengyingfen_19rnkuaidixiaogernweixin_38788354rnjia0rnweixin_38840569rndiaozhaoqian123rnvolcano_zzzrnJ_No_body_will_winrnqq_37511981rngzliudanrnjamesclarkernhaifeng0331rnoMandy123456789rnwjn18698729446rndear_deckrnlicg9999rnyj_780209rnTony_guo5566rnu011924467rnslx3320612540rnqq_24815615rnwoibb110rnjianghappyboyrnfeiyangklrnsbx19850629rnxiachuyurnrn[b][color=#FF0000]粉丝福利[/color][/b]rnrn[b]一等奖3名:Qualcomm充电宝。[/b]rn在公开课上能够活跃发言,与大家进行友好互动。对AR技术了解,并有自己独特见解的同学,我们将赠送Qualcomm充电宝一个。rn[b]二等奖10名:程序员杂志[/b]rn在公开课上能够活跃发言,内容与AR技术相关,我们将赠送“程序员杂志”一本。rn[b]三等奖50名:C币 50个[/b]rn成功报名公开课,并且参与公开课的同学我们将赠送50个C币。rn[b]四等奖100名:C币 20个[/b]rn成功报名公开课,我们将赠送20个C币。rn[img=https://img-bbs.csdn.net/upload/201705/19/1495174683_529907.gif][/img]rn扫码报名rn[b][color=#FF0000]报名链接:[/color][url=http://edu.csdn.net/huiyiCourse/detail/382]http://edu.csdn.net/huiyiCourse/detail/382[/url][/b]rn 论坛

没有更多推荐了,返回首页