Python介紹
Python是一種跨平臺的計算機程序設計語言。是一種面向對象的動態類型語言,最初被設計用于編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多被用于獨立的、大型項目的開發。python的創始人為荷蘭人,吉多-范羅蘇姆(Guido van Rossum)。最初python被作為ABC語言的一種繼承。ABC是由Guido參加設計的一種教學語言。Guido認為,ABC這種語言非常優美和強大,是專門為非專業程序員設計的。但是ABC語言并沒有成功,Guido認為是其非開放造成的,于是決心在python中避免這個錯誤。同時,他還想實現在ABC中閃現過但未曾實現的東西。
Python在Guido手中誕生了,可以說,python是從ABC發展起來的,主要受到了Modula-3(另一種相當優美且強大的語言,為小型團體所設計的)的影響。并且結合了Unix shell和C的習慣。
由于python語言的簡潔性、易讀性以及可擴展性,在國外用python做科學計算的研究機構日益增多,一些知名大學已經采用Python來教授程序設計課程。比如卡耐基梅隆大學的編程基礎、麻省理工學院的計算機科學及編程導論就使用python語言講授。眾多開源的科學計算軟件包都提供了python的調用接口。例如著名的計算機視覺庫OpenCV、三維可視化庫VTK、醫學圖像處理庫ITK。而python專用的科學計算擴展庫就更多了,例如這3個經典的科學計算擴展庫:NumPy、SciPy和matplotlib,它們分別為python提供了快速數組處理、數值運算以及繪圖功能。因此python語言極其眾多的擴展庫所構成的開發環境十分適合工程技術、科研人員處理實驗數據、制作圖表,甚至開發科學計算應用程序。
Python特點
1.使用縮進,規范編碼習慣
Python在設計上堅持了清晰劃一的風格,這使得python成為一門易讀、易維護,并且被大量用戶所歡迎的、用途廣泛的語言。python的作者有意的設計限制性很強的語言,使得不好的編程習慣都不能通過編譯。其中很重要的一項就是python的縮進規則。通過強制程序員們縮進,python確實使得程序更加清晰和美觀。
2. 設計哲學:優雅、明確、簡單
Python開發者的哲學是“用一種方法,最好是只有一種方法來做一件事”。在設計python語言時,如果面臨多種選擇,python開發者一般都會拒絕花哨的做法,而選擇明確的沒有或者很少有歧義的語法。由于這種設計觀念的差異,python源代碼通常被認為比Perl具備更好的可讀性,并且能夠支撐大規模的軟件開發。這些準則被稱為python格言。在python解釋器內運行import this 可以獲得完整的列表。
3. Python是完全面向對象的語言
函數、模塊、數字、字符串都是對象。并且完全支持繼承、重載、派生、多繼承。有益于增強源代碼的復用性。python支持重載運算符和動態類型。相對于Lisp這種傳統的函數式編程語言,python對函數式設計只提供了有限的支持。有兩個標準庫(functools,itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
4. 可擴展性
Python本身被設計為可擴充的。并非所有的特性和功能都集成到語言核心。python提供了豐富的API和工具,以便程序員能夠輕松地使用C語言、C++、Cython來編寫擴充模塊。python編譯器本身也可以被集成到其它需要腳本語言的程序內。因此,很多人還把python作為一種“膠水語言”使用。使用python將其他語言編寫的程序進行集成和封裝。在Google內部的很多項目,例如Google Engine使用C++編寫性能要求極高的部分,然后用python或java/Go調用相應的模塊。
Python用途
Python是一種解釋型腳本語言,可以應用于:
Web和internet開發
科學計算和統計
人工智能
教育
桌面界面開發
軟件開發
后端開發
執行
Python在執行時,首先會將.py文件中的源代碼編譯成Python的byte code(字節碼),然后再由Python Virtual Machine(Python虛擬機)來執行這些編譯好的byte code。這種機制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。這里的高級并不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強大,而是說和Java 或.NET相比,Python的Virtual Machine距離真實機器的距離更遠。或者可以這么說,Python的Virtual Machine是一種抽象層次更高的Virtual Machine。基于C的Python編譯出的字節碼文件,通常是.pyc格式。除此之外,Python還可以以交互模式運行,比如主流操作系統Unix/Linux、Mac、Windows都可以直接在命令模式下直接運行Python交互環境。直接下達操作指令即可實現交互操作。
python編譯器與解釋器
一、數據的表示方式
數字的表示方式有很多種,常見的有二進制、八進制、十進制和十六進制。十進制我們都很熟悉。因為我們人有10個手指頭,我們對十進制有著天然的友好度。
對于計算機,則是使用二進制。因為計算機最小的計算單元是根據開關狀態高低電平來確定的,它只有開和關,高和低的概念,換成數學就是0和1的兩種。同樣的,在物理存儲方面,硬盤的磁道只能區分打孔和未打孔的狀態,也就是0和1兩種。同事二進制便于進行加減運算和計數編碼。二進制與十進制數易于互相轉換。二進制便于邏輯判斷(是或非),邏輯判斷通常也是兩種狀態,這和二進制很搭配。二進制表示數據還具有抗干擾能力強,可靠性高的特點,因為當受到一定程度的電磁干擾時,只要可以分辨出它是高電平還是低電平,至于高多少或低多少并不重要,就能區分0和1,這在網絡信號匯總,就是天生自帶抗干擾能力。
但是在人際交流上,二進制有致命的弱點,數字的書寫特別冗長,并且沒有人類可讀性!至于英語、函數對計算機而言更是天書。那么我們是怎么和計算機交流的呢?怎么將我們的英語或者漢語編碼成計算機能夠識別的二進制呢?
二、編程語言發展歷程
1. 打孔紙條
我們已經知道了計算機只讀懂機器語言,也就是二進制的數據表示方式,任何對它的操作和編碼,最終都要統一到這上面來,然后這是一個悲傷的故事。
起初,為了讓計算機按我們的想法工作,程序員不得不編寫計算機可以讀懂看明白執行的機器碼,也就是01010101的樣子,打孔字條就是這么干的。用打沒打孔來代表0和1。這樣雖然計算機可以無障礙閱讀,但是程序員就難受了,容易出錯、效率低、編寫困難、維護困難,可能就是個簡單的打印“hello world”就需要好幾米長的字條。這是根本無法進行下去的。
2. 匯編語言
匯編語言時一種可編輯器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數的地址。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令。也就是數據說不同平臺之間不可直接移植,它是平臺相關的,在這個硬件平臺寫的匯編程序,到另一套硬件上去是運行不了的。因為匯編語言通常被應用在底層,硬件操作和高要求的程序優化的場合。驅動程序、嵌入式操作系統和實時運行程序較多使用匯編語言。相比于機器碼,它更偏向人類的語言習慣,更易于編寫和閱讀,也就是有一點抽象符號概念化了,這大大提高了編程效率。但是,這依然是一種低級語言,還有改善和提高的空間。
3. C語言
在C語言之前其實還有很多低級語言,我們不關心它們。為了讓編程更簡單,更搞笑,聰明的計算機程序員,一步步發明了FORTRAN、BASIC、B等許多語言,然后在1972年誕生了無人不知,應用最廣,影響最深,至今仍然地位不可動搖的C語言。
C語言為什么這么厲害?歸根結底是一句話:直接操作硬件!同樣的算法,用C語言,其執行效率超過JAVA等語言很多。那可能有人會問,C和匯編和機器碼比呢?肯定是C慢,但是寫個匯編程序和寫個C程序的效率差別那就更大了。C語言在人類友好性和底層相關性上達到了一個高度的平衡。這兩者是互相矛盾的,不可同時兼得的。
C干了些什么?其實它就是在人類友好性方面相比以前跨出了更大一步。人類是方便了,可機器就迷糊了!你給我這么多字符都是啥意思?機器它只懂二級制啊!難么C的代碼是如何被執行的呢?這就得請出編譯器了!
編譯器將編程語言寫的代碼翻譯成機器能夠執行或者說“看懂”的二級制機器碼。
其實我們安裝JAVA也好,C也好,Python也罷,主要就是安裝這個編程語言的“編譯器”。
4. Python語言
在幾十年前,C語言時當之無愧的高級語言帶邊,現在也依然是語言排行榜第二的霸主。然后,在很多領域,它已經不太實用了,現今更主流的語言是那些上手快、簡單易懂,說白了就是門檻低的語言,讓更多的人能進入程序員行業,讓編程能更容易、更快是未來的發展趨勢。也就是說,需要進一步讓編程語言更貼近人類語言,更遠離機器語言。
三、編譯器與解釋器
編譯器/解釋器:高級語言與機器之間的翻譯官
都是將代碼翻譯成機器可以執行的二進制機器碼,只不過在運行原理和翻譯過程有不同而已。用一個通俗的例子進行比喻:我們去飯館吃飯,點了八菜一湯。編譯器的方式就是廚師把所有的菜給你全做好了,一起給你端上來,至于你在哪吃,怎么吃,隨便。解釋器的方式就是廚師做好一個菜給你上一個菜,你就吃這個菜,而且必須在飯店里吃。
1. 編譯器:先整體編譯在執行
編譯方式:運行速度快,但任何一個小改動都需要整體重新編譯。可脫離編譯環境運行。代表語言是C語言。
2. 解釋器:邊解釋邊執行
解釋方式:運行速度慢,但部分改動不需要整體重新編譯,不可脫離解釋器環境運行。代表語言是Python語言。
四、Python解釋器種類
Python有好幾種版本的解釋器:
CPython
官方版本的解釋器。這個解釋器是用C語言開發的,所以叫CPython。CPython是使用最廣的Python解釋器。我們通常說的、下載的、討論的、使用的都是這個解釋器。
IPython
基于CPython之上的一個交互式解釋器,在交互方式上有所增強,執行Python代碼的功能和CPython是完全一樣的。CPython用>>>作為提示符,而IPython用In[序號]:作為提示符。
PyPy
一個追求執行速度的Python解釋器。采用JIT技術,對Python代碼進行動態編譯(注意:不是解釋),可以顯著提高python代碼的執行速度。絕大部分的CPython代碼都可以在PyPy下運行,但還是有一些不同,這就導致相同的python代碼在兩種解釋器下執行可能會有不同的結果。
Jython
運行在java平臺上的Python解釋器,可以直接把python代碼編程Java字節碼執行。
IronPython
和Jython類似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,可以直接把Python代碼編譯成.Net的字節碼。
五、Python的運行機制
Python作為動態解釋性語言,其運行機制可參考下圖(圖片來自網絡,其中的“編譯器”是對解釋器的廣義稱呼):
都說解釋器慢,python也有想辦法提高一下運行速度,那就是使用pyc文件。這點參考了JAVA的字節碼做法,但并不完全雷同。
我們編寫的代碼一般都會保存在以.py為后綴的文件中。在執行程序時,解釋器逐行讀取源代碼并逐行解釋運行。每執行一次,就重復一次這個過程,這其中耗費了大量的重復性的解釋工作。為了減少這一重復性的解釋工作,python引入了pyc文件,pyc文件是將py文件的解釋結果保存下來的文件,這樣,下次再運行的時候就不用解釋了,直接使用pyc文件就可以了,這大大提高了程序運行速度。
對于pyc文件,必須知道一下幾點:
對于當前調用的主程序不會生成pyc文件;
以import xxx 或 from xxx import xxx等方式導入主程序的模塊才會生成pyc文件;
每次使用pyc文件時,都會根據pyc文件的創建時間和源模塊進行對比,如果源模塊有修改,則重新創建pyc文件,并覆蓋先前的pyc文件,如果沒有修改,直接使用pyc文件代替模塊;
Pyc文件統一保存在模塊所在目錄的pycache文件夾內。
如下圖所示,module_a被module_main導入后會生成對應的pyc文件,但是modul_main不會生成pyc文件!