Python貓注:Python 語言誕生 30 年了,如今的發展勢頭可謂如火如荼,這很大程度上得益于其易學易用的優秀設計,而不可否認的是,Python 從其它語言中偷師了不少,本文作者是一名資深的核心開發者,他廣博的視野和精準的認識,讓我對 Python 的設計了解得更為全面,同時,他“利用自豪感而非恐懼感”的說法,傳達出來的是“專注于自我的進步,不嫉妒他人的成功”的原則,對我也很有幫助,原文寫于 2015 年,躺在我的收藏夾里很久很久了,如今順利翻譯掉,這是一件能提升自豪感的有意義的事,最后祝大家開卷有益,讀有所獲,
作者:Nick Coghlan
譯者:豌豆花下貓@Python貓
英文:https://www.curiousefficiency.org/posts/2015/10/languages-to-improve-your-python.html
宣告:本翻譯是出于交流學習的目的,基于 CC BY-NC-SA 4.0 授權協議,為便于閱讀,內容略有改動,
目錄
- 拓寬我們的視野
- 程序式編程:C、Rust、Cython
- 面向物件的資料模型:Java、C#、Eiffel
- 面向物件的 C 派生:C++、D
- 面向陣列的資料處理:MATLAB/Octave、Julia
- 統計資料分析:R
- 計算管道建模:Haskell、Scala、Clojure、F#
- 事件驅動編程:JavaScript、Go、Erlang、Elixir
- 漸變型別:TypeScript
- 動態元編程:Hy、Ruby
- 務實問題解決:Lua、PHP、Perl
- 編程思維:Scratch、Logo
作為世界上最流行的編程語言之一的共同設計者,我經常看到一個令人沮喪的行為(在 Python 社區和其它社區):有影響力者試圖激發人們對“敗給”其它開源社區的恐懼,從而調動人們對社區作貢獻的積極性,(我自己偶爾也會犯這種錯誤,這讓我更容易發現其他人是否也落入了同樣的陷阱),
雖然學習其它編程語言社區的經驗是件好事,但基于恐懼的方法來激勵行動是有嚴重問題的,因為這會刺激本社區成員將其它社區的人視為爭奪開源貢獻者關注的敵人,而不是作為在更大挑戰中的潛在盟友(推動軟體開發藝術發展),這還會告訴那些喜歡其它語言的人,在一個把他們以及他們的同伴視為“敵對競爭對手”的社區里,他們是不受歡迎的,
事實上,我們希望有多種多樣的跨平臺的開源編程語言供選擇,因為編程語言是思考的首要工具——使我們能夠以明確的方式表達我們的想法,從而讓計算機也能夠理解,如果有人找到了一種適合大腦的語言,能夠解決眼前的問題,那就太好了,不管他們選擇的是哪種(些)語言,
因此,我對 Python 社區有三個具體的請求,以及一個較為寬泛的建議,首先,我的請求是:
- 如果我們要利用社區的本能來激勵行動,就應該避免利用恐懼感,而應該利用自豪感, 當我們將恐懼作為激勵因素時,就像在說“如果我們不做 X,就會失去開發者對 Python 的關注”,這等于是故意地在自由的開源貢獻者中創造悲觀的情緒,然而,依賴社區的自豪感就像在說“目前尚不清楚如何在 Python 中解決 X 問題,如果我們看看 Y 語言,就可以看到他們有一個非常好的方法來解決問題 X,我們可以吸收進 Python,以提供類似的舒適的用戶體驗,”積極的態度讓我們對自己的努力感到自豪,而不是貶低他人的努力,這有助于在 Python 社區內促成一種持續學習的文化,并促進與其它社區改善協作關系,共同發展,
- 克制對其它開源編程語言社區采取輕蔑的態度,尤其當這些社區授權人們解決自己的問題,而不是等待商業軟體供應商來解決問題, 世界上大多數重要的問題解決起來都是無利可圖的(因為受苦于這些問題的人并不富裕,而且無法左右機構基金的決定),所以我們應該鼓勵試圖解決這些問題的人,不管我們如何看待他們的技術選擇,
- **如果我們認識的人剛開始學習編程,并且他們選了一種我們不喜歡的語言,我們應該支持他們的選擇, **他們比我們更知道什么適合自己,適合我們的語言不一定適合他們,如果他們對自己最初的選擇感到了沮喪,甚至已經對學習編程變得沒有動力,此時再給他們推薦別的編程語言,這個建議還適用于那些在改善糟糕的網路安全狀況的人:我們在面對天生不安全的語言時,采取的方法是改進作業系統的沙箱功能,逐步學習有更好的本地安全屬性的語言,并改善現有語言的默認行為,而不是列舉為什么從程式安全性的角度來看,他們選擇的語言是一個糟糕的選擇,來迷惑初學者,(如果有人部署了由初學者撰寫的未經審核的軟體來處理安全敏感的任務,那就不是開發者的問題,而且部署者的問題,他們沒有對軟體的出處和安全屬性進行適當的盡職調查,)
我的寬泛的建議針對那些遇到了 Python 核心程式的限制,并因此希望探索 Python 中可用的“思考工具”的人,這個建議就是:
拓寬我們的視野
在開發 Python 核心程式的程序中,我們會做的一件事是查看其它語言中解決了我們正面臨的問題的特性,看看是否有辦法既吸收它們,又使 Python 代碼更易于閱讀和撰寫,這意味著學習其它專注于特定軟體開發風格的編程語言,可以幫助我們在使用 Python 時,提高對這種編程風格的理解,
為了提供幫助,我在下面列出了一些值得探索的領域,以及可能加深對這些領域的理解的語言,我盡可能鏈接了維基百科的頁面,而不是直接鏈接到語言的主頁,因為維基百科經常會提供有趣的歷史背景,當你為了教育目的學習一門新的編程語言,而不是直接用于實際應用時,這些背景值得去了解,
雖然我知道這些語言中的大部分(并且在開發生產系統時使用過幾種),但這份推薦清單中還包括我間接知道的語言(通常是通過閱讀教程和設計檔案,或者通過與我信任的人交談,以獲取對一門語言的優點與缺陷的洞察),
還有很多本應該放但沒有放進名單里的語言語言,所以下面羅列的僅是我感興趣的部分(例如,我主要感興趣的是 Linux、Android 和 Windows 的生態系統,所以我舍棄了 Apple 生態中的 Objective-C 和 Swift 語言,另外我也不熟悉 Processing 這種專注于藝術的編程語言,無法想象學習它們能教給 Python 開發者什么),
除了考慮一門語言可能教給你的東西,如果你想獲得一份更全面的清單,可以去查看 IEEE Spectrum 關于編程語言流行度和增長度的年度榜單,
程序式編程:C、Rust、Cython
Python 默認的執行模型是程序式的:從主模塊的頂部開始,逐條陳述句地執行,Python 對下面介紹的所有資料和編程建模方法的支持,都建立在這種程序式的執行模型上,
C 語言仍然是無可爭議的底層程序式編程的統治者,它是 Python 官方解釋器以及 Linux 作業系統內核的核心實作語言,作為一名軟體開發人員,學習 C 語言是更多地了解底層硬體的最好方法之一——C 語言經常被稱為“可移植的匯編語言”,對于任何新的 CPU 架構來說,第一個交叉編譯的應用程式將是 C 編譯器,
Rust 是一種相對較新的編程語言,由 Mozilla 創造,Rust 的目標是吸取整個行業在不使用 C 時遇到的所有教訓,設計一門能與 C 庫相互操作的新語言,提供底層的系統編程所需的對硬體用途的精確控制,但使用不同的編譯方法來進行資料建模和記憶體管理,從結構上消除許多困擾 C 程式的常見缺陷(如緩沖區溢位、指標重復釋放錯誤、空指標訪問和執行緒同步問題),經過培訓和早期的專業經驗,我是一名嵌入式系統工程師,而 Rust 是我見過的第一種看起來有潛力縮減當前由 C 語言和自定義匯編代碼所主導的生態位的新語言,
Cython 也是一種較底層的程序式語言,但與 C 和 Rust 等通用語言不同,Cython 專門用于撰寫 CPython 的擴展模塊,為了實作這一目標,Cython 被設計為 Python 的超集,允許程式員選擇何時支持純 Python 語法以獲得靈活性,何時支持 Cython 的語法擴展,以便生成在速度和記憶體效率方面能與原生 C 代碼相當的代碼,
學習這些語言,你可以加深在記憶體管理、演算法效率、二進制介面(ABI)兼容性、軟體可移植性、以及將源代碼轉換為運行系統等實踐方面的見解,
面向物件的資料模型:Java、C#、Eiffel
編程最主要做的事情之一是為現實世界建模,最流行的做法是提供原生的語法支持面向物件編程:對資料作結構化的分組,使用類方法操作那些資料結構,
Python 本身是經過精心設計的,無需先撰寫自己的類就可以使用面向物件的特性,并不是每種語言都采用這種方法——本小節中列出的語言都認為學習面向物件設計是使用該語言的必要條件,
在 20 世紀 90 年代中后期,Sun Microsystems 公司進行了一次大規模的市場推廣,Java 成為了許多高等院校中計算機科學入門課的默認語言,雖然如今在許多教學活動中,Java 已經被 Python 所取代,但它仍然是開發商用程式時最流行的語言之一,還有一些基于通用 JVM(Java 虛擬機)運行時的語言,例如 Python 的 Jython 實作,Android 系統的 Dalvik 和 ART 環境則是基于 Java 開放的 API 二次開發,
C# 在許多方面與 Java 相似,在 Sun 和微軟未能解決他們關于微軟的 Java 實作(即 J++)的業務差異之后,C# 成為了一種替代方案,像 Java 一樣,這是一門開發商用程式的流行語言,還有其它一些語言共享著 .NET CLR(公共語言運行時),包括 Python 的 IronPython 實作 (最早的 IronPython 1.0 的核心組件被提取成了與語言無關的 .NET 動態語言運行庫),在很長一段時間里,. NET 是一種專用于 Windows 的技術,而 mono 作為一種跨平臺的開源實作,但微軟在 2015 年初轉向了開源生態系統戰略,
與此清單中的大多數語言不同,我不推薦在日常作業中使用 Eiffel,但是,我依然推薦學習它,因為它教會了我許多關于良好的面向物件設計的知識,比如它認為“可驗證的正確性”是應用程式的設計目標,(學習 Eiffel 也讓我明白了為什么“可驗證的正確性”并不是大多數軟體開發時的設計目標,因為可驗證的正確軟體實在不能很好地處理模糊性,并且完全不適用于那些你不清晰相關的約束條件卻需要給自己留下足夠的回旋余地,以便能夠通過迭代開發找出更具體的細節的情況,)
學習這些語言,你可以深入了解繼承模型、契約式設計、類不變性(class invariant)、前置條件、后置條件、協方差、逆變、類方法決議順序、泛型編程以及其它適用于 Python 型別系統的概念,還有很多標準庫模塊和第三方框架使用這種“看得見的面向物件”的設計風格,比如 unittest 和 logging 模塊,以及 Django 框架中基于類的視圖,
面向物件的 C 派生:C++、D
CPython 運行環境可以被視為一個“帶有物件的 C”的編程環境——在其核心,CPython 使用 C 的方法實作面向物件編程,即定義 C 結構體來保存相關的資料,并將結構體的實體作為第一個引數傳遞給函式,然后對資料進行操作(這就是 CPython C API 中全能的 PyObject * 指標),這種設計模式對應到 Python 層面,就是實體方法的顯式 self 引數以及類方法的顯式 cls 引數,
C++ 的目標是保持與 C 語言源代碼的完全兼容,同時添加更高級的特性,例如支持原生的面向物件編程和基于模板的元編程,它是出了名的冗長和難以編程(盡管 2011 年對語言標準的更新解決了許多糟糕的問題),但它也是許多領域的編程首選,包括 3D 建模的圖形化引擎和跨平臺應用的開發框架(例如 Qt),
D 語言也很有趣,因為它與 C++ 的關系類似于 Rust 與 C 的關系:它的目標是保留 C++ 的大多數令人滿意的特性,同時也避免它的許多問題(如缺乏記憶體安全),不像 Rust,D 不是一種從頭開始設計的新編程語言——恰恰相反,D 是 C++ 的衍生物,雖然它不像 C++ 一樣是一個嚴格的 C 超集,但它遵循著一個設計原則,即任何落入 C 和 D 的共同子集的代碼,在兩種語言中必須要表現一致,
學習這些語言,你可以更深入地了解將高級語言的特性與底層 C 運行時模型相結合的復雜性,學習 C++,在 Python 中操作用 C++ 撰寫的庫和工具包時,也可能會有幫助,
面向陣列的資料處理:MATLAB/Octave、Julia
面向陣列的編程是為了支持數值編程模型:那些基于矩陣代數和相關數值方法的模型,
雖然 Python 的標準庫不直接支持這一點,但 Python 在設計時考慮了面向陣列的編程,并專門為第三方 NumPy 庫和類似的面向陣列的工具添加了一系列語法和語意特性,
在許多方面,Python 的科學技術堆疊 被作為商業 MATLAB 的替代方案,后者被廣泛用于科學和工程領域的建模、仿真和資料分析,GNU Octave 是一個開源的方案,目標是兼容 MATLAB 代碼的語法,允許人們對照這兩種面向陣列的編程方法,
Julia 是另一種相對較新的語言,重點關注面向陣列的編程和基于型別的函式多載,
學習這些語言,你可以了解 Python 的科學技術堆疊,以及有機會通過像 OpenCL 和 Nvidia 的 CUDA 這種技術來探索硬體層面的并行執行,并通過 Apache Spark 和專用于 Python 的 Blaze 來了解分布式資料處理,
統計資料分析:R
隨著對大型資料集的接觸越來越多,對靈活處理這些資料集的分析工具的需求也越來越大,R 編程語言就是這樣的工具,它特別關注統計性的資料分析和可視化,
學習 R 能會讓你深入了解 Python 在科學技術堆疊的統計分析能力,尤其是 pandas 資料處理庫和 seaborn 統計可視化庫,
計算管道建模:Haskell、Scala、Clojure、F#
面向物件的資料建模和面向陣列的資料處理主要關注靜態的資料,無論是以命名的屬性形成集合的形式,還是以結構化資料形成陣列的形式,
相比之下,函式式編程語言強調以計算流的形式對動態資料進行建模,即便只學習函式式編程的基本知識,也能極大地改進資料轉換操作的結構,即使在其它程序式、面向物件或面向陣列的程式中也是如此,
Haskell 是一種函式式編程語言,對 Python 的設計產生了重大影響,最顯著的是在 Python 2.0 中引入的串列推導式,
Scala 是一種(存疑的)JVM 函式式編程語言,加上 Java、Python 和 R,它們是 Apache Spark 資料分析平臺的四種主要編程語言,盡管 Scala 的設計偏重于函式式編程,但它的語法、資料模型和執行模型的設計也最大限度地降低 Java 程式員使用的門檻(因此所謂“存疑的”——其實是因為,Scala 最好被歸類為一門具有強函式式編程支持的面向物件編程語言),
Clojure 是另一種基于 JVM 的函式式編程語言,是 Lisp 的一種方言,它之所以出現在這份清單里,因為它是 Python 的 toolz 函式式編程工具包的靈感來源,
F# 不是我自己特別熟悉的語言,但它作為 .net CLR(公共語言運行時)推薦的函式式編程語言,所以還是值得關注,
學習這些語言,你可以深入了解 Python 自己的計算管道建模工具,包括容器推導式、生成器、生成器運算式、functools 和 itertools 標準庫,以及第三方的 Python 函式工具包,比如 toolz,
事件驅動編程:JavaScript、Go、Erlang、Elixir
計算管道是處理資料轉換和分析問題的一種極佳的方法,但許多問題需要程式作為持久性服務運行,等待事件發生,然后處理那些事件,在這類服務中,為了能夠同時容納多個用戶(或多個操作),通常必須要并發地處理多個事件,
JavaScript 最初是作為 Web 瀏覽器的事件處理語言而開發的,允許網站開發者在本地回應客戶端操作(如滑鼠點擊和按鍵敲擊)和事件(如網頁完成了渲染),所有現代瀏覽器都支持它,它與 HTML5 領域物件模型(DOM)一起,已經成為一種定義用戶界面外觀和行為的事實上的標準,
Go 是谷歌設計的一種用于創建高度可伸縮的 Web 服務的專用語言,并且已經被證明是一種非常適合開發命令列應用程式的語言,從編程語言設計的角度來看,Go 最有趣的方面是在其核心并發模型中使用了通信順序行程(Communicating Sequential Processes)概念,
Erlang 是由愛立信設計的專用語言,用于創建高度可靠的電話交換機以及類似的設備,它被用于開發出了流行的 RabbitMQ 訊息代理中間件,Erlang 使用 Actor 模型作為核心的并發原語,在執行執行緒之間傳遞訊息,而不是讓它們直接共享資料,雖然我從未用過 Erlang 編程,但我的第一份全職作業涉及一個基于 Actor 的 C++ 并發框架,而該框架由一名前愛立信工程師開發,另外,我自己也開發了一個這樣的框架,基于德州儀器(Texas Instrument)的輕量級 DSP/BIOS 運行時(現在的 TI-RTOS)里面的 TSK (Task)和 MBX (Mailbox)原語,
Elixir 出現在這份清單里,因為它被設計運行在 Erlang VM 上,提供了與 Erlang 相同的并發語意,同時還提供了一系列在語言層面上的特性,打造出一個更加全面的環境,更有可能吸引其它語言例如 Python、Java 或 Ruby 的開發者,
學習這些語言,你可以深入了解 Python 對并發和并行的支持,包括原生協程、基于生成器的協程、concurrent.futures 和 asyncio 標準庫模塊、第三方網路服務開發框架(如 twisted 和 Tornado)、Django 中引入的 channel 概念、GUI 框架中的事件處理回圈,Python進階
漸變型別:TypeScript
在 Python 3.5 中出現的一個比較有爭議的特性是新引入的 typing 模塊,它為 Python 生態帶來了一個支持漸變型別的標準詞典,
Python貓注:Gradual typing 是 Jeremy Siek 和 Walid Taha 在 2006 年提出的理論,允許程式中同時出現動態型別與靜態型別,國內有人將其翻譯為“漸進型別”、“漸近型別”、“漸進定型”、“動靜混合型別”等等,但我覺得并不夠好,漸變型別也許是我的首創,借鑒自 Photoshop 的漸變顏色,表達出從動態型別到靜態型別的過渡(或者說交融共處的)特點,“漸變”一詞有打破界限分明的狀態(如大小、遠近、明暗),從而達到中和狀態的含義,
對于那些主要從 C、C++ 和 Java 等語言中接觸靜態型別的人來說,這似乎是一個令人吃驚的糟糕特性(因此引發了爭議),
微軟的 TypeScript 為 Javascript 程式提供了漸變型別,因此它能更好地解釋這個概念,TypeScript 代碼會被編譯成 JavaScript 代碼(然后就不包含運行時型別檢查),流行的 JavaScript 庫的 TypeScript 注解會維護在專用的 DefinitelyTyped 倉中,
正如 Chris Neugebauer 在澳大利亞 PyCon 演講 中指出的,這很像是 Python 與 typeshed 型別提示庫、以及像 mypy 這種型別推斷和分析工具之間的關系,
在本質上,TypeScript 和 Python 中的型別提示都是撰寫特定種類的測驗的方式,要么使用單獨的檔案(就像普通測驗一樣),要么嵌入在代碼體中(就像靜態型別語言中的型別宣告一樣),對于這兩種情況,你都要運行一個單獨的命令,來檢查其余代碼是否與已添加的型別斷言一致(對于 TypeScript,這是在編譯成 JavaScript 時隱式地發生的;對于 Python 的型別提示,這是一個完全可選的靜態分析任務),
動態元編程:Hy、Ruby
C、C++、C# 和 Java 等語言的學習者在接觸 Python 時,經常感到不安的一個特性是“代碼即資料”(code is data):函式和類之類的東西是運行時物件,可以像其它物件一樣被操縱,
Hy 是一種 Lisp 方言,可以同時在 CPython VM 和 PyPy VM 上運行,Lisp 及其方言將“代碼即資料”的概念推到了極致,因為 Lisp 代碼由嵌套串列組成,這些串列描述了要執行的操作(這門語言的名稱本身就代表串列處理器“LISt Processor”),Lisp 風格語言的強大之處在于,它讓你非常容易撰寫出自己的領域特定代碼,Lisp 風格語言的最大缺點是,它讓你非常容易撰寫出自己的領域特定代碼,但這可能導致每個人寫的代碼變得難以閱讀,
Ruby 語言在許多方面與 Python 相似,但對于 Python 中“支持但不鼓勵”的動態元編程特性,Ruby 社區則相對開放,這包括在已有類定義中添加新的方法,以及使用閉包來實作語言的核心結構,例如迭代,(Python貓注:關于兩種語言中迭代結構的實作對比,可閱讀 這篇文章)
學習這些語言,可以讓你深入了解 Python 自己的動態元編程特性,包括函式和類裝飾器、猴子補丁、unittest.mock 標準庫、以及像 wrapt 這樣的第三方物件代理模塊,(我不知道學習哪種語言可以深入了解 Python 的元類系統,如果有人在這方面有任何建議,請在評論中告知我,Python 的元類驅動著很多特性,例如核心的型別系統、抽象基類、列舉型別和漸變型別運算式的運行時求值,)
務實問題解決:Lua、PHP、Perl
主流的編程語言并不是孤立存在的——它們作為一個更大的生態系統的一部分而存在,這個生態系統由發行者(企業和社區組織)、終端用戶、框架開發者、工具開發者、教育作業者等等組成,
Lua 是一種流行的編程語言,作為一種腳本引擎嵌入到大型程式中,標志性的例子是它被魔獸世界游戲用來撰寫客戶端插件,它也被嵌入到了許多 Linux 發行版所使用的 RPM 組件中,與 CPython 相比,Lua 運行時的大小通常只有 CPython 的十分之一,而且由于較弱的自省能力,它更容易與程式的其它部分以及服務器的作業系統隔離開來,Lua 社區對 Python 生態的一個顯著貢獻是 LuaJIT FFI(Foreign Function Interface 外來函式介面),它被 CPython 和 PyPy 采用,作為支持 JIT 的 cffi 介面庫的基礎,
PHP 是另一種流行的編程語言,作為 Linux-Apache-MySQL-PHP LAMP 技術堆疊中的“P”而崛起,因為它專注于生成 HTML 頁面,并且在早期的虛擬專用服務器(Virtual Private Server,簡稱 VPS) 提供商中廣泛使用,盡管其設計上有諸多的概念性缺陷讓人感到絕望,但它如今是幾個極其流行的開源 Web 服務的基礎,包括 Drupal 內容管理系統、Wordpress 博客引擎和維基百科的 MediaWiki 引擎,PHP 還支撐著一些重要的服務,比如 Ushahidi 平臺,它是一個開源的社會化新聞發布社區,
像 PHP 一樣,Perl 也是基于 Linux 而崛起,但跟 PHP 專門作為 Web 開發平臺不同,Perl 是系統管理員的工具,在基于文本的 Linux 作業系統中,它使用正則運算式將命令的輸出轉成字串,并進行操作,當 sh、awk 和 sed 都無法勝任某些任務時,Perl 出現并派上了用場,
學習這些語言,在編程語言設計方面,不大可能獲得什么漂亮審美或者優雅概念,學習它們,最可能的是了解編程語言在現實中是如何被分發和采用的,以及這些在多大程度上取決于偶然的機會、歷史意外事件、以及發行商在系統中默認集成而降低了使用門檻,而不是取決于語言本身固有的能力,Python進階
特別是,它可以提供對以下專案的重要性的洞察:CKAN、OpenStack NFV、Blender、SciPy、OpenMDAO、PyGMO、PyCUDA、樹莓派基金會和 Python 被大量商業組織采用,以保護它們在 Python 生態中不斷的投入,
編程思維:Scratch、Logo
我經常跟函式式編程以及面向物件編程的擁護者們討論,他們聲稱這類語言就像程序式語言一樣易于學習,
如果我們談論的是通過嵌入式編程(例如機器人)進行教學,在軟體中建模的物件都有現實世界的對應物,比如學生們可以觸摸的傳感器、馬達和繼電器,那么,那我會認為 OOP 的人有一定的道理,
但是對于其他人,我現在有一個標準的挑戰:拿起一本烹飪書,把其中一個食譜翻譯成你認為是容易學習的編程語言,然后找一個能理解烹飪書中語言的學生,讓其按照翻譯好的食譜操作,其實,他們不需要真正地操作下去——只需做一個思想實驗,就足以意識到他們聲稱的“很容易學”是假設了多少先驗知識,(我很期待看到學術研究人員在現實中做這種研究——我真的很希望看到結果)
另一種解決這個問題的方法是去學習那些實際上被用來教孩子們編程思維的語言,
其中最受歡迎的是 Scratch,它使用了拖放編程界面,讓學生們操縱一個獨立的圖形環境,它里面的電子圖形可以移動,并回應環境中的事件,像 Scratch 這樣的圖形環境就相當于我們用來教孩子閱讀和書寫的圖畫書,
使用特殊的教育語言來操作圖形環境的想法并不新鮮,最早的例子之一是 1960 年代發明的 Logo 環境,在 Logo 中(以及類似的環境,如 Python 的 turtle 模塊),你主要打交道的是一個“烏龜(turtle)”,你可以通過繪制線條來指導它移動和修改環境,這樣的話,命令序列、重復和狀態(例如,“起筆”、“落筆”)可以基于人們的自然直覺來使用(“想象你是那只烏龜,如果你右轉 90 度會發生什么?”)
回顧并重新學習這些語言,有助于有經驗的程式員放下固化的觀念:它們所用的概念可以提醒我們,這些概念是我們如今認為理所當然的,但初學者們需要先學習,當這樣做的時候,我們能夠更好地與學生和其他初學者們相處,因為我們更有可能打開邏輯的枷鎖,也不會再忽略那些有必要的學習步驟,
譯者附注:以上就是全部的譯文,我還翻譯過不少優質的文章,分享近期的幾篇如下:
1、通過 for 回圈,比較 Python 與 Ruby 編程思想的差別
2、Python 官方研討會:徹底移除 GIL 真的可行么?
3、與 Python 之父聊天:更快的 Python!
4、深入 Python 解釋器原始碼,我終于搞明白了字串駐留的原理!
5、為什么 Python 沒有函式多載?如何用裝飾器實作函式多載?
6、Python優化機制:常量折疊
如果你覺得本文有幫助,請點贊+關注支持一下啦,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/380187.html
標籤:Python
