認(rèn)為Python存在重大缺陷的原因有哪些

小編給大家分享一下認(rèn)為Python存在重大缺陷的原因有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、榮昌網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場景定制電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為榮昌等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

原因1:版本之間不兼容

安裝Linux后,那么它很可能默認(rèn)會安裝多個(gè)版本的Python,可能有Python2和Python3,甚至更多零零碎碎的版本,如3.5或3.7。

這是有原因的:Python3與Python2不完全兼容,一些其他版本在這方面的缺陷也足夠明顯——向后兼容性不足(backwards compatibility,也稱為向下兼容性)。

所以Ubuntu同時(shí)安裝了Python2和Python3,因?yàn)檫@些版本的核心功能是不同的。

缺乏向后兼容和分離版本通常是走向衰敗的預(yù)警。Commodore創(chuàng)建了第一臺家用電腦(要遠(yuǎn)早于IBM PC或Apple之前)。但Commodore PET與隨后的Commodore CBM計(jì)算機(jī)并不兼容,而CBM與VIC-20,Commodore-64,Amiga等也不兼容。因此,用戶要么花費(fèi)大量時(shí)間將代碼從一個(gè)平臺導(dǎo)到另一個(gè)平臺,要么就直接放棄了這個(gè)平臺——Commodore就是前車之鑒。當(dāng)用戶選擇放棄平臺時(shí),它就注定會消失。

同樣,Perl曾經(jīng)很受歡迎。但是當(dāng)Perl3問世時(shí),它并沒有完全向后兼容Perl2的代碼。接下來是Perl4。當(dāng)Perl5問世時(shí),很多人選擇轉(zhuǎn)向使用其他更穩(wěn)定的編程語言。所以今天,只有一小部分人還在積極使用Perl來維護(hù)現(xiàn)有的Perl項(xiàng)目,而其他任何基于Perl的重大新項(xiàng)目再也沒有出現(xiàn)過。

同樣,Python為每個(gè)版本設(shè)計(jì)了不同的代碼孤島。社區(qū)一直拖拽著這些舊版本,所以你最終也只能得到那些舊的、過時(shí)的Python代碼,因?yàn)闆]有人愿意花時(shí)間將它導(dǎo)到最新版本上。

據(jù)我所知,沒有人在Python2上創(chuàng)建新的代碼,但我們還讓它茍延殘喘著,因?yàn)闆]人將所需的代碼導(dǎo)到Python3.x. 在官方Python網(wǎng)站上,這些文檔被主動(dòng)維護(hù)并可用于Python 2.7、3.5、3.6和3.7——因?yàn)樗麄儫o法放棄舊代碼。Python就像編程語言的僵尸——行尸走肉般向前走。

原因2:安裝太太太太麻煩了

通常來說,你直接apt、yum、rpm后得到就是最新穩(wěn)定版。

但你如果'apt-get install python',就不知道是什么版本,可能與你需要的所有代碼都不兼容。所以你在安裝的時(shí)候需要指定Python版本。

有一個(gè)項(xiàng)目需要用Python3.5(當(dāng)時(shí)最新的版本),然而我的電腦上最終安裝了一大堆版本:Python2、Python2.6、Python3和Python3.5。兩個(gè)來自操作系統(tǒng),一個(gè)為了項(xiàng)目安裝,一個(gè)是因?yàn)槲野惭b了一些不相關(guān)的軟件。

盡管它們都是“Python”,但它們并非完全相同。

如果你想安裝Python的軟件包,你應(yīng)該使用“pip”(Pip代表“Pip Installs Packages”)。但是由于系統(tǒng)上有許多版本的Python,你必須記住使用正確版本的pip。否則,'pip'可能會運(yùn)行'pip2'而不是你需要的'pip3.7'。(如果名稱不存在,你需要指定pip3.7的實(shí)際安裝路徑。)

我被一個(gè)朋友告知我需要配置環(huán)境,以便所有東西都能使用Python 3.5。這種方法的確很有效,但沒有持續(xù)多久,因?yàn)槲议_始了另一個(gè)需要Python 3.6版本的項(xiàng)目。兩個(gè)并發(fā)項(xiàng)目有兩個(gè)不同版本的Python——emmmm,這有點(diǎn)一言難盡吧。

pip安裝程序?qū)⑽募旁谟脩舻谋镜啬夸浿?。你不能使用pip來安裝系統(tǒng)范圍的庫,并且Gawd會阻止你犯下運(yùn)行'sudo pip'的錯(cuò)誤,因?yàn)檫@會搞砸整個(gè)電腦!

順便說一句,是誰維護(hù)這些pip模塊?答案是社區(qū)。也就是說,沒有明確的所有者,也沒有強(qiáng)制性的責(zé)任所屬。今年早些時(shí)候,一個(gè)版本的PyPi有一個(gè)后門發(fā)生了SSH憑據(jù)盜竊,但我對此一點(diǎn)都不驚訝,因?yàn)樯鐓^(qū)存儲庫根本不值得相信。出于同樣的原因,我也不使用Node.js和npm。

原因3:令人頭疼的語法問題,作用域使用空格導(dǎo)致可讀性差

我是可讀代碼的堅(jiān)定信徒。乍一看,Python似乎非常易讀,而當(dāng)你開始制作大型代碼庫,這種易讀性就會減弱了。

其他編程語言,像C, Java, JavaScript, Perl, and PHP,用{} 來表示作用域;List用()。Python用空格。如果你需要給一個(gè)復(fù)雜的代碼定義一個(gè)作用域,然后你縮進(jìn)了下面幾行代碼,當(dāng)縮進(jìn)終止后,作用域就終止了。

Python手冊說你可以使用任意數(shù)量的空格或制表符來定義范圍。但是,每次縮進(jìn)都要用四個(gè)空格!如果要縮進(jìn)兩次以進(jìn)行嵌套,那就得使用八個(gè)空格!

Python社區(qū)已經(jīng)對這個(gè)術(shù)語進(jìn)行標(biāo)準(zhǔn)化,盡管它沒出現(xiàn)在Python手冊中。文檔中的示例說可以使用TAB、“TAB+1空格”等等。但是社區(qū)卻對4個(gè)空格有著喪心病狂的偏執(zhí)!因此,除非你打算永遠(yuǎn)不向其他任何人展示你寫的代碼,否則每個(gè)縮進(jìn)都要使用四個(gè)空格。

當(dāng)我第一次看到Python代碼時(shí),我認(rèn)為使用縮進(jìn)來定義范圍似乎是個(gè)好主意。事實(shí)上,我太天真了,這簡直是一個(gè)天大的缺點(diǎn)。

深度嵌套是可以進(jìn)行的,但每行代碼會變得很寬,不得不在文本編輯器中換行。長函數(shù)和長條件操作都可能讓開始與結(jié)束變得難以匹配。我可憐那些錯(cuò)誤計(jì)算空格數(shù)量(比如只輸了3個(gè)空格而不是四個(gè))的人,因?yàn)檫@樣的錯(cuò)誤需要數(shù)小時(shí)進(jìn)行調(diào)試和追蹤。

我debug代碼習(xí)慣沒有縮進(jìn),這樣我就可以快速瀏覽代碼,并在完成后輕松識別和刪除debug代碼。

但是用Python呢?縮進(jìn)錯(cuò)誤的話,都會報(bào)錯(cuò)。

原因4:特立獨(dú)行的加載庫方式

大多數(shù)編程語言都有一些方法可以包含其他代碼塊。對于C,它是“#include”。對于PHP,有'include','include_once','require'和'require_once'。而對于Python,則是“import”。

Python的import允許導(dǎo)入整個(gè)模塊、模塊的一部分或模塊中的特定功能。但查找導(dǎo)入代碼塊的方法卻很麻煩。使用C,直接看/usr/include/*.h就行了。但用Python?最好使用'python -v'列出所有位置,然后搜索該列表中每個(gè)目錄和子目錄中的每個(gè)文件。這真的很麻煩。

導(dǎo)入功能還允許用戶重命名導(dǎo)入的代碼,它們基本上定義了一個(gè)命名空間。乍一看,這似乎很不錯(cuò),但這最終會影響可讀性和長期支持。重命名模塊非常適合小腳本,但對于大程序來說真的很糟糕。這樣的操作“import numpy as n”,應(yīng)該被打死。

但這不是最糟糕的部分。對于大多數(shù)語言,包含代碼真的只意味著包含代碼。而一些語言(如面向?qū)ο蟮腃 ++)則可以執(zhí)行代碼。類似地,一些PHP代碼可能會定義全局變量,因此一項(xiàng)import可以運(yùn)行代碼,但這通常被認(rèn)為是一種不好的做法。相比之下,許多Python模塊包含在導(dǎo)入期間運(yùn)行的初始化函數(shù)。你不知道什么在運(yùn)行,你不知道它在做什么,你甚至都沒察覺到。除非存在命名空間沖突,否則在這種情況下,你需要花很長時(shí)間來查找原因。

原因5:關(guān)鍵字和庫命名“獨(dú)樹一幟”

在其他所有編程語言中,數(shù)組都稱為“array”。在Python中,數(shù)組被稱為“l(fā)ist”。在其他語言中,關(guān)聯(lián)數(shù)組有時(shí)稱為'hash'(Perl),但Python里叫做“dictionary”。 Python似乎沒有使用在計(jì)算機(jī)和信息科學(xué)領(lǐng)域的常用術(shù)語。

然后是庫的名稱??纯催@些名字吧,PyPy、PyPi、NumPy、SciPy,SymPy、PyGtk、Pyglet,PyGame ...(是的,前兩個(gè)名稱發(fā)音一模一樣,但是它們的功能和用途有很大區(qū)別。)我知道“py”代表Python。但這兩個(gè)字母就不能固定在庫的開頭或是末尾嗎?

而且一些常見的庫并沒有沿用這個(gè)所謂的“Py”命名約定。比如matplotlib、nose、Pillow和SQLAlchemy。雖然從一些命名上能夠看出庫的一些功能(比如“SQLAlchemy”包含SQL,所以它可能是一個(gè)SQL接口),但很多名稱只是隨機(jī)化的單詞。如果你事先并不知道“BeautifulSoup”是干什么用的,你能從名稱中看出它是一個(gè)HTML / XML解析器嗎?(順便說一句,BeautifulSoup庫的說明文檔很完備,非常易于使用。如果每個(gè)Python模塊都這么好用,我也不會在這里吐槽這么多。但遺憾的是,這只是個(gè)例外,而不是常態(tài)。大多數(shù)Python庫的文檔都爛的要死。)

總的來說,我認(rèn)為Python對庫的命名非?;靵y,缺乏一致性的原則。我總覺得,開源項(xiàng)目的命名都存在這種規(guī)則混亂的問題。除非你了解這個(gè)項(xiàng)目,否則你從項(xiàng)目名字上根本看不出來。除非你知道要找的是什么,否則你很可能永遠(yuǎn)都無法找到想找的東西。從大多數(shù)Python庫的命名上看,我現(xiàn)在更加確信這個(gè)觀點(diǎn)了。

原因6:其他“獨(dú)樹一幟”之處略多

每種語言都有它的怪癖。在C語言中,使用&和*來訪問地址空間和值是奇怪的命名法。C也有“++”和 --"這樣的變量增減控制方式。在Bash語言中,當(dāng)引用括號和正則表達(dá)式的句點(diǎn)等特殊字符時(shí),需要使用反斜杠。

JavaScript存在兼容性問題(并非每個(gè)瀏覽器都支持所有有用的功能)。但是,Python比我見過的任何其他語言的奇怪之處更多。以字符串為例:

?在C中,對字符串使用雙引號,對字符使用單引號。

?在PHP和Bash中,兩種類型的引號都可以用于字符串。但是,使用雙引號時(shí)可以在字符串中嵌入變量。相比之下,使用單引號括起來的字符串屬于文字。任何類似嵌入式變量的名稱都不可擴(kuò)展。

?在JavaScript中,單引號和雙引號之間確實(shí)沒有區(qū)別。

?在Python中,單引號和雙引號之間沒有區(qū)別。但是,如果想讓字符串跨行,則需要使用三引號“”“string”“”或“''string'''。如果想使用二進(jìn)制文件,那么你需要用b(b'binary')或r(r'raw')來優(yōu)先選擇字符串。有時(shí)還需要使用str(string)進(jìn)行字符串轉(zhuǎn)換,或使用string.encode('utf-8')將其轉(zhuǎn)換為utf8。

如果你認(rèn)為=、==和===這些符號PHP和JavaScript中有點(diǎn)怪,那么等你在Python中使用引號時(shí)再說吧。

原因7:賦值方式怪異

大多數(shù)編程語言都按值傳遞函數(shù)參數(shù)。如果函數(shù)改變了值,則結(jié)果不會傳遞回調(diào)用代碼。但Python不一樣。 Python默認(rèn)使用pass-by-object-reference參數(shù)執(zhí)行函數(shù)。這意味著更改源變量可能最終會改變值。

這是面向程序、面向函數(shù)和面向?qū)ο缶幊陶Z言之間的重大差異之一。如果每個(gè)變量都是通過對象引用傳遞的,而且對變量的任何更改都會導(dǎo)致其他所有地方的變量值變化,那么其實(shí)也可以全部使用全局變量來處理所有內(nèi)容。使用不同的名稱調(diào)用同一個(gè)對象不會更改對象的值,因此實(shí)際上該對象就是全局的。C語言程序員有句老話,全局變量是邪惡的,不應(yīng)該使用。

在Python中,必須按值傳遞變量?!癮 = b”只是為同一個(gè)對象空間指定另一個(gè)名稱,并不會將b的值賦到a中。如果要賦值,則需要使用copy函數(shù)。通常格式是“a = b.copy()”。但是,請注意我說的是“通?!薄2⒎撬袛?shù)據(jù)類型都能夠這樣賦值,部分功能可能不完整。這時(shí)需要使用一個(gè)名為“copy”的獨(dú)立庫:“a = copy.deepcopy(b)”。

原因8:本地程序命名易混亂

根據(jù)使用的庫或函數(shù)來命名程序是一種常見的編程技術(shù)。比如,我正在使用名為“l(fā)ibscreencapture.so”的C語言庫測試屏幕捕獲程序,我調(diào)用的程序可能會命名為“screencapture.c”,編譯后命名為“screencapture.exe”。

如果使用C,Java,JavaScript,Perl,PHP等語言,這種命名方式很好用,因?yàn)槌绦蛘Z言可以很容易地將資源庫與本地程序區(qū)分開來,因?yàn)楸舜说穆窂绞遣煌摹5侨绻玫氖荘ython,永遠(yuǎn)不要這樣命名。

為什么? Python總是假定用戶首先要導(dǎo)入本地代碼。如果我有一個(gè)名為“screencapture.py”的程序使用“importscreencapture”,那么它將導(dǎo)入自己而不是系統(tǒng)庫。至少,本地程序需要命名為“myscreencapture.py”才能避免這種錯(cuò)誤。

當(dāng)然了,吐槽了這么多,但其實(shí)Python并非一無是處。

Python是一種非常流行的語言,擁有數(shù)量龐大的使用者。我身邊有一些朋友非常喜歡Python,這是他們首選的編程語言。多年來,我和他們討論過這些問題,每次他們都點(diǎn)頭表示同意。他們并不否認(rèn)Python確實(shí)存在這些問題,只是覺得這些缺點(diǎn)不足以讓他們拋棄Python。

我的朋友經(jīng)常在編程中將所有存在的非??岬腜ython庫統(tǒng)統(tǒng)引用。我也認(rèn)為一些庫確實(shí)非常有用。例如,BeautifulSoup是我用過的最好的HTML解析器之一,NumPy使得多維數(shù)組和復(fù)雜的數(shù)學(xué)過程更容易實(shí)現(xiàn),而TensorFlow則對于機(jī)器學(xué)習(xí)非常有用。但是,我不會因?yàn)橄矚gTensorFlow或SciPy,而在Python中創(chuàng)建一個(gè)單片程序。為了某些庫的便利性,放棄程序可讀性和可維護(hù)性,屬于得不償失。

以上是“認(rèn)為Python存在重大缺陷的原因有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前標(biāo)題:認(rèn)為Python存在重大缺陷的原因有哪些
轉(zhuǎn)載來源:http://muchs.cn/article6/gpjhog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站導(dǎo)航定制開發(fā)、用戶體驗(yàn)

廣告

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

搜索引擎優(yōu)化