像计算机科学家一样思考python-第2章 变量、表达式和语句
感想:
1.程序出现语义错误时,画状态图是一个很好的调试办法。打印出关键变量在不同代码处理后值的变化,就能发现问题的蛛丝马迹。
2.每当学习新语言特性时,都应当在交互模式中进行尝试,并故意犯下错误,看会有哪些问题--这是很好的学习思路。这样子学习不但能对知识掌握的更扎实,还让学习变得充满乐趣,像是一种游戏一样。
赋值语句可以建立新的变量,并给它们赋值
In [1]: message = 'And now for somthing completely different'
In [2]: n = 17
In [3]: pi = 3.1415926535897932
这个例子有3个赋值。第一个将一个字符串赋给叫做message的变量; 第个将17赋值给n,第三个将π的(近似)值赋给变量pi。
在纸上表达变量的一个常见方式是写下名称,将用箭头指向其值。这种图称为状态图,因为它显示了每个变量所在的状态(请将它看作变量的心理状态)。下图显示了前面例子的状态图。
2.8调试
一个程序中可能出现3种错误:语法错误、运行时错误和语义错误。对它们加以区分,可以更快的找到错误。
语法错误
语法指的是程序的结构以及此结构的规则。例如,括号必须前后匹配,所以(1+2)是合法的,而8)就是一个语法错误。
程序中只要出现一处语法错误,Python就会显示出错消息并退出,你的程序就无法运行了。在编程生涯的最初几周中,可能会需要花费大量时间来查找语法错误。但随着经验的增加,犯错会越来越少,查找起来也会越来越快。
运行时错误
第二类错误是运行时错误,这样称呼是因为这种错误只有程序运行后才会出现。这些错误也被称为异常(exception),因为它们常常表示某些异常的(而且不好的)事情发生了。
运行时错误在开头几章的简单示例里很少会出现,所以可能要过一段时间你才会遇到。
语义错误
第三类错误是语义错误,意思是错误与含义有关。如果你的程序中有一个语义错误,程序仍会成功运行,而不会产生任何出错消息,但是它不会执行正确的逻辑。它会做其它的事情。特别需要注意的是,它所做的正是你的代码所告诉它的。
查找语义错误会比较麻烦,因为需要反向查找,查看程序输出并尝试弄明白它到底做了什么。
2.9术语表
变量(variable):引用一个值的名字。
赋值语句(assignment statement):将一个值赋值给变量的语句。
状态图(state diagram):用来展示一些变量以及其值的图示。--调试的好帮手
关键字(keyword):编译器或解释器保留的词,用于解析程序;变量名不能使用关键字,如if,def,while等。
操作数(operand):操作符所操作的值
表达式(expression):变量、操作符和值的组合,可以表示一个单独的结果值。
求值(evaluate):对表达式按照操作的顺序进行计算,求得其结果值。
语句(statement):表示一个命令或动作的一段代码。至今我们见过赋值语句和打印语句。
执行(execute):运行一条语句,看它说的是什么
交互模式(interactive mode):使用Python解释器的一种方式,从脚本中读入代码并运行它。
脚本(script):保存在文件中的程序
操作顺序(order of operations):当表达式中有多个操作符和操作对象要求值时,用于指导求值顺序的规则。
拼接(concatenate):将两个操作数首尾相联。
注释(comment):代码中附加的注解信息,用于帮助其他程序员阅读代码,并不影响程序的运行。
语法错误(syntax error):程序中的一种错误,导致它无法进行语法解析(因此也无法被解释器执行)
异常(exception):程序运行中发现的错误
语义(semantics):程序表达的含义。
语义错误(semantic error):程序中的一种错误,导致程序所做的事情不是程序员设想的。
2.10练习
重申上一章的建议,每当你学习新语言特性时,都应当在交互模式中进行尝试,并故意犯下错误,看会有哪些问题。
- 我们已经见过n=42是合法的。那么42=n呢?
1 In [4]: 43=n 2 3 File "<ipython-input-4-7a69874ac013>", line 1 4 5 43=n 6 7 ^ 8 9 SyntaxError: can't assign to literal
- 那么x=y=1呢
1 In [5]: x=y=1 2 3 4 In [6]: x 5 6 Out[6]: 1 7 8 9 In [7]: y 10 11 Out[7]: 1
- 有些语言中,每个语句都需要以分号(;)结尾。如果你在Python语句的结尾放一个分号,会有什么情况?
;作为连接符
1 In [8]: a=1;b=2
2
3
4 In [9]: a
5
6 Out[9]: 1
7
8
9 In [10]: b
10
11 Out[10]: 2
- 如果在语句结尾放的是句号呢?
1 In [11]: a=3.b=2
2
3 File "<ipython-input-11-00f212b8143d>", line 1
4
5 a=3.b=2
6
7 ^
8
9 SyntaxError: invalid syntax
其它情况。.放在赋值语句后面,且值是整数,则Python认为你输入的是浮点型数据(小数)
1 In [12]: a=1;
2
3
4 In [13]: a
5
6 Out[13]: 1
7
8 #值是整型
9 In [14]: a=1.
10
11
12 In [15]: a
13
14 Out[15]: 1.0
如果.是放在赋值语句后面,且值是非整数,就会报错
1 #值是字符型
2 In [18]: x*y
3 Out[18]: 2
4
5 In [19]: a="bb".
6 File "<ipython-input-19-35d6cdca8521>", line 1
7 a="bb".
8 ^
9 SyntaxError: invalid syntax
10
11 #值是浮点型
12 In [20]: a = 1.9.
13 File "<ipython-input-20-d03258cd8a31>", line 1
14 a = 1.9.
15 ^
16 SyntaxError: invalid syntax
- 在数学标记中,对于x乖以y,可以这么表达:xy。 在Python中这样尝试会有什么结果?
1 In [16]: x=1;y=2
2
3
4 In [17]: xy
5
6 ---------------------------------------------------------------------------
7
8 NameError Traceback (most recent call last)
9
10 <ipython-input-17-f3603995b6f3> in <module>
11
12 ----> 1 xy
13
14
15 NameError: name 'xy' is not defined
16
17 #正确示例
18
19 In [18]: x*y
20
21 Out[18]: 2
22
23