前言
2018 年我开始准备一门针对完全没有编程经验的学生的编程课程。我想用Julia,不过我发现市面上没有用Julia 作为第一编程语言来学习编程的书。确实有很多不错的教程解释了Julia 的重要概念,不过没有哪一本书足够重视学习程序员是如何思考的。
Allen Downey 的《Think Python》介绍了学习正确编程的所有重要概念。不过,那本书是基于Python 语言的。我的讲义初稿可算是各种参考书的大杂烩,不过随着准备的时间越长,讲义内容就越像《Think Python》中的章节。我有了一个想法,想把那本书移植到Julia,把我的讲义整理成Julia 版的《Think Python》,这个想法很快付诸实施。
所有材料都可以从一个GitHub 存储库作为Jupyter notebook 获取。我在Julia Discourse 网站上发布了有关这个课程进度的消息后,反馈像潮水般涌来。大家迫切需要用Julia 作为第一编程语言介绍基本编程概念的一本书,显然,这是Julia 世界中缺失的一环。我联系了Allen,询问我能不能正式把《ThinkPython》移植到Julia 写一本书,他的回答很干脆:“加油!”他帮我与他的O’Reilly Media 编辑取得了联系,一年后,这本书终于完成,我对它做了最后的润色。
这条路走来真是有些坎坷。2018 年8 月,Julia v1.0 发布,与所有Julia 程序员一样,我不得不做代码迁移。将源文件转换为O’Reilly 兼容的AsciiDoc 文件时,这本书中的所有例子都经过了测试。工具链和示例代码都必须是Juliav1.0 兼容的。好在8 月份我不需要上课……
希望你喜欢这本书,它不仅能帮助你学习编程,还能教你像计算机科学家那样思考,至少能有那么一点点。
——Ben Lauwens
为什么选择Julia?
Julia 最初由Alan Edelman、Stefan Karpinski、Jeff Bezanson 和Viral Shah 在2012 年发布。这是一个免费且开源的编程语言。
选择编程语言往往很有主观性。对我来说,Julia 的以下特点是决定性的因素:
?? Julia 是一个高性能编程语言。
?? Julia 使用了多重分派,允许程序员选择适合应用的不同编程模式。
?? Julia 是一个动态类型语言,可以很容易地交互使用。
?? Julia 有一种易于学习的简明的高级语法。
?? Julia 是一个可选类型的编程语言,它的(用户自定义)数据类型可以让代码更清晰,也更健壮。
?? Julia 有一个扩展标准库,还有大量可用的第三方包。
Julia 是一种独一无二的编程语言,因为它解决了所谓的“两个语言问题”。
不需要任何其他编程语言,利用Julia 就可以写高性能的代码。不过,并不是说这会自动发生。要由程序员负责优化形成瓶颈的代码,不过只用Julia 本身就可以做到。
本书面向的读者
这本书适合任何想要学习编程的人,无须先前掌握任何编程知识。
我们会循序渐进地介绍新概念,并在后面的章节介绍更高级的主题。
本书可以作为高中或大学一个学期课程的教材。
本书使用约定
以下是本书使用的排版约定:
斜体(Italic)
表示新术语、URL、email 地址、文件名和文件扩展名。
等宽字体(Constant width)
表示程序列表,以及段落内部,用于引用程序元素,如变量或函数名称,数据库、数据类型、环境变量、函数语句和关键字等。
加粗等宽字体(Constant width bold)
表示由用户所输入的命令或其他文本。
斜体等宽字体(Constant width italic)
表示应由用户所提供的实际值或根据上下文所确定的值来替换的文本。
使用代码示例
本书中使用的所有代码都可以从GitHub 上的一个Git 存储库(https://github.com/BenLauwens/ThinkJulia.jl)获取。如果你不熟悉Git,应该知道这是一个版本控制系统,允许你跟踪一个项目里的有关文件。Git 控制下的一个文件集合就称为一个“存储库”。GitHub 是一个托管服务,为Git 存储库提供了存储空间,并提供了一个方便的Web 界面。
现在已经有一个很方便的包,可以直接增加到Julia。只需要在Pkg 模式下在REPL 中键入add https://github.com/BenLauwens/ThinkJulia.jl,参见第4 章“海龟绘图”一节。
运行Julia 代码最容易的方法是访问https://juliabox.com 并启动一个免费会话。
可以使用REPL,另外它还提供了一个notebook 界面。如果想在你的计算机上安装Julia,可以从Julia Computing 免费下载JuliaPro。这包括一个最新的Julia 版本、基于Atom 的Juno 交互式开发环境,以及多个预安装的Julia 包。如果你喜欢研究,可以从https://julialang.org 下载Julia,安装你喜欢的编辑器(例如,Atom 或Visual Studio Code),并启用用于Julia 集成的插件。
如果是本地安装,还可以增加IJulia 包,在你的计算机上运行一个Jupyternotebook。
这本书的目的是帮助你完成工作。一般来讲,你可以在程序和文档中使用这些示例代码,不需要联系我们来得到许可,除非你直接复制了大部分的代码。例如,如果你在编写一个程序,使用了本书中的多段代码,这并不需要得到许可。但是出售或发行O’Reilly 书示例代码光盘则需要得到许可。回答问题时如果引用了这本书的文字和示例代码,这不需要得到许可。但是如果你的产品的文档借用了本书中大量示例代码,则需要得到许可。
我们希望但不严格要求标明引用出处。引用信息通常包括书名、作者、出版商和ISBN。例如,“Think Julia by Ben Lauwens and Allen B. Downey (O’Reilly).Copyright 2019 Allen B. Downey, Ben Lauwens, 978-1-492-04503-8”。
如果你认为你在使用代码示例时超出了合理使用范围或者上述许可范围,可以随时联系我们:permissions@oreilly.com。
O’Reilly 在线学习平台(O’Reilly Online Learning)
近40 年来,O’Reilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly 的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly 和200 多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。
联系我们
请将关于本书的意见和问题通过以下地址提供给出版商:
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
针对这本书,我们还建有一个网页,列出了有关勘误、示例和其他信息。可以通过以下地址访问这个页面:https://oreil.ly/think-julia。
如果对这本书有什么建议,或者要询问技术上的问题,请将电子邮件发送至:bookquestions@oreilly.com。
要了解关于我们的图书、课程、会议和新闻的更多信息,请访问我们的网站:http://www.oreilly.com。
我们的Facebook: http://facebook.com/oreilly。
我们的Twitter: http://twitter.com/oreillymedia。
我们的YouTube: http://www.youtube.com/oreillymedia。
致谢
非常感谢Allen 写了《Think Python》一书,并允许我把这本书移植到Julia。
你的热情深深地感染了我!
还要感谢这本书的技术审校人员:Tim Besard、Bart Janssens 和David P.Sanders,你们提出了很多非常有帮助的建议。
感谢O’Reilly Media 的Melissa Potter,你让这本书更出色。是你督促我少走弯路做正确的事,并让这本书尽可能让人耳目一新。
感谢O’Reilly Media 的Matt Hacker,是你帮助我解决了那些Atlas 工具链和语法高亮显示问题。
感谢所有与我共同完成这本书初版的同学们,还有提出修改意见和建议的所有贡献者(如后所列)。
贡献者名单
如果你有建议或修改意见,请发email 至ben.lauwens@gmail.com 或者在GitHub 上开一个问题。如果我根据你的反馈做了修改,会把你增加到贡献者名单里(除非你要求省略)。
要让我知道你使用的是这本书哪一个版本,哪一种格式。最好至少给出有错误的那个句子的一部分,这样更方便我查找。也可以给出页码和节号,不过这样查找起来可能不那么容易。
非常感谢!
?? Scott Jones 指出Void 改为Nothing,正是在此之后,我开始把这本书迁移到Julia v1.0。
?? Robin Deits 发现了第2 章的一些拼写错误。
?? Mark Schmitz 建议启用语法高亮显示。
?? Zigu Zhao 找出了第8 章的一些bug。
?? Oleg Soloviev 发现了增加ThinkJulia 包的URL 中的一个错误。
?? Aaron Ang 发现了一些渲染和命名问题。
?? Sergey Volkov 发现第7 章中一个已经失效的链接。
?? Sean McAllister 建议应当提到一个非常棒的BenchmarkTools 包。
?? Carlos Bolech 发来一个长长的修改意见和建议列表。
?? Krishna Kumar 修改了第18 章中的Markov 示例。