1. 程式人生 > 程式設計 >Python動態強型別解釋型語言原理解析

Python動態強型別解釋型語言原理解析

PYTHON是一門動態解釋性的強型別定義語言:編寫時無需定義變數型別;執行時變數型別強制固定;無需編譯,在直譯器環境直接執行。

動態和靜態

靜態語言:是指在編譯時變數的資料型別即可確定的語言,多數靜態型別語言要求在使用變數之前必須宣告資料型別。例如:C++、Java、Delphi、C# 、go等。

動態語言:是在執行時確定資料型別的語言。變數使用之前不需要型別宣告,通常變數的型別是被賦值的那個值的型別。例如:Python、Ruby、Perl等。

強型別和弱型別

強型別和弱型別主要是站在變數型別處理的角度進行分類的。

強型別是指不允許隱式變數型別轉換,弱型別則允許隱式型別轉換。

所以,關鍵在於變數資料型別的轉換。

什麼叫隱式型別轉換?

隱式是指原始碼中沒有明顯的型別轉換程式碼,也就是說,一個變數,你可以直接給他賦值字串,也可以直接給他賦值數值,你還可以直接讓字串型別的變數和數值型別的變數相加,雖然得出的最終結果未必是你想象的那樣,但一定不會報錯。

這就是隱式型別轉換,弱型別語言,如javascript、php。

Java是強型別語言,不允許隱式型別轉換,也就是說,如果你需要拿一個字串變數當做整型來用,你必須顯式地將變數型別轉換好。

換句話說:

  • 強型別語言,當你定義一個變數是某個型別,如果不經過程式碼顯式轉換(強制轉化)過,它就永遠都是這個型別,如果把它當做其他型別來用,就會報錯
  • 弱型別語言,你想把這個變數當做什麼型別來用,就當做什麼型別來用,語言的解析器會自動(隱式)轉換。

優點:

Python的定位是“優雅”、“明確”、“簡單”,所以Python程式看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常複雜的程式。

開發效率非常高,Python有非常強大的第三方庫,基本上你想通過計算機實現任何功能,Python官方庫裡都有相應的模組進行支援,直接下載呼叫後,在基礎庫的基礎上再進行開發,大大降低開發週期,避免重複造輪子。

  • 高階語言————當你用Python語言編寫程式的時候,你無需考慮諸如如何管理你的程式使用的記憶體一類的底層細節
  • 可移植性————由於它的開源本質,Python已經被移植在許多平臺上(經過改動使它能夠工 作在不同平臺上)。如果你小心地避免使用依賴於系統的特性,那麼你的所有Python程式無需修改就幾乎可以在市場上所有的系統平臺上執行
  • 可擴充套件性————如果你需要你的一段關鍵程式碼執行得更快或者希望某些演算法不公開,你可以把你的部分程式用C或C++編寫,然後在你的Python程式中使用它們。
  • 可嵌入性————你可以把Python嵌入你的C/C++程式,從而向你的程式使用者提供指令碼功能。

缺點:  

速度慢,Python 的執行速度相比C語言確實慢很多,跟JAVA相比也要慢一些,因此這也是很多所謂的大牛不屑於使用Python的主要原因,但其實這裡所指的執行速度慢在大多數情況下使用者是無法直接感知到的,必須藉助測試工具才能體現出來,比如你用C運一個程式花了0.01s,用Python是0.1s,這樣C語言直接比Python快了10倍,算是非常誇張了,但是你是無法直接通過肉眼感知的,因為一個正常人所能感知的時間最小單位是0.15-0.4s左右,哈哈。其實在大多數情況下Python已經完全可以滿足你對程式速度的要求,除非你要寫對速度要求極高的搜尋引擎等,這種情況下,當然還是建議你用C去實現的。

程式碼不能加密,因為PYTHON是解釋性語言,它的原始碼都是以名文形式存放的,不過我不認為這算是一個缺點,如果你的專案要求原始碼必須是加密的,那你一開始就不應該用Python來去實現。

執行緒不能利用多CPU問題,這是Python被人詬病最多的一個缺點,GIL即全域性直譯器鎖(Global Interpreter Lock),是計算機程式設計語言直譯器用於同步執行緒的工具,使得任何時刻僅有一個執行緒在執行,Python的執行緒是作業系統的原生執行緒。在Linux上為pthread,在Windows上為Win thread,完全由作業系統排程執行緒的執行。一個python直譯器程序內有一條主執行緒,以及多條使用者程式的執行執行緒。即使在多核CPU平臺上,由於GIL的存在,所以禁止多執行緒的並行執行。關於這個問題的折衷解決方法,我們在以後執行緒和程序章節裡再進行詳細探討。

  • 編譯型語言:把做好的源程式全部編譯成二進位制程式碼的可執行程式。然後,可直接執行這個程式。
  • 解釋型語言:把做好的源程式翻譯一句,然後執行一句,直至結束!

區別:

  • 編譯型語言,執行速度快、效率高;依靠編譯器、跨平臺性差些。
  • 解釋型語言,執行速度慢、效率低;依靠直譯器、跨平臺性好。

個人認為,java是解釋型的語言,因為雖然java也需要編譯,編譯成.class檔案,但是並不是機器可以識別的語言,而是位元組碼,最終還是需要 jvm的解釋,才能在各個平臺執行,這同時也是java跨平臺的原因。所以可是說java即是編譯型的,也是解釋型,但是假如非要歸類的話,從概念上的定義,恐怕java應該歸到解釋型的語言中。
附:

  • 編譯型的語言包括:C、C++、Delphi、Pascal、Fortran
  • 解釋型的語言包括:Java、Basic、javascript

編譯型語言要先編譯再執行,而解釋性語言直接“執行”原始碼。

Python是種強型別的語言。

有人可能會問,在python中,可以這樣寫而不報錯,所以是弱型別的:

i=1
print(i)
i="hello world"
print(i)

實際上,這裡python表現出的特性為,他是一種動態型別語言。動態型別語言是一種在執行期間才去確定資料型別的語言,與靜態型別相反。

VBScript 和 Python 是動態型別的,因為它們確定一個變數的型別是在您第一次給它賦值的時候。靜態型別語言是一種在編譯期間就確定資料型別的語言。大多數靜態型別語言是通過要求在使用任一變數之前宣告其資料型別來保證這一點的。Java 和 C 是靜態型別語言。

Python 是強制型別定義的。指的是加入我們有一個整數,如果不明確地進行轉換 ,不能將把它當成一個字串,所以顯然,C/C++和Java都是強型別語言。 弱型別語言與強型別相反。VBScript 是弱型別的。在 VBScript 中,我們可以將字串 '12' 和整數 3 進行連線得到字串'123',然後可以把它看成整數 123 ,所有這些都不需要任何的顯示轉換。

總結起來,Python是一種動態的,強型別語言。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。