Python早期設計與開發 從ABC到Python

2021-09-16 13:13:38 字數 1904 閱讀 7609

本系列文章譯自python之父 guido van rossum 的系列部落格「the history of python」。這個部落格系列對我們理解python及其演變很有幫助,經guido同意,在這裡翻譯推薦給大家,希望大家喜歡,也請大家多多指教!

python最初的、也是最主要的影響來自abc,一門由 cwi 設計於上世紀80年代初的程式語言(譯註:見之前的博文)。abc最初的目標是替代basic,成為一門教學語言,並成為針對個人使用者的程式語言與程式設計環境。abc的設計,立足於對使用者程式設計行為的分析,之後根據使用者測試的情況,發布了幾個迭代版本。當時,我主要負責與整合程式設計環境(ide)的對接。

python對縮排的使用,就是直接借鑑於abc。不過,使用縮排並不是abc的發明——經由 donald knuth 的倡導,縮排在那時已經是一種眾所周知的程式設計風格了(occam語言也使用了縮排風格)。

python的主要資料型別也都來自abc,只是作了一些調整。

abc中的列表實際上是多重集,通過b樹結構,保持列表中的資料是有序的。而abc中的表,鍵值也是有序的。我認為這兩種資料結構都不適合表現一些非常常用的資料,比如從檔案中讀取的文字行。(在abc中,讀取文字行必須使用表結構,並把行數作為鍵值,但這樣的話,插入和刪除行就會變得很複雜。)因此,我把列表改為無序的,並可以自由插入和刪除,從而方便使用者控制其序列。有需要時,也可以呼叫方法進行排序。

同時,我也用雜湊表替代了abc中的有序表。相對於b樹來說,我認為雜湊表更快,也更容易實現。理論上說,b樹結構中的許多操作,在空間和時間複雜度上都是線性的,但在實際應用中,實現起來很困難,因為b樹的演算法本身比較複雜。而當表的規模比較小時,b樹的效率更低。

python 元組的封裝與拆包操作其實是從abc照搬過來的。不過元組內部實際上就是乙個陣列,因此我增加了索引和切片操作。

因為給元組增加了類似於陣列的介面,我不得不考慮空元組或只有乙個元素的元組要怎麼表達的問題。作為從abc借鑑過來的原則之一:任何一種資料型別,在列印、或者轉換為字串的時候,都應該讓解析器能正常解析。同時我又得把只有乙個元素的元組和帶括號的引數區分開來。因此只得採取一種醜陋但務實的方式:如果元組只有乙個元素,需要在元素後加乙個逗號,如果是空元組,就用「()」表示。事實上,元組一般是不需要括號的,只有在空元組的時候必須用括號——我感覺如果用完全的「空(nothing)」表示空元組,可能很容易與大家的其它語法錯誤混淆起來。

python 中的字串和 abc 中的字串一樣,都是不可變型別,但用了不同的符號,索引也改為從0開始。主要是因為 python 中已經有三種可索引型別:列表、元組和字串,它們的索引方式還是要統一為好,這樣,一些核心方法才能保持一致,比如獲取長度(len(s))、通過索引取值(s[i])、切片(s[i:j]),以及迭代(for i in s)等。

python 和 abc 最大的不同在數字型別。abc 在執行時有兩種數字型別,一種是精確數字,即任意精度有理數,一種是約略數字,即指定範圍的二進位制浮點數。這個有理數實在是槽點滿滿。(吐槽:有次我用abc計算要交的稅,公式很簡單,但幾個數字就運算了很久。研究了下發現,它居然算到了小數點後幾千位,最後的結果卻只需要小數點後一兩位。)因此,在 python 中,我使用了傳統的數字模型,即系統位數的整型,以及系統位數的二進位制浮點型,底層實現上,直接用的 c 語言中的長整數(long)和雙精度浮點數(double)。

考慮到任意精度數字還是有很多重要的應用場景,我在 python 中增加了一種大數型別,叫做長整型(long)。數年前我給 abc 寫過類似的實現(abc最初的實現,也是我在abc團隊做的第一件事之一,底層用的是十進位制表示方式),因此,這裡就直接使用了現成的**。

雖然我在 python 中增加了大數型別,但還是應該強調,大多數場景中並不需要用到它。從我自己及我在cwi的同事所寫的 python **來看,大多數程式的運算時間中,很大部分都是整數運算,最常見的是計算記憶體索引。因此,我想,絕大多數情況下應該使用系統位數整型,大數型別只在少數情況下會用到,比如嚴謹的「數學」運算,或者以「分」為單位來計算美國國債的時候。

python 物件導向程式設計設計與開發

1 對不同型別的任務,所採取不同的解決問題的思路。2 程式設計正規化有兩種 1 面向過程程式設計 2 物件導向程式設計 什麼是面向過程程式設計?過程 解決問題的步驟 要解決乙個大的問題 1 先把大問題拆分成若干小問題或子過程。2 然後子過程再拆分成小問題或子過程 3 直到小問題可以在乙個小步驟的範圍...

從學習需求文件到設計開發

最近參與開發乙個新的專案,經理給我們調研好的需求文件,我們參考文件進行開發。由於剛參加工作,對實際的軟體開發過程不熟悉,但公司的管理流程又不是很規範,所以 遭遇了很多的困惑,一時不知如何去做。最後,嘗試著慢慢的把這個專案開發完成,這個過程 的痛苦。而然讀到溫伯格先生寫的 成為技術的領導者 一書,發現...

mysql設計與實現 mysql設計與開發

架構設計 表結構設計 索引sql語句 1.表結構設計的核心思想是什麼?容量評估,效能優化,硬體公升級,垂直拆分,水平拆分 2.有個大表為了乙個查詢 一天就查2次 領導要你建索引 索引空間大小有500g 你怎麼考慮,是建還是不建?建索引時要考慮哪些因素?3.執行計畫中有 filesort 就會進行磁碟...