編程語言主要從以下幾個角度為進行分類,編譯型和解釋型、靜態語言和動態語言、強類型定義語言和弱類型定義語言,每個分類代表什麼意思呢,我們一起來看一下。
2.1 編譯型與解釋型。
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.
這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)
編譯型
優點:編譯器一般會有預編譯的過程對代碼進行優化。因為編譯只做一次,運行時不需要編譯,所以編譯型語言的程序執行效率高。可以脫離語言環境獨立運行。
缺點:編譯之後如果需要修改就需要整個模塊重新編譯。編譯的時候根據對應的運行環境生成機器碼,不同的操作系統之間移植就會有問題,需要根據運行的操作系統環境編
解釋型
優點:有良好的平台兼容性,在任何環境中都可以運行,前提是安裝了解釋器(虛擬機)。靈活,修改代碼的時候直接修改就可以,可以快速部署,不用停機維護。
缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。
2.2動態語言和靜態語言
通常我們所說的動態語言、靜態語言是指動態類型語言和靜態類型語言。
(1)動態類型語言:動態類型語言是指在運行期間才去做數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變數指定數據類型,該語言會在你第一次賦值給變數時,在內部將數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言,其他的各種腳本語言如VBScript也多少屬於動態類型語言。
(2)靜態類型語言:靜態類型語言與動態類型語言剛好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明所有變數的數據類型,C/C++是靜態類型語言的典型代表,其他的靜態類型語言還有C#、JAVA等。
2.3強類型定義語言和弱類型定義語言
(1)強類型定義語言:強制數據類型定義的語言。也就是說,一旦一個變數被指定了某個數據類型,如果不經過強制轉換,那麼它就永遠是這個數據類型了。舉個例子:如果你定義了一個整型變數a,那麼程序根本不可能將a當作字元串類型處理。強類型定義語言是類型安全的語言。
(2)弱類型定義語言:數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變數可以賦不同數據類型的值。
強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。另外,"這門語言是不是動態語言」與"這門語言是否類型安全」之間是完全沒有聯系的!
例如:Python是動態語言,是強類型定義語言(類型安全的語言); VBScript是動態語言,是弱類型定義語言(類型不安全的語言); JAVA是靜態語言,是強類型定義語言(類型安全的語言)。
通過上面這些介紹,我們可以得出,python是一門動態解釋性的強類型定義語言。
⑵ python是一種什麼類型的編程語言
python是一種廣泛使用的具有動態語義的解釋型,面向對象的高級編程語言。
Python是一種面向對象的高級編程語言,具有集成的動態語義,主要用於Web和應用程序開發。它在快速應用程序開發領域極具吸引力,因為它提供動態類型和動態綁定選項。
Python是一種解釋型語言,這意味著用Python編寫的程序不需要事先編譯就可以運行,從而可以輕松地測試小段代碼並使用Python編寫的代碼更容易在平台之間移動。
Python相對簡單,因此它易於學習,因為它需要一種專注於可讀性的獨特語法。開發人員可以比其他語言更輕松地閱讀和翻譯Python代碼。反過來,這降圓櫻低了程序維塌粗護和開發的成本,因為它允許團隊協作工作而沒有重大的語言和經驗障礙。
Python支持使用模塊和包,這意味著程序可以以模塊化的方式設計,代碼可以在各種項目中重用。一旦您開發了所需的團腔鎮模塊或軟體包,就可以對其進行擴展以便在其他項目中使用,並且可以輕松導入或導出這些模塊。
⑶ Python之動態規劃演算法
動態規劃演算法中是將復雜問題遞歸分解為子問題,通過解決這些子問題來解決復雜問題。與遞歸演算法相比,動態編程減少了堆棧的使用,避免了重復的計算,效率得到顯著提升。
先來看一個簡單的例子,斐波那契數列.
斐波那契數列的定義如下。
斐波那契數列可以很容易地用遞歸演算法實現:
上述代碼,隨著n的增加,計算量呈指數級增長,演算法的時間復雜度是 。
採用動態規劃演算法,通過自下而上的計算數列的值,可以使演算法復雜度減小到 ,代碼如下。
下面我們再看一個復雜一些的例子。
這是小學奧數常見的硬幣問題: 已知有1分,2分,5分三種硬幣數量不限,用這些硬幣湊成為n分錢,那麼一共有多少種組合方法。
我們將硬幣的種類用列表 coins 定義;
將問題定義為一個二維數組 dp,dp[amt][j] 是使用 coins 中前 j+1 種硬幣( coins[0:j+1] )湊成總價amt的組合數。
例如: coins = [1,2,5]
dp[5][1] 就是使用前兩種硬幣 [1,2] 湊成總和為5的組合數。
對於所有的 dp[0][j] 來說,湊成總價為0的情況只有一種,就是所有的硬幣數量都為0。所以對於在有效范圍內任意的j,都有 dp[0][j] 為1。
對於 dp[amt][j] 的計算,也就是使用 coins[0:j+1] 硬幣總價amt的組合數,包含兩種情況計算:
1.當使用第j個硬幣時,有 dp[amt-coins[j]][j] 種情況,即amt減去第j個硬幣幣值,使用前j+1種硬幣的組合數;
2.當不使用第j個硬幣時,有 dp[amt][j-1] 種情況,即使用前j種硬幣湊成amt的組合數;
所以: dp[amt][j] = dp[amt - coins[j]][j]+dp[amt][j-1]
我們最終得到的結果是:dp[amount][-1]
上述分析省略了一些邊界情況。
有了上述的分析,代碼實現就比較簡單了。
動態規劃演算法代碼簡潔,執行效率高。但是與遞歸演算法相比,需要仔細考慮如何分解問題,動態規劃代碼與遞歸調用相比,較難理解。
我把遞歸演算法實現的代碼也附在下面。有興趣的朋友可以比較一下兩種演算法的時間復雜度有多大差別。
上述代碼在Python 3.7運行通過。
⑷ 關於python動態添加屬性和方法的意義
通過對象的實例,在外部為其添加屬性,這種做法應該是很少見的。原因很簡單:破壞封裝。雖然Python可以做到,但並不代表隨意使用這種做法是妥當的。
添加的屬性可以和原有的組合使用的,有回答已經給出了例子。
我覺得有必要提一下self或者說方法的第一個參數是什麼。
需要注意的是,通過實例為類屬性賦值[7],會「遮蓋」類屬性。即,賦值只是為實例的屬性賦值,而未改動類的屬性。需要改動類屬性的話,應該使用類名的方式。
感興趣的話可以查查Python的Mixin,這是通過動態繼承添加屬性和方法的做法。
⑸ 有人說python是動態解釋,開發效率高,為什麼
任何高級語言寫的程序一定要變成機器語言才能執行。
Python是解釋型語言,就是在執行的時候才變成機器語言。
開發效率高,通俗地說就是寫程序寫的快,但是運行效率不見得高。