中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

len(x)擊敗x.len(),從內(nèi)置函數(shù)看Python的設(shè)計(jì)思想-創(chuàng)新互聯(lián)

內(nèi)置函數(shù)是 Python 的一大特色,用極簡(jiǎn)的語(yǔ)法實(shí)現(xiàn)很多常用的操作。

10年積累的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有松江免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

它們預(yù)先定義在內(nèi)置命名空間中,開(kāi)箱即用,所見(jiàn)即所得。Python 被公認(rèn)是一種新手友好型的語(yǔ)言,這種說(shuō)法能夠成立,內(nèi)置函數(shù)在其中起到了極關(guān)鍵的作用。

舉個(gè)例子,求字符串 x 的長(zhǎng)度,Python 的寫(xiě)法是 len(x) ,而且這種寫(xiě)法對(duì)列表、元組和字典等對(duì)象也同樣適用,只需要傳入對(duì)應(yīng)的參數(shù)即可。len() 函數(shù)是共用的。

這是一種極簡(jiǎn)哲學(xué)的體現(xiàn):Simple is better than complex。

但是,有些語(yǔ)言并不是這樣,例如在 Java 中,字符串類(lèi)有一個(gè)求長(zhǎng)度的方法,其它類(lèi)也有自己的求長(zhǎng)度的方法,它們無(wú)法共用。每次使用時(shí),通過(guò)類(lèi)或?qū)嵗齺?lái)調(diào)用。

同樣是求字符串長(zhǎng)度,Python 的寫(xiě)法:

len(x) 擊敗 x.len(),從內(nèi)置函數(shù)看 Python 的設(shè)計(jì)思想

而在 Java 中,寫(xiě)法可能如下(簡(jiǎn)化起見(jiàn)):

len(x) 擊敗 x.len(),從內(nèi)置函數(shù)看 Python 的設(shè)計(jì)思想

Python 采用的是一種前綴表達(dá)式?,而 Java 采用的則是后綴表達(dá)式?。

除了求長(zhǎng)度,Python 的某些內(nèi)置函數(shù)也能在 Java 中找到對(duì)應(yīng)的表達(dá)。例如,數(shù)值型字符串 s 轉(zhuǎn)化為整型數(shù)字,Python 可以用int(s)函數(shù),而 Java 可以用?Integer.parseInt(s);整型數(shù)字轉(zhuǎn)化為字符串,Python 可以用str(i),而 Java 也有String.valueOf(i)。

Python 的內(nèi)置函數(shù)不與特定的類(lèi)綁定,它們是一級(jí)對(duì)象。而 Java 的“函數(shù)”則無(wú)法脫離類(lèi)而存在,它們只是附屬品。

從直觀角度來(lái)看,Python 的表達(dá)似乎是更優(yōu)的。但是,它們并不具有可比性?,因?yàn)檫@是兩套語(yǔ)言系統(tǒng),各有獨(dú)特的范疇背景,并不能輕易地化約。

就好比是,不能因?yàn)槔∽帜腹P畫(huà)簡(jiǎn)單,就說(shuō)它優(yōu)于漢字,因?yàn)樵诒硪鈺r(shí),字母(表音文字)是遠(yuǎn)遜于漢字(表意文字)的。同樣的,日本借用了漢字的偏旁部首而造出來(lái)的文字,雖然更省筆墨,但是也完全喪失了意蘊(yùn)。

以此類(lèi)比,Python 的內(nèi)置函數(shù)雖有簡(jiǎn)便之美,但卻丟失了某些表意功能。有些人在質(zhì)疑/抨擊 Python 的時(shí)候,也喜歡拿這點(diǎn)說(shuō)事,認(rèn)為這是 Python 的設(shè)計(jì)缺陷。

這就引出本文最想討論的一個(gè)問(wèn)題來(lái):為什么 Python 要設(shè)計(jì)成 len(x) 這種前綴表達(dá),而不是 x.len() 這樣的后綴表達(dá)呢?

事實(shí)上,后綴設(shè)計(jì)也是可行的,以 Python 中列表的兩個(gè)方法為例:

len(x) 擊敗 x.len(),從內(nèi)置函數(shù)看 Python 的設(shè)計(jì)思想

它們都是通過(guò)列表對(duì)象來(lái)調(diào)用,并不是憑空從內(nèi)置命名空間中拿來(lái)的。語(yǔ)義表達(dá)得也很清楚,就是對(duì) mylist 做排序和逆轉(zhuǎn)。

恰恰那么巧,它們還有兩個(gè)同父異母的兄弟 sorted() 與 reversed(),這倆是前綴表達(dá)型。

len(x) 擊敗 x.len(),從內(nèi)置函數(shù)看 Python 的設(shè)計(jì)思想

不同的寫(xiě)法,都在做同一件事(不考慮它們的副作用)。因此,后綴語(yǔ)法并非不可行,之所以不用,那肯定是刻意的設(shè)計(jì)。

回到前面的問(wèn)題:為什么是 len(x) ,而非 x.len(x),這源于 Python 的什么設(shè)計(jì)思想呢?

Python 之父?Guido van Rossum?曾經(jīng)解釋過(guò)這個(gè)問(wèn)題(鏈接見(jiàn)文末),有兩個(gè)原因:

對(duì)于某些操作,前綴符比后綴更好讀——前綴(和中綴)表示法在數(shù)學(xué)中有著悠久的歷史,其視覺(jué)效果有助于數(shù)學(xué)家思考問(wèn)題。我們可以簡(jiǎn)單地把公式?x*(a + b)?重寫(xiě)成x*a + x*b?,但同樣的事,以原生的面向?qū)ο蟮姆绞綄?shí)現(xiàn),就比較笨拙。

當(dāng)讀到 len(x) 時(shí),我就?知道?這是在求某對(duì)象的長(zhǎng)度。它告訴我了兩點(diǎn):返回值是一個(gè)整數(shù),參數(shù)是某種容器。但當(dāng)讀到 x.len() 時(shí),我必須事先知道某種容器 x,它實(shí)現(xiàn)了一個(gè)接口,或者繼承了一個(gè)擁有標(biāo)準(zhǔn) len() 方法的類(lèi)。我們經(jīng)常會(huì)目睹到這種混亂:一個(gè)類(lèi)并沒(méi)有實(shí)現(xiàn)映射(mapping)接口,卻擁有 get() 或 keys() 方法,或者某些非文件對(duì)象,卻擁有一個(gè) write() 方法。

解釋完這兩個(gè)原因之后,Guido 還總結(jié)成一句話說(shuō):“I see 'len' as a built-in?operation?”。這已經(jīng)不僅是在說(shuō) len() 更可讀易懂了,而完全是在拔高 len() 的地位。

這就好比說(shuō),分?jǐn)?shù)???中的橫線是數(shù)學(xué)中的一個(gè)“內(nèi)置”表達(dá)式,并不需要再實(shí)現(xiàn)什么接口之類(lèi)的,它自身已經(jīng)表明了“某數(shù)除以某數(shù)?”的意思。不同類(lèi)型的數(shù)(整數(shù)、浮點(diǎn)數(shù)、有理數(shù)、無(wú)理數(shù)…)共用同一個(gè)操作符,不必為每類(lèi)數(shù)據(jù)實(shí)現(xiàn)一種求分?jǐn)?shù)的操作。

優(yōu)雅易懂是 Python 奉行的設(shè)計(jì)哲學(xué)?,len() 函數(shù)的前綴表達(dá)方式是最好的體現(xiàn)。我曾引述過(guò) Guido 對(duì)“為什么索引從 0 開(kāi)始?”的解釋。其最重要的原因,也正是 0-based 索引最優(yōu)雅易懂。

讓我們來(lái)先看看切片的用法。可能最常見(jiàn)的用法,就是“取前 n 位元素”或“從第i 位索引起,取后 n 位元素”(前一種用法,實(shí)際上是 i == 起始位的特殊用法)。如果這兩種用法實(shí)現(xiàn)時(shí)可以不在表達(dá)式中出現(xiàn)難看的 +1 或 -1,那將會(huì)非常的優(yōu)雅。

使用 0-based 的索引方式、半開(kāi)區(qū)間切片和缺省匹配區(qū)間的話(Python最終采用這種方式),上面兩種情形的切片語(yǔ)法就變得非常漂亮:a[:n] 和 a[i:i+n],前者是 a[0:n] 的縮略寫(xiě)法。

所以,我們能說(shuō) len(x) 擊敗 x.len() ,支撐它的是一種化繁為簡(jiǎn)、純粹卻深邃的設(shè)計(jì)思想。

面向?qū)ο蟮木幊陶Z(yǔ)言自發(fā)明時(shí)起,就想模擬我們生活于其中的現(xiàn)實(shí)世界??墒鞘裁搭?lèi)啊、接口啊、對(duì)象啊、以及它們的方法啊,這些玩意的毒,有時(shí)候蒙蔽了我們?nèi)タ匆?jiàn)世界本質(zhì)的眼睛。

桌子類(lèi)有桌子類(lèi)的求長(zhǎng)度方法,椅子類(lèi)有椅子類(lèi)的求長(zhǎng)度方法,無(wú)窮無(wú)盡,可現(xiàn)實(shí)真是如此么?求長(zhǎng)度的方法就不能是一種獨(dú)立存在的對(duì)象么?它之所以存在,是因?yàn)橛小皩?duì)象”存在,而不是因?yàn)橛心硞€(gè)類(lèi)才存在啊。

所以,我想說(shuō),len(x) 擊敗 x.len(),這還體現(xiàn)了?Python 對(duì)世界本質(zhì)的洞察?。

求某個(gè)對(duì)象的長(zhǎng)度,這種操作獨(dú)立于對(duì)象之外而存在,并不是該對(duì)象內(nèi)部所有的一種屬性或功能。從這個(gè)角度理解,我們能夠明白,為什么 Python 要設(shè)計(jì)出內(nèi)置函數(shù)??內(nèi)置函數(shù)其實(shí)是對(duì)世界本質(zhì)的一種捕捉。

這些見(jiàn)微知著的發(fā)現(xiàn),足夠使我們愛(ài)上這門(mén)語(yǔ)言了。人生苦短,我用 Python。

關(guān)聯(lián)閱讀:

Guido 解釋 len 的由來(lái):http://suo.im/4ImAEo

Guido 解釋 0 索引的由來(lái):http://suo.im/5cr12S

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

標(biāo)題名稱(chēng):len(x)擊敗x.len(),從內(nèi)置函數(shù)看Python的設(shè)計(jì)思想-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://www.rwnh.cn/article24/dgsgce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、App開(kāi)發(fā)建站公司、域名注冊(cè)手機(jī)網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司
尤溪县| 康马县| 尉氏县| 新蔡县| 凌源市| 长寿区| 印江| 五莲县| 玉溪市| 保靖县| 平泉县| 棋牌| 曲周县| 白玉县| 扎赉特旗| 西宁市| 隆林| 始兴县| 澜沧| 民勤县| 桦甸市| 宝坻区| 达尔| 博爱县| 汉中市| 沁水县| 克山县| 安西县| 花垣县| 右玉县| 乌兰浩特市| 徐汇区| 邹平县| 农安县| 大邑县| 墨江| 昌邑市| 宿州市| 东源县| 芜湖市| 庄浪县|