python和C++比較_第1頁
python和C++比較_第2頁
python和C++比較_第3頁
python和C++比較_第4頁
python和C++比較_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、【精品文檔】如有侵權(quán),請聯(lián)系網(wǎng)站刪除,僅供學(xué)習(xí)與交流python和C+比較.精品文檔.The Difference Between Python and C+摘要:經(jīng)過半個(gè)學(xué)期的程序設(shè)計(jì)語言原理的學(xué)習(xí),根據(jù)本人課外所學(xué)的python和課程所學(xué)的C+編程語言,本人進(jìn)行了粗略的對比,分別從二者的運(yùn)行效率,執(zhí)行方式,基本語法其中對二者關(guān)于面向?qū)ο笾惺褂妙惖姆椒ㄟM(jìn)行了個(gè)人觀點(diǎn)的闡述。對于當(dāng)今幾種比較流行的編程語言,比較其中的不同點(diǎn)有助于幫助我們更加深刻的理解語言與語言之中的差異,一切為了更好的學(xué)習(xí)。關(guān)鍵字:python,C+,運(yùn)行效率,執(zhí)行方式,面向?qū)ο螅?,差異語言介紹:C+融合了3中不同的編程傳統(tǒng)

2、:C語言代表的過程性傳統(tǒng)、C+在C語言基礎(chǔ)上添加的類代表的面向?qū)ο笳Z言的傳統(tǒng)以及C+模板支持的通用編程傳統(tǒng)。在C+中,類是一種規(guī)范,它描述了這種新型數(shù)據(jù)格式,對象是根據(jù)這種規(guī)范構(gòu)造的特定數(shù)據(jù)結(jié)構(gòu)。為了應(yīng)付C語言所面臨的挑戰(zhàn),OOP提供了一種試圖讓語言來滿足問題要求的一種新方法,其理念是設(shè)計(jì)與問題的本質(zhì)特性相對應(yīng)的數(shù)據(jù)格式。OOP程序設(shè)計(jì)方法首先設(shè)計(jì)類,它準(zhǔn)確地描述了程序要處理的信息,這種技術(shù)涉及到許多新概念,如對象、類、封裝、繼承、多態(tài)等。C+誕生于貝爾實(shí)驗(yàn)室,由Bjarne Stroustrup于20世紀(jì)80年代開發(fā)出來,“C+主要是為了我的朋友和我不必再使用匯編語言、C語言或其它現(xiàn)代高級(jí)語

3、言來編程而設(shè)計(jì)的。它的主要功能是可以方便地編寫出好程序,讓每個(gè)程序員更加快樂?!盤ython是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語言,由荷蘭人Guido van Rossum于1989年發(fā)明,第一個(gè)公開發(fā)行版發(fā)行于1991年。Python具有豐富和強(qiáng)大的庫。它常被昵稱為膠水語言,能夠把用其他語言制作的各種模塊(尤其是C/C+)很輕松地聯(lián)結(jié)在一起。 python是一種腳本語言,寫好了就可以直接運(yùn)行,省去了編譯鏈接的麻煩,對于需要多動(dòng)手實(shí)踐的初學(xué)者而言,也就是少了出錯(cuò)的機(jī)會(huì)。而且python還有一種交互的方式,如果是一段簡單的小程序,連編輯器都可以省了,直接敲進(jìn)去就能運(yùn)行。用縮進(jìn)來表示程

4、序的嵌套關(guān)系可謂是一種創(chuàng)舉,把過去軟性的編程風(fēng)格升級(jí)為硬性的語法規(guī)定。再不需要在不同的風(fēng)格間選擇、再不需要為不同的風(fēng)格爭執(zhí)。python中沒有各種隱晦的縮寫,不需要去強(qiáng)記各種奇怪的符號(hào)的含義。python寫的程序很容易懂,這是不少人的共識(shí)。python是一種功能豐富的語言,它擁有一個(gè)強(qiáng)大的基本類庫和數(shù)量眾多的第三方擴(kuò)展。python為程序員提供了豐富的基本功能使得人們寫程序時(shí)用不著一切最底層做起。 運(yùn)行效率1、運(yùn)行效率:C+遠(yuǎn)大于python。python代碼和C+代碼最終都會(huì)轉(zhuǎn)化成CPU指令執(zhí)行,但一般情況下,python最終轉(zhuǎn)換出來的CPU指令的量會(huì)比C+ 多好幾倍。首先,python的東

5、西比C+多,經(jīng)過了更多層,python中甚至連數(shù)字都是對象。其次,python是解釋執(zhí)行的,和物理機(jī)CPU之間多了解釋器這一層,而C+是編譯執(zhí)行的,直接就是機(jī)器碼,編譯的時(shí)候編譯器還可以進(jìn)行一些適當(dāng)?shù)膬?yōu)化。所以運(yùn)行效率上C+遠(yuǎn)遠(yuǎn)優(yōu)于python。2、開發(fā)效率:python 遠(yuǎn)大于 C+。有時(shí)候針對某一要求的實(shí)現(xiàn),python的代碼量是幾行,而C+可能是超過百行。其中的一個(gè)例子就是用C+解析Json,也許對于一個(gè)比較資深的程序員猿都要調(diào)試個(gè)好幾天,說不定調(diào)好了又造成內(nèi)存泄漏。但是如果你用python的話,只需要import json然后進(jìn)行操作,開發(fā)效率大大提高。所以從開發(fā)效率上,python要

6、優(yōu)于C+,正如俗話所說:"人生苦短,我用Python"。執(zhí)行方式在我看來python和C+最大的不同在于兩者的執(zhí)行方式:python是解釋執(zhí)行而C+是編譯執(zhí)行的。一般的認(rèn)為,程序有兩種執(zhí)行方式:解釋執(zhí)行和編譯執(zhí)行。解釋程序:解釋程序是一種高級(jí)語言翻譯程序,它將源語言(如BASIC)書寫的源程序作為輸入,解釋一句后就提交計(jì)算機(jī)執(zhí)行一句,并不形成目標(biāo)程序。這種特性非常適合于用戶通過終端設(shè)備與計(jì)算機(jī)會(huì)話,比如在終端上打一條命令或語句,解釋程序就立即將此語句解釋成一條或幾條指令并提交硬件立即執(zhí)行且將執(zhí)行結(jié)果反映到終端,從終端把命令打入后,就能立即得到計(jì)算結(jié)果。雖然這樣子很方便,但是

7、解釋程序執(zhí)行速度很慢,例如源程序中出現(xiàn)循環(huán),則解釋程序也重復(fù)地解釋并提交執(zhí)行這一組語句,這就造成很大浪費(fèi)。 編譯程序: 編譯程序是一種很重要的語言處理程序,它把高級(jí)語言(如FORTRAN、COBOL、Pascal、C等)的源程序作為輸入,進(jìn)行翻譯轉(zhuǎn)換,產(chǎn)生出機(jī)器語言的目標(biāo)程序,然后再讓計(jì)算機(jī)去執(zhí)行這個(gè)目標(biāo)程序,得到計(jì)算結(jié)果。編譯程序工作時(shí),先進(jìn)行詞法分析和語法分析,然后進(jìn)行代碼優(yōu)化,存儲(chǔ)分配和代碼生成,最終得到目標(biāo)程序。為了完成這些分析綜合任務(wù),編譯程序采用對源程序進(jìn)行多次掃描的辦法,每次掃描集中完成一項(xiàng)或多項(xiàng)任務(wù)或者一項(xiàng)任務(wù)分散到幾次掃描。就像咱們礦大的編譯課程所學(xué):第一遍掃描做詞法分析;第

8、二遍掃描做語法分析;第三遍掃描做代碼優(yōu)化和存儲(chǔ)分配;第四遍掃描做代碼生成。 綜上所示,大多數(shù)的編譯程序直接產(chǎn)生機(jī)器語言的目標(biāo)代碼,形成可執(zhí)行的目標(biāo)文件,但也有的編譯程序則先產(chǎn)生匯編語言一級(jí)的符號(hào)代碼文件,然后再調(diào)用匯編程序進(jìn)行翻譯加工處理,最后產(chǎn)生可執(zhí)行的機(jī)器語言目標(biāo)文件。 PYTHON是一種腳本語言,是解釋執(zhí)行的,不需要經(jīng)過編譯,能夠很好地實(shí)現(xiàn)跨平臺(tái),適用于一些小工具小程序的開發(fā)。相比之下,C+則是一種編譯后運(yùn)行的語言,在特定的機(jī)器上編譯后在特定的機(jī)器上運(yùn)行,運(yùn)行效率高,安全穩(wěn)定,但編譯后的C+程序一般是不跨平臺(tái)的。 在我看來,學(xué)習(xí)一種編程語言不能根據(jù)現(xiàn)在的熱度,而是要根據(jù)它在某個(gè)領(lǐng)域的作用

9、。就像匯編、VB,雖然現(xiàn)在似乎不能順應(yīng)時(shí)代的發(fā)展潮流,但是它在某些行業(yè)內(nèi)還是有出色的一面。就目前而言,隨著人工智能的發(fā)展,python漸漸成為潮流,在我看來,python確實(shí)非常強(qiáng)大,但在三五年內(nèi),不會(huì)作為一種主流的編程語言。例如在Windows程序開發(fā)領(lǐng)域內(nèi),還是C#、C+獨(dú)占鰲頭。我們不能盲目的夸贊一門編程語言而去貶低其他的編程語言,正所謂存在即合理,我們應(yīng)該客觀、辨證的看待這些編程語言并學(xué)會(huì)認(rèn)真的學(xué)好程序設(shè)計(jì)原理,便于今后的發(fā)展順應(yīng)社會(huì)的潮流。簡而言之,在實(shí)際應(yīng)用中,對于需要經(jīng)常使用的有大量計(jì)算的大型題目,采用速度較快的編譯型的高級(jí)語言較好,如C+,雖然編譯過程本身較為復(fù)雜,但一旦形成目

10、標(biāo)文件,以后可多次使用。相反,對于小型題目或計(jì)算簡單不太費(fèi)機(jī)時(shí)的題目,則多選用解釋型的高級(jí)語言,如python,這樣可以大大縮短編程及調(diào)試的時(shí)間,提高工作效率,節(jié)省時(shí)間的同時(shí)體驗(yàn)編程的樂趣。這里不得不說咱們礦大的課程安排甚是合理,讓我們學(xué)生一開始就學(xué)習(xí)了C+,這為我們學(xué)習(xí)其他語言打下了堅(jiān)實(shí)的基礎(chǔ),感覺分分鐘就能上手任意一門其他的編程的語言。接下來將從類的角度比較python和C+的不同:(1)關(guān)于構(gòu)建類的語法方面:C+構(gòu)建類的例子:class XZQpublic: int num; void test() std:cout << num << endl;XZQ a;a.

11、num = 20;a.test();輸出結(jié)果為20,簡單的分析程序:A類只有一個(gè)數(shù)據(jù)成員num和一個(gè)test函數(shù)用于輸出num的值。 深層次的分析:當(dāng)我們以實(shí)例對象XZQ調(diào)用test成員函數(shù)的時(shí)候,這個(gè)函數(shù)內(nèi)部是通過this指針找到num,也就是說當(dāng)執(zhí)行test這段函數(shù)的代碼的時(shí)候通過this指針找到這個(gè)和a對象綁定的num。c+的編譯器會(huì)將上述的代碼加工出現(xiàn)以下的半成品:class XZQpublic: int num; void test(this) std:cout << this->num << endl;XZQ a;a.num = 100;a.test(

12、&a);C+編譯器會(huì)將默認(rèn)的this指針當(dāng)做非靜態(tài)成員函數(shù)的一個(gè)默認(rèn)的參數(shù),幫我們添加上去,在使用對象調(diào)用的時(shí)候?qū)ο蟮牡刂穫鬟f進(jìn)去,在成員函數(shù)內(nèi)部對類內(nèi)部的成員都會(huì)添加上this->調(diào)用,這樣就很容易區(qū)分不同對象的調(diào)用訪問的是各自對象的空間的內(nèi)容。C+ 的編譯器幫助我們完成this指針的傳參,添加修飾的工作,不需要我們?nèi)?。關(guān)于這一點(diǎn),在之前的C+課程上講的特別清楚。Python構(gòu)建類的例子:如果按照c+的方式將得到以下的代碼:class XZQ: num = 20 def test(): print(num)a = XZQ()a.test()毫無疑問,這種C+式的python

13、代碼肯定會(huì)報(bào)錯(cuò),首先一個(gè)問題就是在方法的調(diào)用上出錯(cuò)。執(zhí)行報(bào)錯(cuò)會(huì)顯示,test()實(shí)際上是沒有參數(shù)的但是我們傳遞給他了1個(gè)參數(shù)。這是為什么?原因在于如果你是采用對象. python的調(diào)用對象的方法會(huì)像c+一樣幫你傳入一個(gè)標(biāo)識(shí)是哪個(gè)對象調(diào)用的變量叫做self類似于C+的this指針,這個(gè)self是當(dāng)前對象a的引用,也就是指向a所指向的內(nèi)存空間上的那個(gè)對象。但是,python和C+畢竟語法上有些差異,如果上面這段代碼在定義test函數(shù)的時(shí)候就沒有給test寫上self參數(shù),雖然python編譯器幫助我們在調(diào)用的時(shí)候傳入引用給self但是并沒有在定義的時(shí)候幫助我們添加這個(gè)參數(shù),導(dǎo)致最終出錯(cuò)。class

14、 XZQ: num = 20 def test(self): print(self.num)a = XZQ()a.test()輸出結(jié)果為20。綜上所述,除了在實(shí)際語法形式上存在不同之外,python和c+在類對象調(diào)用方法上都是采用傳入實(shí)例對象的指針或者引用的方式區(qū)分不同的調(diào)用對象的。在對類的操作中還有python和C+還有一個(gè)比較有意思的不同點(diǎn):參考以下代碼:class Test(object):num = 10def print(self): print(num)t = Test()num = 20t.print()在python中的輸出結(jié)果是20。若是以C+的觀念來判斷的話,應(yīng)該輸出10。

15、首先這個(gè)num是沒有加self.修飾的這個(gè)num就不是指類Test當(dāng)中定義的那個(gè)num,所以當(dāng)對象t調(diào)用print方法的時(shí)候,雖然將t的引用傳給了self,但是此時(shí)在函數(shù)的內(nèi)部是沒辦法精確找到這個(gè)num的,因?yàn)檫@個(gè)num在函數(shù)內(nèi)部是沒有被定義的。Python還有訪問引用的特點(diǎn):(1)直接引用:直接使用引用的名字進(jìn)行訪問,Python按照搜索LEGB作用域的方式搜索名字。(2)間接訪問:使用對象名.屬性名的方式引用名字類中的屬性,Python不搜索作用域,直接去對象里找屬性。簡單分析:num是往函數(shù)外層的嵌套作用域去尋找這個(gè)變量的定義自然就在全局區(qū)域找到這個(gè)num,所以輸出的是20。Python

16、和C+的方法和函數(shù)的概念完全不一樣的。C+類的成員函數(shù)分為靜態(tài)成員函數(shù)和普通成員函數(shù)。通過類名可以直接訪問靜態(tài)的成員,但是不能訪問普通的成員和函數(shù),普通的函數(shù)和成員是屬于對象的需要this指針才能調(diào)用。相比于C+,對于python,是沒有靜態(tài)非靜態(tài)的概念的,python的類當(dāng)中定義的函數(shù),通過實(shí)例調(diào)用就是實(shí)例的方法,通過類名調(diào)用就是一個(gè)函數(shù)。函數(shù)和方法不是一個(gè)類型。方法是被實(shí)例對象調(diào)用的,會(huì)被默認(rèn)傳入一個(gè)對象本身的引用給self參數(shù),而通過類名調(diào)用的是從屬于類的函數(shù)對象,這個(gè)函數(shù)在被調(diào)用的時(shí)候需要顯示的傳入實(shí)例對象作為參數(shù)。這兩種調(diào)用的方式產(chǎn)生的結(jié)果是一樣的。在python中,一切都是對象,p

17、ython當(dāng)中的類就是一個(gè)抽象對象,描述整個(gè)類的抽象信息,所以類本身也是對象;而在C+中,類就是一段抽象的代碼段,類是一個(gè)作用域,通過這個(gè)作用域只能訪問到靜態(tài)的信息。在C+中,存在構(gòu)造函數(shù)、析構(gòu)函數(shù),C+編譯器會(huì)給類自動(dòng)添加默認(rèn)的無參構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)等等;在python中并沒有構(gòu)造函數(shù)析構(gòu)函數(shù),但是python有一個(gè)默認(rèn)的初始化方法_init_(),默認(rèn)python會(huì)提供一個(gè)無參的_init_()方法,但是我們可以改寫這個(gè)方法,定義自己的方法,添加參數(shù)進(jìn)行合理的初始化。python沒有重載的概念,一個(gè)變量名只能引用一個(gè)對象;而C+從理論上可以無限制的重寫重載函數(shù)。Python_init_

18、()方法的調(diào)用和C+調(diào)用構(gòu)造函數(shù)都是在實(shí)例化對象的時(shí)候通過類的名字調(diào)用的。關(guān)于類的繼承的不同用法在python和C+的比較python的繼承語法如下:class DerivedClassName(BaseClassName): <statement-1> <statement-N>BaseClassName 的定義對于派生類而言必須是可見的.python的繼承有幾個(gè)特點(diǎn)語法上和c+略有不同,相同點(diǎn)在于調(diào)用在派生類對象的方法的時(shí)候都是先看派生類本身有沒有定義,如果沒有就去父類找。 Python 支持多重繼承,這點(diǎn)跟C+是極度相似的,Java不支持多繼承,所以不知道多繼承到

19、底是好是壞。Python中的多繼承的語法如下:class DerivedClassName(Base1, Base2, Base3): <statement-1> <statement-N>Python當(dāng)中所有的類都是從object派生的,C+是沒有這樣的一種概念的因?yàn)镃+并不是一個(gè)純面向?qū)ο蟮恼Z言,它是從C語言發(fā)展過來的,而C語言是面向過程的編程語言。在這一點(diǎn)上,python和Java是非常類似的,都是通過一個(gè)所有類的基類來抽象出所有類的抽象信息方便用戶使用也方便實(shí)現(xiàn)一些高級(jí)的機(jī)制。這樣的機(jī)制也使得python需要給每個(gè)對象付出額外的空間去保存這些信息同時(shí)也使得執(zhí)行的效率降低。Python和C+對類的訪問和控制的區(qū)別:C+可以通過public、private、protected 這樣的訪問控制關(guān)鍵字來限定成員的訪問權(quán)限。而Python當(dāng)中并沒有這樣的限定,并不存在那種無法訪問的私有的變量,但是python當(dāng)中有一個(gè)約定:以一個(gè)下劃線帶頭的名字(如 _spam) 應(yīng)該作為非公共的 API (不管是函數(shù), 方法或者數(shù)據(jù)成員)。這應(yīng)該作為具體的實(shí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論