计算机科学家眼中Python程序之道

网友投稿 763 2022-05-29

计算机科的思考方式综合了数学、工程学以及自然科学的一些最优秀的特性。计算机科学家与数学家类似,他们使用形式语言来描述理念(特别是计算);与工程师类似,他们设计产品,将元件组装成系统,对不同的方案进行评估选择;与自然科学家类似,他们观察复杂系统的行为,构建科学假说,并检验其预测。

作为计算机科学家,最重要的技能就是问题求解。问题求解是发现问题、创造性地思考解决方案以及清晰准确地表达解决方案的能力。实践证明,学习编程的过程,正是训练问题求解能力的绝佳机会。

1 什么是程序

程序是指一组定义如何进行计算的指令的集合。这种计算可能是数学计算,如解方程组或者查找多项式的根,也可以是符号运算,如搜索和替换文档中的文本,或者图形相关的操作,如处理图像或播放视频。

在不同的编程语言中,程序的细节有所不同,但几乎所有编程语言中都会出现以下几类基本指令。

输入:从键盘、文件或者其他设备中获取数据。

输出:将数据显示到屏幕,保存到文件中,或者发送到网络上等。

数学:进行基本数学操作,如加法或乘法。

条件执行:检查某种条件的状态,并执行相应的代码。

重复:重复执行某种动作,往往在重复中有一些变化。

信不信由你,这差不多就是全部了。你所遇到过的所有程序,无论多么复杂,都是由类似上面的这些指令组成的。所以我们可以把编程看作一个将大而复杂的任务分解为更小的子任务的过程,不断分解,直到任务简单到足以由上面的这些基本指令组合完成。

2 运行Python

Python入门的挑战之一在于你可能需要自己在电脑上安装Python及相关软件。如果你熟悉自己的操作系统,而且习惯于命令行界面,那么安装Python不是什么问题。但对于初学者来说,同时学习编程和系统管理命令两件事,有时候是非常痛苦的。

为了避免这个问题,我推荐你开始先在浏览器中运行Python,等熟悉了Python语言之后,我再向你介绍如何在电脑上安装Python。

用于运行Python的网站有不少。如果你已经找到一个喜欢的,就可以直接去用。如果没有,我推荐PythonAnywhere。我在http://tinyurl.com/thinkpython2e上提供了详细的入门指导。

有两个版本的Python,分别为Python 2和Python 3。它们很类似,所以如果你学会了一个版本,也能很容易地切换到另一个版本。实际上,作为初学者,你会遇到的两者之间的区别非常少。本书是针对Python 3编写的,但我也会给出一些关于Python 2的注意事项。

Python解释器是一个读取并执行Python代码的程序。根据所在环境的不同,你可能需要点击程序图标,或者在命令行中键入python命令来启动解释器。当它启动以后,可以看到如下输出:

Python 3.4.0 (default, Jun 19 2015, 14:20:21) [GCC 4.8.2] on linuxType "help", "copyright", "credits" or "license" for more information. >>>

前3行文本包含了解释器和所运行的操作系统的信息,所以可能与你看到的有些区别。但你应当检查版本号是否以3开头(本例所示的是3.4.0),表示你使用的是Python 3的解释器。如果版本号以2开头,那么(你肯定猜到了)解释器是Python 2。

最后一行是一个提示符,表明解释器已经准备好,等待你键入代码。如果你键入一行代码并按下Enter键,解释器会显示结果:

>>> 1 + 12

3 第一个程序

计算机科学家眼中的Python程序之道

依照传统,用新语言编写的第一个程序叫“Hello, World!”,因为这个程序所做的事情就是只显示“Hello, World!”。在Python中,它是这个样子:

>>> print('Hello, World!')

这是print语句的一个示例。print并不会真往纸上打印文字,而是在屏幕上显示结果。在这个例子中,输出的结果是:

Hello, World!

程序中的引号表示要显示的文本的开始和结束,在输出结果中它们并不显示。

括号表示print是一个函数。我们将在第3章中讨论函数。

在Python 2中,print语句略有不同。它不是一个函数,所以不使用括号:

>>> print 'Hello, World!'

这个区别的意义在后面会慢慢显现,但现在只需要知晓就足够了。

4 算术操作符

介绍完“Hello, World”之后,接下来是算术操作。Python提供了操作符,即像加号或减号这样的用来表达计算操作的特殊符号。

操作符+、-和*分别表示进行加法、减法和乘法运算,如下面示例所示:

>>> 40 + 242>>> 43 – 142>>> 6 * 742

操作符/表示除法运算:

>>> 84 / 242.0

这里你可能会奇怪为什么结果是42.0而不是42。我会在下一节解释。

最后,操作符**表示进行指数运算。也就是说,会把一个数按指数进行乘方:

>>> 6**2 + 642

在其他一些语言中,指数操作用^符号表示,但在Python中^这个符号已经用来表示二进制按位运算XOR了。如果你不熟悉按位运算,结果可能会让你感到奇怪:

>>> 6 ^ 24

本书我不会讨论按位操作符,但读者可以在http://wiki.python.org/moin/BitwiseOperator上阅读相关文档。

5 值和类型

值(value)是程序操作的最基本的东西,如一个字母或者数字。前面我们见过一些值,如2、42``.0以及'Hello,World!'。

这些值属于不同的类型(type):2是整型(integer)的,42``.0是浮点型(floating-point)的,而'Hello,World!'是字符串(string)类型的,这么称呼是因为它是由一堆字母“串连”起来的。

如果不确认一个值的类型,解释器可以告诉你:

>>> type(2) >>> type(42.0) >>> type('Hello, World!')

在这些结果中,单词“class”(类)被用于某一类型中,这是一种值类型。

不足为奇,整数属于'int'类型, 字符串属于'str'类型,而浮点数属于'float'类型。

那么'2'和'42.0'这样的值呢?它们看起来像是数字,但又使用字符串常用的引号括起来:

>>> type('2') >>> type('42.0')

它们是字符串。

当输入一个很大的数字时,你可能会忍不住想在数字中间加上逗号,就像1,000,000这样。在Python中这并不是合法的整数,但它凑巧又是一个合法的表达式:

>>> 1,000,000(1, 0, 0)

当然,这和我们预期的完全不同!Python把1,000,000解释成一个用逗号分隔的整数序列。关于这种序列在本书后面可以学到更多内容。

6 形式语言和自然语言

自然语言是指人们所说的语言,如英语、西班牙语和法语。它们不是由人设计而来的(虽然人们会尝试加以语法限制),而是自然演化而来的。

形式语言则是人们为了特殊用途设计的语言。例如,数学上使用的符号体系是一种特别擅于表示数字和符号之间关系的形式语言;化学家则使用另一种形式语言来表示分子的化学结构。而最重要的是:

编程语言是人们为了表达计算过程而设计出来的形式语言。

形式语言倾向于对语法做出严格的限制。例如,3 + 3 = 6是语法正确的数学表达式,但3+ = 3$6则不是。H2O是语法正确的化学方程式,而2Zz则不是。

语法规则有两种,分别适用于记号(token)和结构(structure)。记号是语言的基本元素,如词、数字和化学元素。3+ = 3$6的一个问题就是$在数学表达式中(至少就我所知)不是合法记号。相似地,2Zz不合法是因为并不存在缩写为Zz的化学元素。

第二种语法规则指定记号所组合的方式。数学等式3+ = 3不合法,因为虽然+和=是合法记号,但不能将它们连续放置。相似地,在化学表达式里,下标数字应该出现在元素名称之后,而不是之前。

“This is @ well-structured Engli$h sentence with invalid t*kens in it.”是一个结构良好,但包含非法记号的英语语句。“This sentence all valid tokens has, but invalid structure with.”这句话所有的记号都合法,但是语句结构不合法。

当你阅读英语的句子或形式语言的语句时,需要弄清句子的结构是什么(虽然在自然语言中这个过程是下意识完成的)。这个过程称为语法分析。

虽然形式语言和自然语言有很多共同的特点—记号、结构、语法以及语义,但它们也有一些区别。

歧义性:自然语言充满了歧义,人们通过上下文线索和其他信息来处理这些歧义。形式语言通常设计为几乎或者完全没有歧义,即不论上下文环境如何,任何表达式都只有一个含义。

冗余性:为了弥补歧义,减少误解,自然语言采用大量的冗余。因此,自然语言往往很啰嗦。形式语言则相对不那么冗余,更加简洁。

字面性:自然语言充满了习惯用语和比喻。例如,有人说,“硬币掉了”(The penny dropped[1]),并不一定是硬币,也不一定是有什么掉了。形式语言则严格按照它的字面意思表达含义。

因为我们都说着自然语言长大,有时候很难适应形式语言。在某种意义上,形式语言和自然语言的区别与诗词和散文的区别类似,而且程度更甚。

诗词:字词的使用,既考虑它们的音韵,也考虑到它们的意义,而整首诗合起来表达某种意境或情绪反应。歧义不仅常见,而且常常是刻意为之。

散文:字词的意义更加重要,而且句子的结构也提供更多的意义。散文比诗词更容易分析,但仍然有不少歧义。

程序:计算机程序的意义不含歧义,直接如字面所指。完全可以通过它的记号和结构理解其意义。

形式语言的密度远远大于自然语言,所以阅读起来需要花费更多的时间。还有,结构非常重要,所以直接自顶向下、从左至右的阅读顺序并不一定是最好的。相反,要试着学会在头脑中解析程序,辨别出记号并解析出结构。最后,细节很重要。在自然语言中常常可以忽略的小错误,如拼写错误或者标点符号错误,在形式语言中往往会造成很大的差别。

7 调试

程序是很容易出错的。因为某种古怪的原因,程序错误被称为bug,而查捕bug的过程称为调试(debugging)。

一个程序中可能出现3种类型的错误:语法错误、运行时错误和语义错误。对它们加以区分,可以更快地找到错误。

编程,特别是调试,有时候会引发强烈的情绪。如果你挣扎于一个困难的bug,可能会感觉到愤怒、沮丧以及窘迫。

有证据表明,人们会像对待人一样对待电脑。当电脑良好完成工作时,我们会把它们当作队友,而当它们难以控制、粗暴无礼的时候,我们会按照对待那些粗暴固执的人一样对待它们(The Media Equation: How People Treat Computers, Television, and New Media Like Real People and Places,Reeves和Nass著)。

对这些反应行为有所准备,可能会帮助你更好地对待电脑。一种方法是把它当作你的雇员,它有一定的长处,如速度和精度,也有特定的弱点,如没有同情心和无法顾全大局。

你的任务是做一个好经理:设法扬长避短,并找到方法控制你的情绪去面对问题,而不是让你的反应影响工作效率。

学习调试可能会带来挫折感,但它是一个有价值的技能,并在编程之外还有很多用途。每章的结尾处都有一节类似于本节的关于调试技巧的讨论。希望它们能带来帮助!

8 术语表

问题求解(problem solving):总结问题、寻找解决方案以及表达解决方案的过程。

高级语言(high-level language):设计来方便人们读写的编程语言,如Python。

低级语言(low-level language):设计来方便计算机执行的编程语言,也被称为“机器语言”或“汇编语言”。

可移植性(portability):程序的一种属性:可以在多种类型的计算机上运行。

解释器(interpreter):一个读取其他程序并执行其内容的程序。

提示符(prompt):解释器显示的文字,提示用户已经准备好接收用户的输入。

程序(program):一系列代码指令的集合,指定一种运算。

print语句(print statement):一个指令,可以通知Python解释器在屏幕上显示一个值。

操作符(operator):一种特殊符号,用来表达加法、乘法或字符串拼接等简单运算。

值(value):程序操作的数据基本单位,如一个数字或一个字符串。

类型(type):值的类别。到目前为止我们已经见过的类型有整数(int)、浮点数(float)和字符串(str)。

整型(integer):用来表示整数的类型。

浮点型(floating-point):用来表示带小数部分的数的类型。

字符串(string):用来表示一串字符的类型。

自然语言(natural language):自然演化而来的人们所说的语言。

形式语言(formal language):人们设计为某些特定目的(如表达数学概念或者计算机程序)设计的任何一种语言。所有编程语言都属于形式语言。

记号(token):程序的语法结构的最基本单位,类似于自然语言中的词。

语法(syntax):用于控制程序结构的规则。

语法分析(parse):检查程序并分析其语法结构。

bug:程序中的错误。

调试(debugging):发现和纠正bug的过程。

[1]  “The penny dropped”在英语里的意思是:经过一段困惑后,突然理解了某个事情。——译者注

本文节选自《像计算机科学家一样思考Python(第2版) 》

内容简介

在学习和研究机器学习的时候,面临令人眼花缭乱的算法,机器学习新手往往会不知所措。本书从算法和Python语言实现的角度,帮助读者认识机器学习。

本书专注于两类核心的“算法族”,即惩罚线性回归和集成方法,并通过代码实例来展示所讨论的算法的使用原则。全书共分为7章,详细讨论了预测模型的两类核心算法、预测模型的构建、惩罚线性回归和集成方法的具体应用和实现。

本书主要针对想提高机器学习技能的Python开发人员,帮助他们解决某一特定的项目或是提升相关的技能。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

本文转载自异步社区。

软件开发 编程语言 python

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringCloud系列:亿级流量系统架构之如何设计承载百亿流量的高性能架构【石杉的架构笔记】
下一篇:Oracle 11GR2单机一键部署(sh脚本)
相关文章