zoukankan      html  css  js  c++  java
  • [阅读]Think Python CH1 The Way of the Program

    这本书的目的是教你像计算机科学家一样思考。这种思考方式融合了数学,工程学,和自然科学的优点。像数学家一样,计算机科学家用标准的语言表达想法(尤其是算法)。像工程师一样,他们做设计,把各个组件结合成系统,平衡不同方案利弊。像自然科学家一样,他们观察复杂系统,提出假设,并验证。

    计算机科学家一项重要技能便是解决问题的能力。解决问题的能力意味着对问题建模,寻找答案,并清楚、准确的描述答案。学习编程的过程是锻炼我们解决问题的能力非常棒的机会。这也是这一章叫做“程序之道”的原因。

     一方面,你可以学会怎样编程,这项重要的技能。另一方面,编程又是一项让问题变的更加清晰的方法。

    Python编程语言

    我们会学习Python。Python是一门高级编程语言,其他常见的的高级编程语言有:C、C++、Perl、Java。

    也有低级编程语言,例如"机器语言"和"汇编语言"。可以这样说,计算机智能运行低级语言。所以高级语言运行之前都必须先编译。编译过程会花费一点时间,这个也是高级编程语言的一点不足之处。

    它的有点就非常非常多了。首先,容易编程。用高级编程语言写程序,花费更短的时间,代码简单、易读,而且更不容易出错。其次,可移植性更强,只需要修改非常少的代码,甚至不用做任何修改,便可以在不同计算机上运行。低级编程语言智能在一种机器上运行,如果想要在其他计算机上运行,必须重新写过。

    因为这些优点,几乎所有的程序都是用高级语言编写的。低级语言只被用在个别极特殊的场合。

    两种方式将高级语言变成低级语言:解释器和编辑器。解释器读取高级语言的代码,并执行它,也就是说,代码怎么写,它就怎么做。解释器一次只处理程序的一小部分,读取代码和运行程序交替进行。

    编译器先读取全部代码,并将其翻译,然后再执行。这里,高级语言程序叫做源代码,编译后的程序叫做"object code" 或者可执行文件。程序只需要编辑一次,便可以多次执行。
    Python是一门解释性语言,运行在解释器上。解释器有两种运行方式:交互模式和脚本模式。交互模式中,输入代码,解释器直接返回结果:

    >>> 1+1
    2

    尖角符号,>>>,是解释器的提示符,表示准备就绪。输入 1+1,解释器输出2.

    另外一种方法是,将代码保存为一个文件,用解释器执行脚本文件。Python脚本的后缀为 .py 。

    执行脚本,必须告诉解释器脚本名称。例如在UNIX命令环境时,运行 dinsdale.py,在命令窗口直接输入 python dinsdale.py 即可。其他环境运行Python脚本可能略有不同,可以在Python官网(http://python.org)找到相应的命令。

    交互环境可以很方便的测试小段代码,因为可以输入代码,并立马执行。但是任何不适几行代码就能解决的问题,都需要将它保存为脚本,以便以后编辑、运行。

    什么是程序?

    程序是一系列定义如何计算的指令。它可以是数学计算,例如求解方程组,多项式求根,也可以是符号计算,例如文档中的字符串替换,或者编译一个程序(很少情况)。

    不同程序语言细节可能不同,但大致指令是相近的:

    输入:

    键盘输入、文件和其他设备。

    输出:
    将数据显示在屏幕,写到文件或者其他设备。

    计算:

    基本的数据运算,例如加、乘等。

    运行条件:

    检查条件,并运行合适的代码。

    重复:

    重复执行某些操作,操作之间可能会有一些变化。

    信吗?这些是几乎所有的指令。你使用过的任何一个程序,不管有多复杂,它都由上面这些指令组成。所以,你可以把编程看做是,把大型、复杂的任务逐步拆分、细化,直到它简单到可以用上面的基本指令完成。

    什么是调试?

    编程容易出错。因为一些原因,程序错误也被叫做bugs,寻找它们并纠错被叫做调试(debugging)。

    程序可能发生以下几种错误:语法错误,运行错误和语意错误。分清楚它们,对加快debug时间非常有帮助。

    语法错误

    Python 只有语法正确了才能运行;否则,解释器会抛出一个错误。语法表示程序的结构和规则。例如,括号必须配对,所以,(1+2)是正确的,而 8)语法错误。

    英语阅读可以容忍很多的语法错误,这也是我们读卡明斯的诗歌不会抛出一个错误的原因。Python不会,不管你代码的任何地方有一个小的语法错误,它都会丢出一个错误,并停止,导致程序无法运行。你学习编程的前几个星期,可能会花大量的时间去寻找语法错误。随着不断的尝试,犯的错误会越来越少,并且可以很快找到它们。

    运行错误

    第二种是运行错误,即运行过程中发生的错误。这种错误也被叫做异常,因为通常是因为某些异常情况发生而导致的。

    运行错误很少出现在一次运行中,它可能是运行一段时间之后才发生。

    语义错误

    第三种是语义错误,如果程序出现语义错误,它会运行成功,没有任何的错误提醒,但是它的结果是不正确的。它会做一些其它的事情,尤其,是你告诉计算机这么做的。

    问题来了,你写的程序并不是你想要的。也就是说它(语义)错了。寻找语义错误需要很灵活,它需要你重头看看程序做了些什么,会得到现在的结果。

    试验调试

    你必须掌握的一项技能便是调试。尽管它有可能让你抓狂,但它是一种财富,富有挑战性,也是编程的乐趣所在。

    某种意义上说,调试的工作就像是侦探。根据已有的线索,需要去验证那个步骤、计算导致了现在的结果。

    调试也也像做科学实验。有了导致错误的假设,就修改代码,重新测试。如果运行的结果和你猜测的一致,说明你的假设是正确的,这样,离最后的程序又近了一步。如果想法不正确,必须重新假设。就像Sherlock Holmes说的,“去除所有不可能因素,留下来的,不管多么不愿意相信,就是事实。”

    一些人认为编程和调试是同一件事情。是的,编程是逐步调试的过程,让程序和你要求的一样。事实上,编程都是从写一些代码,修修改改开始的,接着调试,接着,才得到最总的程序。

    例如,Linux是一个操作系统,它包括了数以万计的代码,它最开始只是李纳斯·托沃兹写的一个简单的程序,用作解释Intel 80386芯片。据Larry Greenfield所说,“最开始李纳斯一个切换输出AAAA和BBBB的程序项目,最终演变成了Linux。”(Linux用户指南Beta版1)。

    后面的章节会有更多关于编程练习和和调试的建议。

    形式语言和自然语言

    我们平时所说的语言是自然语言,例如,英语,西班牙语,法语。它不是人为设计的,而是自然进化而来。

    形式语言是为了适应某种场景而认为设计的。例如,公式就是一种被数学家使用的形式语言,它特别善于用来定义数字和符号的关系。化学家用形式语言表示物质的分子结构。特别重要的:

    程序语言是一种形式语言,它被用来用来表达计算。

    形式语言都有严格的语法,例如,3+3 =6 是一个合法的数学表达式,但是 3+ =3$6就不是了。H2O是一个合法的化学公式,但是2ZZ就不是了。

    语法有两层含义,标识符和句法。标识符是语言的基本元素,就想单词、数字、和化学元素一样。3+ =3$6中,$不是数学上合法的标识符(据我所知是这样),2ZZ不合法的原因是,没有元素用ZZ表示。

    第二类语法错误是句法所致;也就是,标识符的排列方法。语句 3+ = 3不是合法的,因为,尽管+和=都是合法的,但是你不能把它们其中一个放在另外一个后面。类似的,在化学公式中,下标跟在元素后面,而不是前面。

    练习1-1.

    写一句包含非法标识符,但是句法正确的英语。再写一句标识符都没有错误,但是句法错误的。

    然后阅读这段英语或者形式语言的句子,你必须去想这个句子的语法是怎样的(自然语言会潜意识去分析)。这个过程叫做语法分析

    例如,当你听到“硬币掉了”,你就会明白“硬币”是宾语,“掉了”是谓语。弄清楚了它的语法,就明白这句话的含义或者字面含义。假设你知道硬盘是什么,掉落是什么含义,你也可以明白这个句子。

    尽管形式语言和自然语言有许多相同的概念——标识符、句法、语法和语义——都存在不同之处。

    歧义:

    自然语言到处都是歧义,我们通过上下文和其他信息处理歧义。形式语言一般被设计为几乎或者完全不存在歧义,也就是说,不管上下文如何,每一个句子的的含义都是唯一确定的。

    冗余:

    为了弥补歧义和减少误解,自然语言有大量的冗余。结果就是,他们经常都很长。形式语言没有冗余,并且非常简洁。

    字面的:

    自然语言非常多的习与和比喻。如果我说,“硬币掉了”,或者根本就没有硬币,也没有东西掉了(这个习语表示一些人迷惘一阵之后才明白某些事情)。形式语言表达的仅仅是其字面含义。

    我们从小大到大都说自然语言,换成形式语言通常需要一段时间去适应。某种意义上来说,自然语言和形式语言的区别就好像是诗歌和散文的区别,便是如此:

    诗歌

      词语的发音和它的含义同样重要,整首诗歌共同营造一个情感表达的氛围。歧义普遍且经常故意为之。

    散文

      词语的字面含义更重要,句法可以表达更多的含义。散文比诗歌含义更清晰,但也避免不了歧义。

    程序

      计算机程序的含义不会存在歧义,并且是字面含义,通过分析标识符和句法就可以懂得它的全部含义。

    有一些阅读程序(或者其他形式语言)的建议。首先,形式语言比自然语言更dense, 所以要花更长的时间阅读。其次,句法非常重要,有时候从上到下,从左到右阅读并不是一个好主意。必须分析它的语法,辨别标识符和划分模块。最后,细节很重要,小的拼写错误和自然语言中可以丢掉的标点符号,都可以导致非常大的不同。

    第一个程序

    按照传统,用一门新语言写的第一个程序叫做“Hello World!”,它仅仅是答应“Hello World!”到屏幕上。用Python,它的代码如下:

    print 'Hello, World!'

    这是一个print语句的例子,它实际上没有打印任何东西到纸上面,而是输出都屏幕上面,这里屏幕上显示的文字是

    Hello, World!

    程序中引号表示要打印内容的开始开始和结束,不会出现在结果中。

    在Python 3中,print语法会有一些不同:

    print('Hello, World!')

    括号表示print是一个函数,我们将在第三章讲函数。

    这本书中会用 print语句。如果你使用的是Python 3,将print改成函数形式。除了这点,几乎没有什么不同。

    调试

    阅读本书的时候最好可以在电脑上面试一下上面的例子。大部分代码都可以在交互模式下运行,但将其保存成脚本可以尝试更多的变化。

    当测试一个新的特性时,最好尝试弄出一点错误。例如在“Hello World!”这个程序中,试试丢掉一个引号会发送什么?如果都丢掉呢?把print拼错又会怎样?

    这样测试会帮你记住阅读的内容;也会对调试有帮助,因为明白错误提示说的是什么。现在故意制造一些错误好过将来意外发生错误。

    编程,尤其是调试,需要很强的耐心,当你遇到一个很难的错误是,或许会觉得愤怒、失望,或者尴尬。

    证据表明人们会像对待其他人一样回应计算机。当他们工作好的时候,认为它是队友,当它难以控制或者鲁莽,会像对待难以控制或者鲁莽的人一样回应它(李维斯和纳斯,媒体等式:人们对待电脑,电视,和新媒体的方式和对待真实的人和地方一样。)

    提前知道这些或许可以帮助你处理他们。一种方法是把电脑想象成有特点的员工,有效率并且准确,不会生病,缺乏同情心并且无力把握大局。

    学习调试可能让人抓狂,但它是一项有价值的技能,在很多编程之外的场合都能用到。在每一章的最后都有一个调试的小节,像这一节一样,写一些我对调试的看法,希望它对你有帮助!

  • 相关阅读:
    分享关于Entity Framework 进行CRUD操作实验的结果
    总结Unity IOC容器通过配置实现类型映射的几种基本使用方法
    Python深入:Distutils发布Python模块--转载
    原创:R包制作--windows
    提高R语言速度--转载
    R 语言 Windows 环境 安装与Windows下制作R的package--Rtools
    极简 R 包建立方法--转载
    R的极客理想系列文章--转载
    如何创建R包并将其发布在 CRAN / GitHub 上--转载
    教你如何成为数据科学家(六)
  • 原文地址:https://www.cnblogs.com/zhaoxy/p/4973374.html
Copyright © 2011-2022 走看看