自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

學習 27 門編程語言的長處,提升你的 Python 代碼水平

新聞 前端
本文作者是一名資深的核心開發(fā)者,他廣博的視野和精準的認識,讓我對 Python 的設計了解得更為全面,同時,他“利用自豪感而非恐懼感”的說法,傳達出來的是“專注于自我的進步,不嫉妒他人的成功”的原則,對我也很有幫助。

[[440259]]

Python 語言誕生 30 年了,如今的發(fā)展勢頭可謂如火如荼,這很大程度上得益于其易學易用的優(yōu)秀設計,而不可否認的是,Python 從其它語言中偷師了不少。本文作者是一名資深的核心開發(fā)者,他廣博的視野和精準的認識,讓我對 Python 的設計了解得更為全面,同時,他“利用自豪感而非恐懼感”的說法,傳達出來的是“專注于自我的進步,不嫉妒他人的成功”的原則,對我也很有幫助。

目錄

  • 拓寬我們的視野
  • 過程式編程:C、Rust、Cython
  • 面向對象的數據模型:Java、C#、Eiffel
  • 面向對象的 C 派生:C++、D
  • 面向數組的數據處理:MATLAB/Octave、Julia
  • 統(tǒng)計數據分析:R
  • 計算管道建模:Haskell、Scala、Clojure、F#
  • 事件驅動編程:JavaScript、Go、Erlang、Elixir
  • 漸變類型:TypeScript
  • 動態(tài)元編程:Hy、Ruby
  • 務實問題解決:Lua、PHP、Perl
  • 編程思維:Scratch、Logo

作為世界上最流行的編程語言之一的共同設計者,我經??吹揭粋€令人沮喪的行為(在 Python 社區(qū)和其它社區(qū)):有影響力者試圖激發(fā)人們對“敗給”其它開源社區(qū)的恐懼,從而調動人們對社區(qū)作貢獻的積極性。(我自己偶爾也會犯這種錯誤,這讓我更容易發(fā)現其他人是否也落入了同樣的陷阱)。

雖然學習其它編程語言社區(qū)的經驗是件好事,但基于恐懼的方法來激勵行動是有嚴重問題的,因為這會刺激本社區(qū)成員將其它社區(qū)的人視為爭奪開源貢獻者關注的敵人,而不是作為在更大挑戰(zhàn)中的潛在盟友(推動軟件開發(fā)藝術發(fā)展)。這還會告訴那些喜歡其它語言的人,在一個把他們以及他們的同伴視為“敵對競爭對手”的社區(qū)里,他們是不受歡迎的。

事實上,我們希望有多種多樣的跨平臺的開源編程語言供選擇,因為編程語言是思考的首要工具——使我們能夠以明確的方式表達我們的想法,從而讓計算機也能夠理解。如果有人找到了一種適合大腦的語言,能夠解決眼前的問題,那就太好了,不管他們選擇的是哪種(些)語言。

因此,我對 Python 社區(qū)有三個具體的請求,以及一個較為寬泛的建議。首先,我的請求是:

如果我們要利用社區(qū)的本能來激勵行動,就應該避免利用恐懼感,而應該利用自豪感。 當我們將恐懼作為激勵因素時,就像在說“如果我們不做 X,就會失去開發(fā)者對 Python 的關注”,這等于是故意地在自由的開源貢獻者中創(chuàng)造悲觀的情緒。然而,依賴社區(qū)的自豪感就像在說“目前尚不清楚如何在 Python 中解決 X 問題。如果我們看看 Y 語言,就可以看到他們有一個非常好的方法來解決問題 X,我們可以吸收進 Python,以提供類似的舒適的用戶體驗。”積極的態(tài)度讓我們對自己的努力感到自豪,而不是貶低他人的努力,這有助于在 Python 社區(qū)內促成一種持續(xù)學習的文化,并促進與其它社區(qū)改善協(xié)作關系,共同發(fā)展。

克制對其它開源編程語言社區(qū)采取輕蔑的態(tài)度,尤其當這些社區(qū)授權人們解決自己的問題,而不是等待商業(yè)軟件供應商來解決問題。 世界上大多數重要的問題解決起來都是無利可圖的(因為受苦于這些問題的人并不富裕,而且無法左右機構基金的決定),所以我們應該鼓勵試圖解決這些問題的人,不管我們如何看待他們的技術選擇。

如果我們認識的人剛開始學習編程,并且他們選了一種我們不喜歡的語言,我們應該支持他們的選擇。 **他們比我們更知道什么適合自己,適合我們的語言不一定適合他們。如果他們對自己最初的選擇感到了沮喪,甚至已經對學習編程變得沒有動力,此時再給他們推薦別的編程語言。這個建議還適用于那些在改善糟糕的網絡安全狀況的人:我們在面對天生不安全的語言時,采取的方法是改進操作系統(tǒng)的沙箱功能,逐步學習有更好的本地安全屬性的語言,并改善現有語言的默認行為,而不是列舉為什么從程序安全性的角度來看,他們選擇的語言是一個糟糕的選擇,來迷惑初學者。(如果有人部署了由初學者編寫的未經審核的軟件來處理安全敏感的任務,那就不是開發(fā)者的問題,而且部署者的問題,他們沒有對軟件的出處和安全屬性進行適當的盡職調查。)

我的寬泛的建議針對那些遇到了 Python 核心程序的限制,并因此希望探索 Python 中可用的“思考工具”的人。這個建議就是:

拓寬我們的視野

在開發(fā) Python 核心程序的過程中,我們會做的一件事是查看其它語言中解決了我們正面臨的問題的特性,看看是否有辦法既吸收它們,又使 Python 代碼更易于閱讀和編寫。這意味著學習其它專注于特定軟件開發(fā)風格的編程語言,可以幫助我們在使用 Python 時,提高對這種編程風格的理解。

為了提供幫助,我在下面列出了一些值得探索的領域,以及可能加深對這些領域的理解的語言。我盡可能鏈接了維基百科的頁面,而不是直接鏈接到語言的主頁,因為維基百科經常會提供有趣的歷史背景,當你為了教育目的學習一門新的編程語言,而不是直接用于實際應用時,這些背景值得去了解。

雖然我知道這些語言中的大部分(并且在開發(fā)生產系統(tǒng)時使用過幾種),但這份推薦清單中還包括我間接知道的語言(通常是通過閱讀教程和設計文檔,或者通過與我信任的人交談,以獲取對一門語言的優(yōu)點與缺陷的洞察)。

還有很多本應該放但沒有放進名單里的語言 語言 ,所以下面羅列的僅是我感興趣的部分(例如,我主要感興趣的是 Linux、Android 和 Windows 的生態(tài)系統(tǒng),所以我舍棄了 Apple 生態(tài)中的 Objective-C 和 Swift 語言,另外我也不熟悉 Processing 這種專注于藝術的編程語言,無法想象學習它們能教給 Python 開發(fā)者什么)。

除了考慮一門語言可能教給你的東西,如果你想獲得一份更全面的清單,可以去查看 IEEE Spectrum 關于編程語言流行度和增長度的 年度榜單 。

過程式編程:C、Rust、Cython

Python 默認的執(zhí)行模型是過程式的:從主模塊的頂部開始,逐條語句地執(zhí)行。Python 對下面介紹的所有數據和編程建模方法的支持,都建立在這種過程式的執(zhí)行模型上。

C 語言仍然是無可爭議的底層過程式編程的統(tǒng)治者。它是 Python 官方解釋器以及 Linux 操作系統(tǒng)內核的核心實現語言。作為一名軟件開發(fā)人員,學習 C 語言是更多地了解底層硬件的最好方法之一——C 語言經常被稱為“可移植的匯編語言”,對于任何新的 CPU 架構來說,第一個交叉編譯的應用程序將是 C 編譯器。

Rust 是一種相對較新的編程語言,由 Mozilla 創(chuàng)造。Rust 的目標是吸取整個行業(yè)在不使用 C 時遇到的所有教訓,設計一門能與 C 庫相互操作的新語言,提供底層的系統(tǒng)編程所需的對硬件用途的精確控制,但使用不同的編譯方法來進行數據建模和內存管理,從結構上消除許多困擾 C 程序的常見缺陷(如緩沖區(qū)溢出、指針重復釋放錯誤、空指針訪問和線程同步問題)。經過培訓和早期的專業(yè)經驗,我是一名嵌入式系統(tǒng)工程師,而 Rust 是我見過的第一種看起來有潛力縮減當前由 C 語言和自定義匯編代碼所主導的生態(tài)位的新語言。

Cython 也是一種較底層的過程式語言,但與 C 和 Rust 等通用語言不同,Cython 專門用于編寫 CPython 的擴展模塊。為了實現這一目標,Cython 被設計為 Python 的超集,允許程序員選擇何時支持純 Python 語法以獲得靈活性,何時支持Cython 的語法擴展,以便生成在速度和內存效率方面能與原生 C 代碼相當的代碼。

學習這些語言,你可以加深在內存管理、算法效率、二進制接口(ABI)兼容性、軟件可移植性、以及將源代碼轉換為運行系統(tǒng)等實踐方面的見解。

面向對象的數據模型:Java、C#、Eiffel

編程最主要做的事情之一是為現實世界建模,最流行的做法是提供原生的語法支持面向對象編程:對數據作結構化的分組,使用類方法操作那些數據結構。

Python 本身是經過精心設計的,無需先編寫自己的類就可以使用面向對象的特性。并不是每種語言都采用這種方法——本小節(jié)中列出的語言都認為學習面向對象設計是使用該語言的必要條件。

在 20 世紀 90 年代中后期,Sun Microsystems 公司進行了一次大規(guī)模的市場推廣, Java 成為了許多高等院校中計算機科學入門課的默認語言。雖然如今在許多教學活動中,Java 已經被 Python 所取代,但它仍然是開發(fā)商用程序時最流行的語言之一。還有一些基于通用 JVM(Java 虛擬機)運行時的語言,例如 Python 的 Jython 實現。Android 系統(tǒng)的 Dalvik 和 ART 環(huán)境則是基于 Java 開放的 API 二次開發(fā)。

C# 在許多方面與 Java 相似,在 Sun 和微軟未能解決他們關于微軟的 Java 實現(即 J++)的業(yè)務差異之后,C# 成為了一種替代方案。像 Java 一樣,這是一門開發(fā)商用程序的流行語言,還有其它一些語言共享著 .NET CLR(公共語言運行時),包括 Python 的 IronPython 實現 (最早的 IronPython 1.0 的核心組件被提取成了與語言無關的 .NET 動態(tài)語言運行庫)。在很長一段時間里,. NET 是一種專用于 Windows 的技術,而 mono 作為一種跨平臺的開源實現,但微軟在 2015 年初轉向了 開源生態(tài)系統(tǒng)戰(zhàn)略 。

與此清單中的大多數語言不同,我不推薦在日常工作中使用 Eiffel 。但是,我依然推薦學習它,因為它教會了我許多關于良好的面向對象設計的知識,比如它認為“可驗證的正確性”是應用程序的設計目標。(學習 Eiffel 也讓我明白了為什么“可驗證的正確性”并不是大多數軟件開發(fā)時的設計目標,因為可驗證的正確軟件實在不能很好地處理模糊性,并且完全不適用于那些你不清晰相關的約束條件卻需要給自己留下足夠的回旋余地,以便能夠通過迭代開發(fā)找出更具體的細節(jié)的情況。)

學習這些語言,你可以深入了解繼承模型、契約式設計、類不變性(class invariant)、前置條件、后置條件、協(xié)方差、逆變、類方法解析順序、泛型編程以及其它適用于 Python 類型系統(tǒng)的概念。還有很多標準庫模塊和第三方框架使用這種“看得見的面向對象”的設計風格,比如 unittest 和 logging 模塊,以及 Django 框架中基于類的視圖。

面向對象的 C 派生:C++、D

CPython 運行環(huán)境可以被視為一個“帶有對象的 C”的編程環(huán)境——在其核心,CPython 使用 C 的方法實現面向對象編程,即定義 C 結構體來保存相關的數據,并將結構體的實例作為第一個參數傳遞給函數,然后對數據進行操作(這就是 CPython C API 中全能的 PyObject * 指針)。這種設計模式對應到 Python 層面,就是實例方法的顯式 self 參數以及類方法的顯式 cls 參數。

C++ 的目標是保持與 C 語言源代碼的完全兼容,同時添加更高級的特性,例如支持原生的面向對象編程和基于模板的元編程。它是出了名的冗長和難以編程(盡管 2011 年對語言標準的更新解決了許多糟糕的問題),但它也是許多領域的編程首選,包括 3D 建模的圖形化引擎和跨平臺應用的開發(fā)框架(例如 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 的 科學技術棧 被作為商業(yè) MATLAB 的替代方案,后者被廣泛用于科學和工程領域的建模、仿真和數據分析。 GNU Octave 是一個開源的方案,目標是兼容 MATLAB 代碼的語法,允許人們對照這兩種面向數組的編程方法。

Julia 是另一種相對較新的語言,重點關注面向數組的編程和基于類型的函數重載。

學習這些語言,你可以了解 Python 的科學技術棧,以及有機會通過像 OpenCL 和 Nvidia 的 CUDA 這種技術來探索硬件層面的并行執(zhí)行,并通過 Apache Spark 和專用于 Python 的 Blaze 來了解分布式數據處理。

統(tǒng)計數據分析:R

隨著對大型數據集的接觸越來越多,對靈活處理這些數據集的分析工具的需求也越來越大。R 編程語言就是這樣的工具,它特別關注統(tǒng)計性的數據分析和可視化。

學習 R 能會讓你深入了解 Python 在科學技術棧的統(tǒng)計分析能力,尤其是 pandas 數據處理庫和 seaborn 統(tǒng)計可視化庫。

計算管道建模:Haskell、Scala、Clojure、F#

面向對象的數據建模和面向數組的數據處理主要關注靜態(tài)的數據,無論是以命名的屬性形成集合的形式,還是以結構化數據形成數組的形式。

相比之下,函數式編程語言強調以計算流的形式對動態(tài)數據進行建模。即便只學習函數式編程的基本知識,也能極大地改進數據轉換操作的結構,即使在其它過程式、面向對象或面向數組的程序中也是如此。

Haskell 是一種函數式編程語言,對 Python 的設計產生了重大影響,最顯著的是在 Python 2.0 中引入的列表推導式。

Scala 是一種(存疑的)JVM 函數式編程語言,加上 Java、Python 和 R,它們是 Apache Spark 數據分析平臺的四種主要編程語言。盡管 Scala 的設計偏重于函數式編程,但它的語法、數據模型和執(zhí)行模型的設計也最大限度地降低 Java 程序員使用的門檻(因此所謂“存疑的”——其實是因為,Scala 最好被歸類為一門具有強函數式編程支持的面向對象編程語言)。

Clojure 是另一種基于 JVM 的函數式編程語言,是 Lisp 的一種方言。它之所以出現在這份清單里,因為它是 Python 的 toolz 函數式編程工具包的靈感來源。

F# 不是我自己特別熟悉的語言,但它作為 .net CLR(公共語言運行時)推薦的函數式編程語言,所以還是值得關注。

學習這些語言,你可以深入了解 Python 自己的計算管道建模工具,包括容器推導式、 生成器 、生成器表達式、functools 和 itertools 標準庫,以及第三方的 Python 函數工具包,比如 toolz。

事件驅動編程:JavaScript、Go、Erlang、Elixir

計算管道是處理數據轉換和分析問題的一種極佳的方法,但許多問題需要程序作為持久性服務運行,等待事件發(fā)生,然后處理那些事件。在這類服務中,為了能夠同時容納多個用戶(或多個操作),通常必須要并發(fā)地處理多個事件。

JavaScript 最初是作為 Web 瀏覽器的事件處理語言而開發(fā)的,允許網站開發(fā)者在本地響應客戶端操作(如鼠標點擊和按鍵敲擊)和事件(如網頁完成了渲染)。所有現代瀏覽器都支持它,它與 HTML5 領域對象模型(DOM)一起,已經成為一種定義用戶界面外觀和行為的事實上的標準。

Go 是谷歌設計的一種用于創(chuàng)建高度可伸縮的 Web 服務的專用語言,并且已經被證明是一種非常適合開發(fā)命令行應用程序的語言。從編程語言設計的角度來看,Go 最有趣的方面是在其核心并發(fā)模型中使用了通信順序進程( Communicating Sequential Processes )概念。

Erlang 是由愛立信設計的專用語言,用于創(chuàng)建高度可靠的電話交換機以及類似的設備。它被用于開發(fā)出了流行的 RabbitMQ 消息代理中間件。Erlang 使用 Actor 模型作為核心的并發(fā)原語,在執(zhí)行線程之間傳遞消息,而不是讓它們直接共享數據。雖然我從未用過 Erlang 編程,但我的第一份全職工作涉及一個基于 Actor 的 C++ 并發(fā)框架,而該框架由一名前愛立信工程師開發(fā),另外,我自己也開發(fā)了一個這樣的框架,基于德州儀器(Texas Instrument)的輕量級 DSP/BIOS 運行時(現在的 TI-RTOS)里面的 TSK (Task)和 MBX (Mailbox)原語。

Elixir 出現在這份清單里,因為它被設計運行在 Erlang VM 上,提供了與 Erlang 相同的并發(fā)語義,同時還提供了一系列在語言層面上的特性,打造出一個更加全面的環(huán)境,更有可能吸引其它語言例如 Python、Java 或 Ruby 的開發(fā)者。

學習這些語言,你可以深入了解 Python 對并發(fā)和并行的支持,包括 原生協(xié)程 、基于生成器的協(xié)程、concurrent.futures 和 asyncio 標準庫模塊、第三方網絡服務開發(fā)框架(如 twisted 和 Tornado)、Django 中引入的 channel 概念、GUI 框架中的事件處理循環(huán)。 Python進階

漸變類型:TypeScript

在 Python 3.5 中出現的一個比較有爭議的特性是新引入的 typing 模塊,它為 Python 生態(tài)帶來了一個支持漸變類型的標準詞典。

Python貓注:Gradual typing 是 Jeremy Siek 和 Walid Taha 在 2006 年提出的理論,允許程序中同時出現動態(tài)類型與靜態(tài)類型。國內有人將其翻譯為“漸進類型”、“漸近類型”、“漸進定型”、“動靜混合類型”等等,但我覺得并不夠好。 漸變類型 也許是我的首創(chuàng),借鑒自 Photoshop 的漸變顏色,表達出從動態(tài)類型到靜態(tài)類型的過渡(或者說交融共處的)特點。“漸變”一詞有打破界限分明的狀態(tài)(如大小、遠近、明暗),從而達到中和狀態(tài)的含義。

對于那些主要從 C、C++ 和 Java 等語言中接觸靜態(tài)類型的人來說,這似乎是一個令人吃驚的糟糕特性(因此引發(fā)了爭議)。

微軟的 TypeScript 為 Javascript 程序提供了漸變類型,因此它能更好地解釋這個概念。TypeScript 代碼會被編譯成 JavaScript 代碼(然后就不包含運行時類型檢查),流行的 JavaScript 庫的 TypeScript 注解會維護在專用的 DefinitelyTyped 倉中。

正如 Chris Neugebauer 在 澳大利亞 PyCon 演講 中指出的,這很像是 Python 與 typeshed 類型提示庫、以及像 mypy 這種類型推斷和分析工具之間的關系。

在本質上,TypeScript 和 Python 中的類型提示都是編寫特定種類的測試的方式,要么使用單獨的文件(就像普通測試一樣),要么嵌入在代碼體中(就像靜態(tài)類型語言中的類型聲明一樣)。對于這兩種情況,你都要運行一個單獨的命令,來檢查其余代碼是否與已添加的類型斷言一致(對于 TypeScript,這是在編譯成 JavaScript 時隱式地發(fā)生的;對于 Python 的類型提示,這是一個完全可選的靜態(tài)分析任務)。

動態(tài)元編程:Hy、Ruby

C、C++、C# 和 Java 等語言的學習者在接觸 Python 時,經常感到不安的一個特性是“代碼即數據”(code is data):函數和類之類的東西是運行時對象,可以像其它對象一樣被操縱。

Hy 是一種 Lisp 方言,可以同時在 CPython VM 和 PyPy VM 上運行。Lisp 及其方言將“代碼即數據”的概念推到了極致,因為 Lisp 代碼由嵌套列表組成,這些列表描述了要執(zhí)行的操作(這門語言的名稱本身就代表列表處理器“LISt Processor”)。Lisp 風格語言的強大之處在于,它讓你非常容易編寫出自己的領域特定代碼。Lisp 風格語言的最大缺點是,它讓你非常容易編寫出自己的領域特定代碼,但這可能導致每個人寫的代碼變得難以閱讀。

Ruby 語言在許多方面與 Python 相似,但對于 Python 中“支持但不鼓勵”的動態(tài)元編程特性,Ruby 社區(qū)則相對開放。這包括在已有類定義中添加新的方法,以及使用閉包來實現語言的核心結構,例如迭代。

學習這些語言,可以讓你深入了解 Python 自己的動態(tài)元編程特性,包括 函數和類裝飾器 、猴子補丁、unittest.mock 標準庫、以及像 wrapt 這樣的第三方對象代理模塊。(我不知道學習哪種語言可以深入了解 Python 的元類系統(tǒng),如果有人在這方面有任何建議,請在評論中告知我。Python 的元類驅動著很多特性,例如核心的類型系統(tǒng)、抽象基類、枚舉類型和漸變類型表達式的運行時求值。)

務實問題解決:Lua、PHP、Perl

主流的編程語言并不是孤立存在的——它們作為一個更大的生態(tài)系統(tǒng)的一部分而存在,這個生態(tài)系統(tǒng)由發(fā)行者(企業(yè)和社區(qū)組織)、終端用戶、框架開發(fā)者、工具開發(fā)者、教育工作者等等組成。

Lua 是一種流行的編程語言,作為一種腳本引擎嵌入到大型程序中。標志性的例子是它被魔獸世界游戲用來編寫客戶端插件,它也被嵌入到了許多 Linux 發(fā)行版所使用的 RPM 組件中。與 CPython 相比,Lua 運行時的大小通常只有 CPython 的十分之一,而且由于較弱的自省能力,它更容易與程序的其它部分以及服務器的操作系統(tǒng)隔離開來。Lua 社區(qū)對 Python 生態(tài)的一個顯著貢獻是 LuaJIT FFI(Foreign Function Interface 外來函數接口),它被 CPython 和 PyPy 采用,作為支持 JIT 的 cffi 接口庫的基礎。

PHP 是另一種流行的編程語言,作為 Linux-Apache-MySQL-PHP LAMP 技術棧中的“P”而崛起,因為它專注于生成 HTML 頁面,并且在早期的虛擬專用服務器(Virtual Private Server,簡稱 vps) 提供商中廣泛使用。盡管其設計上有諸多的概念性缺陷讓人感到絕望,但它如今是幾個極其流行的開源 Web 服務的基礎,包括 Drupal 內容管理系統(tǒng)、Wordpress 博客引擎和維基百科的 MediaWiki 引擎。PHP 還支撐著一些重要的服務,比如 Ushahidi 平臺,它是一個開源的社會化新聞發(fā)布社區(qū)。

像 PHP 一樣, Perl 也是基于 Linux 而崛起。但跟 PHP 專門作為 Web 開發(fā)平臺不同,Perl 是系統(tǒng)管理員的工具,在基于文本的 Linux 操作系統(tǒng)中,它使用正則表達式將命令的輸出轉成字符串,并進行操作。當 sh、awk 和 sed 都無法勝任某些任務時,Perl 出現并派上了用場。

學習這些語言,在編程語言設計方面,不大可能獲得什么漂亮審美或者優(yōu)雅概念。學習它們,最可能的是了解編程語言在現實中是如何被分發(fā)和采用的,以及這些在多大程度上取決于偶然的機會、歷史意外事件、以及發(fā)行商在系統(tǒng)中默認集成而降低了使用門檻,而不是取決于語言本身固有的能力。

特別是,它可以提供對以下項目的重要性的洞察:CKAN、OpenStack NFV、Blender、SciPy、OpenMDAO、PyGMO、PyCUDA、樹莓派基金會和 Python 被大量商業(yè)組織采用,以保護它們在 Python 生態(tài)中不斷的投入。

編程思維:Scratch、Logo

我經常跟函數式編程以及面向對象編程的擁護者們討論,他們聲稱這類語言就像過程式語言一樣易于學習。

如果我們談論的是通過嵌入式編程(例如機器人)進行教學,在軟件中建模的對象都有現實世界的對應物,比如學生們可以觸摸的傳感器、馬達和繼電器,那么,那我會認為 OOP 的人有一定的道理。

但是對于其他人,我現在有一個標準的挑戰(zhàn):拿起一本烹飪書,把其中一個食譜翻譯成你認為是容易學習的編程語言,然后找一個能理解烹飪書中語言的學生,讓其按照翻譯好的食譜操作。其實,他們不需要真正地操作下去——只需做一個思想實驗,就足以意識到他們聲稱的“很容易學”是假設了多少先驗知識。(我很期待看到學術研究人員在現實中做這種研究——我真的很希望看到結果)

另一種解決這個問題的方法是去學習那些實際上被用來教孩子們編程思維的語言。

其中最受歡迎的是 Scratch ,它使用了拖放編程界面,讓學生們操縱一個獨立的圖形環(huán)境,它里面的電子圖形可以移動,并響應環(huán)境中的事件。像 Scratch 這樣的圖形環(huán)境就相當于我們用來教孩子閱讀和書寫的圖畫書。

使用特殊的教育語言來操作圖形環(huán)境的想法并不新鮮,最早的例子之一是 1960 年代發(fā)明的 Logo 環(huán)境。在 Logo 中(以及類似的環(huán)境,如 Python 的 turtle 模塊),你主要打交道的是一個“烏龜(turtle)”,你可以通過繪制線條來指導它移動和修改環(huán)境。這樣的話,命令序列、重復和狀態(tài)(例如,“起筆”、“落筆”)可以基于人們的自然直覺來使用(“想象你是那只烏龜,如果你右轉 90 度會發(fā)生什么?”)

回顧并重新學習這些語言,有助于有經驗的程序員放下固化的觀念:它們所用的概念可以提醒我們,這些概念是我們如今認為理所當然的,但初學者們需要先學習。當這樣做的時候,我們能夠更好地與學生和其他初學者們相處,因為我們更有可能打開邏輯的枷鎖,也不會再忽略那些有必要的學習步驟。

作者:Nick Coghlan

譯者: 豌豆花下貓@Python貓

英文: https://www.curiousefficiency.org/posts/2015/10/languages-to-improve-your-python.html

聲明:本翻譯是出于交流學習的目的,基于 CC BY-NC-SA 4.0 授權協(xié)議。為便于閱讀,內容略有改動。

 

責任編輯:張燕妮 來源: 博客園精華區(qū)
相關推薦

2017-08-08 10:45:01

Python編程語言

2015-10-26 08:55:07

提升Python編程語言

2025-02-25 11:12:53

2021-07-19 22:51:28

Python開發(fā)編程

2017-04-07 10:45:43

編程語言

2017-04-07 16:49:00

語言程序編程

2019-11-15 14:48:26

編程語言開發(fā)者分析

2019-09-22 21:05:51

編程語言開發(fā)

2022-03-17 13:44:30

Git命令管理

2018-07-06 15:25:50

程序員編程python

2014-10-31 10:04:57

程序員代碼

2024-06-27 09:00:00

人工智能編程語言軟件開發(fā)

2021-08-18 10:44:18

編程語言FlutterUnity

2021-08-18 06:48:52

編程語言開發(fā)IT

2020-03-08 17:03:33

語言學習代碼

2018-08-21 13:50:05

編程語言JavaPython

2019-04-24 08:34:46

編程語言PythonJava

2020-11-12 15:52:08

編程語言C語言程序員

2010-03-11 15:16:52

Python編程語言

2013-07-26 10:23:04

點贊
收藏

51CTO技術棧公眾號