如何像计算机科学家那样思考Python篇(第一、二章)

这篇博客主要是《如何像计算机科学家那样思考》此书的翻译,主要是对代码的记录,并不是对全书的全面翻译。

程序之路

第一个程序

这个程序只是简单地在屏幕上显示一段文字
Python2.7

1
print "Hello, World!"

输出结果:

1
Hello, World!

Python3.5

Python3.5改变了print的语法,如果直接使用2.7的语法会报错

1
2
3
4
5
>>> print "Hello world"
File "<stdin>", line 1
print "Hello world"
^
SyntaxError: Missing parentheses in call to 'print'

正确的写法

1
print("Hello, World!")

输出结果:

1
Hello, World!

变量,表达式和语句

值和数据类型

值是最基础的事物之一(比如一个字母或者数字),也是程序所操作和控制的基础事物。

我们看到过的值有2"Hello, World!",它们属于不同的数据类型2是整数类型,"Hello, World!"是字符串类型(因为它是由一串字符组成的)。你和编译器都知道这是字符串,因为他被两个双引号包围。

如果你不清楚一个值的类型是什么,那么可以使用下面的代码来得到值的类型

Python2.7

1
2
3
4
>>> type("Hello, World!")
<type 'str'>
>>> type(17)
<type 'int'>

Python3.5

1
2
3
4
>>> type("Hello, World!")
<class 'str'>
>>> type(17)
<class 'int'>

显而易见的,字符串属于类型str,整数属于类型int。不过带有小数点的数字属于类型float

Python2.7

1
2
>>> type(3.2)
<type 'float'>

Python3.5

1
2
>>> type(3.2)
<class 'float'>

Python中的字符串可以用单引号包括或者用双引号包括。如果最外面用双引号代表字符串,那么字符串里面可以包含单引号,比如"Bruce's beard。同样的,如果最外面使用单引号代表字符串,里面可以包含双引号,比如'The knights who say "Ni!"'

此外还有使用三个单引号进行包含的字符串,例如:

1
2
3
>>> print('''"Oh no", she exclaimed, "Ben's bike is broken!"''')
"Oh no", she exclaimed, "Ben's bike is broken!"
>>>

另外,平时针对大整数的使用逗号分割的写法在Python中是不识别的(虽然不会有语法错误),例如:

Python2.7

1
2
>>> print 1,000,000
1 0 0

Python3.5

1
2
3
>>> print(42,000)
42 0
>>>

变量

编程语言其中一个重要的特性就是操作控制变量的能力。

赋值语句可以产生新的变量并且赋给他们值:

1
2
3
>>> message = "What's up, Doc?"
>>> n = 17
>>> pi = 3.14159

上面这个例子给出了三个句子。第一个把字符串"What's up, Doc?"赋值给一个叫做message的新变量。第二个语句把整数17赋值给n,第三个语句把浮点数3.14159赋给pi

这里注意,赋值运算符**=,并不是我们平时数学意义上的等号(哪怕他们是同样的符号)。赋值运算符把等号左边称为变量名字,右边是想要付给这个变量的值**,这就是为什么你输入以下代码会报错:

1
2
3
>>> 17 = n
File "<interactive input>", line 1
SyntaxError: can't assign to literal

变量名和关键字(保留字)

通常来说,程序员会为他们的变量选择恰当的名字——他们会记录下这个变量的用途。

变量名可以很长。其中可以包含字母和数字,但是必须以字母开头。尽管使用大写字母是合法的,但是传统上我们不会这样做。变量名是大小写敏感的:Brucebruce是不同的变量。

下划线字符(_)是可以使用在变量名中的,它经常被用于变量名中用于切分多个单词的情况,比如说my_name或者price_of_tea_in_china

如果你使用了不合法的变量名,Python会报错:

1
2
3
4
5
6
>>> 76trombones = "big parade"
SyntaxError: invalid syntax
>>> more$ = 1000000
SyntaxError: invalid syntax
>>> class = "Computer Science 101"
SyntaxError: invalid syntax

76trombones是不合法的,因为他没有使用字母开头。more$是不合法的,因为它里面包含了一个不合法的美元符号$。但是class这个变量名哪里错了呢?

这其实是因为class是Python语言定义的关键字之一。关键字定义了编程语言的语法规则和结构,他们不能被当做变量名使用。

Python 关键字

Python2.7

Python3.5

语句

一个语句就是一条Python解释器能够执行的指令。我们现在看到了两种语句:print和赋值语句。

当你在命令行中输入一个语句,Python会执行并且把结果显示出来(如果有结果的话)。print语句的结果是一个值,赋值语句不会产生结果。

一个脚本通常包含一序列的语句,如果有多于一个的语句的话,结果会按照脚本中语句执行的顺序来显示,例如脚本:

1
2
3
print 1
x = 2
print x

会产生输出:

1
2
1
2

表达式求值

一个表达式是值,变量,运算符的组合。如果你在命令行中输入一个表达式,解释器会计算并且把表达式的结果显示出来:

1
2
>>> 1 + 1
2

表达式的求值会产生一个值,这也是为什么表达式可以放在赋值语句的右边。单独的一个值本身也是一个简单的表达式,一个变量也是一个表达式

1
2
3
4
>>> 17
17
>>> x
2

但是计算一个表达式和打印一个值并不是同样的事情,例如:

1
2
3
4
5
>>> message = "What's up, Doc?"
>>> message
"What's up, Doc?"
>>> print message
What's up, Doc?

操作数和操作符

操作符是特别的符号,用来代表计算类型,比如加号和乘号。被操作符使用到的值,称为操作数

以下是一些合法的Python表达式:

1
20+32   hour-1   hour*60+minute   minute/60   5**2   (5+9)*(15-7)

符号+,-*,以及用来进行优先级分组的小括号,在Python中和数学中有着相同的用法。*是乘法的符号,**是幂次运算的符号:

1
2
3
4
>>> 2 ** 3
8
>>> 3 ** 2
9

在Python3中,除法符号/总是会按照浮点数的除法运算方法进行计算(在Python2.7中是整除的意思)。当我们想要使用整除的时候,可以使用//,也被叫做向下取整除法

1
2
3
4
5
6
7
8
>>> 7 / 4
1.75
>>> 7 // 4
1
>>> minutes = 645
>>> hours = minutes // 60
>>> hours
10

参考代码

参考文献