共计 10456 个字符,预计需要花费 27 分钟才能阅读完成。
Python 猫注:Python 语言诞生 30 年了,现在的发展势头堪称热火朝天,这很大水平上得益于其易学易用的优良设计,而不可否认的是,Python 从其它语言中偷师了不少。本文作者是一名资深的外围开发者,他博大的视线和精准的意识,让我对 Python 的设计理解得更为全面,同时,他“利用自豪感而非恐惧感”的说法,传达出来的是“专一于自我的提高,不嫉妒别人的胜利”的准则,对我也很有帮忙。原文写于 2015 年,躺在我的收藏夹里很久很久了,现在顺利翻译掉,这是一件能晋升自豪感的有意义的事。最初祝大家开卷有益,读有所获。
作者:Nick Coghlan
译者:豌豆花下猫 @Python 猫
英文:https://www.curiousefficiency…
申明:本翻译是出于交流学习的目标,基于 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 优化机制:常量折叠
如果你感觉本文有帮忙,请点赞 + 关注反对一下啦,谢谢!