你曾经想知道计算机是如何工作的吗?尽管我们不能在一篇文章里面教会你所有的东西,但是可以通过学习如何写出你自己的程序来获得一个良好的开端。在这篇Python教程中,你将会学到计算机编程的基础知识,使用对新手来说最棒的编程语言之一。
什么是编程?
尽可能简单的讲,编程是编写代码,命令计算机去完成某项任务的艺术。这里讲的某项任务,可以是简单的两数相加,或是像把飞船送入轨道这样的复杂任务!
一个程序里面,最小的组成部分被称作语句(statement)——代表了对计算机做出的一条指令。
当你完成了自己的程序后,编译器会把你写的代码转换为机器码——计算机语言的最底层。机器码指示中央处理器工作(central processing unit),或者叫做CPU,这里面包含一些诸如加载某个值或是做数学运算的步骤。
如果你曾经听过某人说:“我编译了我的程序”,那代表他们已经把代码转换成了机器码。
为什么不直接写机器码呢?原因很显然,程序码具有可读性。下面比较了Python版的程序和其对应的机器码:
Python代码
1
2
3
|
print "Hello, World!" ... "Hello, World!" |
对应的机器码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
c7 3c 2a 3c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... "Hello, World!" |
很明显为什么你不会想要直接编写机器码了。但是,确实有一些人会去写机器码——萝卜白菜各有所爱嘛!
上面我们忽略了一个小问题。Python是一种解释型语言;你并不会像上面我们暗示的那样,把它直接编译成为机器码。
实际上是这样的,Python使用一个叫做解释器的东西。解释器是另外一个程序,把代码编译成叫做二进制码的东西,然后再程序运行的时候再转换成机器码。你等下会学到更多和解释器有关的内容。
当你最终运行程序的时候,你刚编译的那些机器码会被加载到内存中,CPU会读取它并执行程序。
然而,在刚开始学习使用Python编程的时候,你并不需要完全理解编译器的内部工作原理,但是你必须确保你已经安装了Python。
准备开始
如果你在使用Mac,你走运了——Python已经预装在Mac中了。在Mac中使用Python解释器,打开**终端**(**Terminal.app**);你可以再应用程序/工具文件夹下找到它,或者在Spotlight中输入,像这样:
打开终端后,输入下面的指令然后按下回车:
1
|
$ python |
你会看到类似下面这样的结果:
注意:如果你没有得到上面的结果,把输出结果复制到论坛,我们会尽力帮助你的!**
Windows
在Windows上,这一过程稍微有点复杂——但是还是要说,大部分的东西还是在Windows!上:]
首先,在浏览器中访问Python官网的下载页面。
滚动页面跳过所有的Python 3.x.x版本,直接到Python 2.7.x。下载Windows安装包(Windows installer),运行,按照指引来做,接受默认的选项。
一旦安装包安装完成,你就可以启动它了。
在Windows Vista或者Windows 7上,这样启动:
1. 点击左下角的开始菜单。
2. 点击所有程序
3. 打开Python文件夹
4. 双击IDLE解释器
如果你使用Windows 8,这样启动:
1. 点击左下角开始菜单
2. 在搜索框中输入IDLE
3. 点击IDLE(Python GUI)
不管你是如何启动解释器的,你应该确保它能够工作,在终端中输入如下命令,或者是在Windows的命令提示符中输入如下指令并按回车:
1
|
print “Hello World!” |
尽管看上去并不像,但是你已经写完你第一个Python程序了!在学习大多数语言的时候,打印出Hello, World被认为是一个起点。
`python` 命令指示计算机在屏幕上输出后面的字符——而不是在你的打印机上打印!注意“Hello World”两边的引号,引号中的任何东西都被看做常规的文本儿不会被解释为一个指令。
变量
变量,是在计算机内存中存放数据的一种方式;在你的程序中你会经常用到它们。在一些语言中,变量有特定的类型,指明了这些变量属于那些类。
在Python中,你不需要声明变量的类型。现在暂时不需要在意这些细节;在本教程稍后的章节中你会学到关于这个内容的知识。
在解释器中输入如下命令并按回车:
1
|
hello = "Hello World!" |
这么做声明了hello变量并且把Hello World赋值类了它。现在,你不需要在程序中需要“Hello World”的地方输入这个字符串了,取而代之的是,你可以使用hello这个变量。
在解释器中输入如下命令并按回车:
1
|
print hello |
这个指令会产生和Hello World例子相同的结果,但是它是打印出了hello这个变量的值。
变量同样也可以用来储存数字。在解释器中输入如下命令:
1
2
3
4
5
|
x = 5 print x y = 10 z = x + y print z |
注意:从现在起,你可能要输入多行语句,只需要在每行末尾输入回车即可**
先猜猜看上面的代码会做些上面,再看下面的答案:
这段代码会打印5,然后打印15.第一个`print`语句打印了被你赋值为5的变量x。然后它打印了y+x的结果。因为y被赋值为10,x是5,所以打印了15。
对于你生命中的绝大部分程序变量是其核心。在你学习本教程的过程中,你会对变量变得非常熟悉。
变量类型
在之前的教程中你已经遇到了变量,但是我们并没有仔细的介绍它。不同的变量类型存储不同类型的值。
注意:对于全部的内建类型,请查看Python官方文档
到目前为止,你仅仅和Python中两个基本类型打过交道:整型(`integers`)和字符串型(`strings`),你还会遇到布尔类型(`boolean`),你可以用它来储存`True`或者`False`。
下面有关于这些变量类型的一点介绍:
整型
一个整型数,是一个整数。整型数的范围,在32位机上是-2147483648 到 2147483647 ,在64位机上是 -9223372036854775808 to 9223372036854775807。
你可以像这样简单的输入一个数字来创建整型,不需要任何引号:
1
|
foo = 5 |
字符串型
字符串是一串字符;你可以使用字符串来表示很多东西,从屏幕上的任何文本到整个网页请求。
通过用引号包含一串字符来创建字符串,就像下面一样:
布尔类型
布尔类型代表了True或False。
你通过使用大写开头的True或False 来创建布尔类型,不需要引号,就像下面这样:
1
|
`isFoo = True ` |
变量两边没有引号;如果你用引号包含了True,你则是创建了一个字符串类型!
字符串连接和整数相加
Python让两个字符串钩在一起变得很容易,我们也称之为字符串连接。你可以使用`str()`把一个整数类型转换成字符串,相反,你也可以使用`int()`把一个字符串转换为整型。
在你的解释器中输入下面指令:
1
2
3
|
"1" + "1" 1 + 1 1 + int ( "1" ) |
下面解释上面代码做了些什么:
- 第一条语句连接了两个字符串;引号确保了这两个数字被当做字符串除了。结果就是”11″。
- 第二条语句把两个数作为整数相加,结果是2.
- 最后一条语句把一个整数和另一个被转换为整数的字符串相加,结果还是2。
if 语句
if语句检查某个条件是不是真,如果是,则执行一段代码。条件语句通常是这样的形式`值 – 操作符 – 值`,通常是比较两个值。
比如,你可以使用`x == 0`评价一个值是不是等于0,`==` 是等于操作符。
下面是Python中的一些常见比较
1
2
3
4
5
6
|
a = = b: #Checks if a and b are equal a ! = b: #Checks if a and b are not equal a > b: #Checks if a is greater than b a < b: #Checks if a is less than b a > = b: #Checks if a is greater than or equal to b a < = b: #Checks if a is less than or equal to b |
if语句是如下的形式:
1
2
|
if conditional: do_statements_here |
注意到`在这里执行某些语句` 这行是如何缩进的。这是你在Python声明代码块的方式。同一个代码块中的每一行都必须和其他所有行缩进相同的制表符或是空格;这是语言强制规定的。换句话说,不要混合使用制表符和空格。创建一个if语句,在解释器中输入如下命令:
迎接你的是神秘的提示符`…`;这表示解释器在等待你输入代码块的内容,按下Tab键,输入第二行:
再次按下回车,你的光标回到了控制台的最左边。要想再输入一个代码块语句,只需要再按Tab。如果你输入完了,按下回车告诉解释器你的代码块已经完成。
看一下下面的例子:
1
2
3
4
5
6
|
x = 10 y = 10 if x = = 10 : print "x equals 10!" if x = = y: print "x equals y!" |
第一条语句判断x是不是等于10,如果是的话,打印`x equals 10!`。另外一个if语句判断x是否等于y,如果是的话,打印`”x equals y!”`.
for循环
for循环再Python中遍历列表中的项目并且把当前项目赋值给变量。一个列表几乎可以是任何东西的集合!
输入下面的代码,并且像下面这样缩进:
1
2
|
for x in range(10): print x |
在这个例子中,`range(10) ` 生成了数字0到9的一个列表。for循环一次把范围内的数字赋值给x。就像if语句一样,for循环执行它下面缩进中的每个语句。在上面的例子中,缩进的代码块里面只包含了一个单独的语句。
因为print被调用了10次,对于列表中的每个项目调用一次,这个程序会打印0到9的数字。
函数
函数是可以重用的代码块,用来完成某个特定的代码块。比如说,你可以写一个函数用来把两个数相加,或是打印一个字符串。你可以像下面例子展示的一样定义并调用函数。
1
2
3
4
|
def hello(): print "Hi" for x in range ( 3 ): hello() |
在运行前,你可以猜猜看这个程序的输出是什么吗?答案见下文:
它会打印出“Hi”三次,因为for循环会调用这个hello函数三次。
缩进的代码块定义了你调用函数时要执行的语句。因为`print “Hi”` 是这个函数里唯一缩进的语句,所以当调用函数时也是唯一被执行的语句,而不是下面的几行。
你可以通过输入结尾带有一对括号的函数名来调用函数,像之前展示的那样,`hello()` 调用了你上面调用的函数。函数有点类似有围墙的花园:它们不能看到它们那一亩三分地意外的世界。这个被称作`变量作用域`。如果你想要让一个函数和外界的数据协同工作,你需要把这些数据传递给函数。
使用`参数`(arguments)可以达到这一目的——不不不,函数之间是不会相互争吵(argue)的!
参数是一个你传递给函数的一个变量;然后函数就可以在内部使用这个参数的值了。
你可以像下面这样声明一个带参函数:
1
2
|
def add(a, b): print a + b |
上面的函数定义了两个参数,a和b,放在括号里面,用逗号相互隔开。当你调用这个函数的时候,解释器会吧a和b的值设置为你传入变量的值。
看一下下面这个例子:
1
2
3
|
def add(a, b): print a + b add( 1 , 2 ) # prints 3! |
在上面的例子中,`add(1,2)` 这条语句把a和b分别设置为1和2。然后函数打印了你传入的两个数的和。上面的例子打印了计算结果——但是如果你想要用这个计算结果做些事情呢?如果你想要把这个函数的结果加上别的一个值呢?
为了做到这一点,你需要给你的函数加一个`return 语句`。
考虑如下代码:
1
2
3
|
def add(a,b): return a + b print add( 2 , 2 ) + 1 |
在上面的例子中,你的函数像之前一样把两数相加,但是`return`(返回)语句把两数和传回了函数调用语句。
这意味着上面的`print` 语句得到了add(2,2)返回的值然后把它加1,最后会给你的结果是5。
While 循环
while循环和for循环类似。for循环一直进行,直到到达列表的末尾,但是while循环会不定的循环,直到给定条件的值等于False。一个while循环的典型结构是下面这样:
1
2
|
while (conditional): run_statement |
通常,条件变量会在循环运行过程中更新。在解释器中输入下面的程序,来看看这一过程:
1
2
3
4
|
x = 0 while x < 10 : print x x + = 1 |
这个程序的行为类似于上面的for循环,但是使用了while循环。这是上面程序所做的事情:
1. 给x赋值0
2. 检查是否满足 `x < 10`
3. 如果`x < 10` 的值是`True`, 执行下面的代码块. 如果是 `False` 退出循环
4. 打印`x`
5. 把 `x` 值加1
使用while循环需要注意一件事,就是不要创建死循环。
在解释器中输入下面的程序,来看看死循环是什么样的:
1
2
3
4
|
x = 0 while True : print x x + = 1 |
哇啊——终端疯了吧?按Ctrl+C来终止程序吧。
刚才发生了什么?如果你仔细看,你会发现while循环的条件,True永远无法变成False,所以这段代码会以CPU能够执行的最快的速度打印数字。
这个故事告诉我们:当写while循环的时候要时刻保持小心,因为你代码里面的无限循环,对于真实世界来讲,不太会是什么好事!
使用True作为while循环的条件是有可能的,尤其是当你不知道要循环多少次的时候。但是你需要一些技巧来退出这个循环。
在解释器中输入下面的代码:
1
2
3
4
5
6
|
x = 0 while True : print x x + = 1 if x > 10 : break |
这样就好多了!上面的代码会打印0到10然后退出。这里用到的技巧是break语句,它会直接跳出循环。不论出于何种原因,如果你想要在for循环中提前跳出,也可以使用这个技巧。
捕获用户输入
Python中一件很酷的事情是可以非常简便的以文本的方式获取输入用户输入。输入是指任何从外部提供给程序的数据,比如文本或者是其他会影响程序行为的指令。
在你的解释器中输入下面代码:
1
2
|
name = raw_input ( "What is your name? " ) print "Hello, " + name |
上面的代码首先会让你进行输入;一旦用户输入了问题的答案,程序会把它赋值给name变量。这一过程完成后,程序会连接字符串“Hello,”和变量name 的内容。
raw_input()函数是Python内建函数;它完成打印从控制台输入字符串的工作,捕获用户输入的文本,然后把它们作为函数值返回。
利用上面捕获输入的技术,你可以创建简单的计算器。在你的解释器中输入下面的代码:
1
2
3
|
a = raw_input ( "Number 1: " ) b = raw_input ( "Number 2: " ) print int (a) + int (b) |
首先,你捕获了两个用户输入的值然后把它们分别赋值给a和b。然后你把他们转换成了整型并相加。
为什么要有转换这一步呢?仅仅是因为解释器中所有的输入都是以字符串形式进行的,而你是希望吧两个整数的值相加。
如果你不转换这些字符串为整数,你觉得会怎样呢?没错,程序会连接你输入的字符串,这并不是你想要的!
导入
在我们深入研究导入之前,介绍一下Python的模块是必要的。一个模块,是一组Python函数的集合,你希望在不同的程序中重用它们。导入一个模块等价于从一个模块中把所有的代码取出来放到你自己的程序里面所以你可以在任何时候去使用他们,但是又不需要去剪切和复制,哪怕是一行代码!
在Python社区中,存在着大量的模块,但是目前来讲,你仅会接触到随机数模块(random module)。
要导入模块,在解释器中输入下面的代码:
1
|
import random |
一旦导入了模块,你就可以像下面这样使用它了:
1
|
print random.randint( 0 , 100 ) |
这将会打印0到100间随机的整数;很直观的东西。到目前为止你已经学到很多知识了,足以把他们揉在一个小程序里来练习一下你目前学到的知识了!
猜谜游戏
这将是你辛苦学习Python编程得到的回报。你将创造属于你自己的猜谜游戏!
首先,你需要一个与在解释器中一句一句直接执行程序相比更好的方式。
为了做到这一点,你需要创建Python文件。
Mac
在Mac系统下创建Python文件,在终端中输入下面的命令:
1
2
|
$ touch guess.py $ open - t guess.py |
这将会使用`touch` 命令创建一个空的`guess.py` 文件,然后通过`open -t`命令,使用默认的文本编辑器打开它,
一旦你的Python文件中有了一些内容后,你就可以在终端中输入`python guess.py` 来执行它。
Windows
在Windows系统下,点击IDLE中的文件按钮(File) 找到新建文件(New File)。你会发现一个文本编辑器映入眼帘,你可以在里面输入你的新程序。
再次点击文件按钮,选择保存。把文件名命名为`guess.py` 然后把它保存在你想要保存的地方。
运行你的程序,在菜单中选择RunRun,就像这样:
游戏时间!
猜谜游戏将会生成一个随机数,然后在一个循环中,反复询问游戏者他们的猜测结果。如果用户猜中,则结束循环;否则程序会提醒用户他们的猜测是过高还是过低并继续询问结果直到猜中。
1
2
|
import random number = random.randint( 0 , 100 ) |
上面这段程序会导入随机数模块,然后生成一个0到100之间的随机数并把它储存在变量number中。
接下来,你需要询问游戏者他们的答案。把这些代码加到程序的后面:
1
|
guess = raw_input ( "Guess the Number: " ) |
这段代码,和你猜的一样,让用户输入它们的答案并且把它保存在guess变量中。记住,现在这个变量是一个字符串,你需要把它转换为整型。
在程序中添加下面的代码,就加在上面的代码后面:
1
|
guess_int = int (guess) |
这个代码把用户输入的字符串转换为整型然后赋值给guess_int变量。
下面你需要比较用户猜测的值和随机数的大小。
在程序结尾添加下面的代码:
1
2
3
4
5
6
|
if number > guess_int: print "Too low!" if number < guess_int: print "Too high!" if number = = guess_int: print "You got it!" |
点击菜单按钮的RunRun Module或是在终端中输入`python guess.py` 来运行程序;当程序提示你的时候,输入数字。发生了什么?程序在你输入数字后会把结果显示到屏幕上然后就停止了。哎呀!
你想让程序循环的询问你结果直到你猜中。你需要用一个running变量来添加这个功能。
1
|
running = True |
running会被用在while循环中来控制你程序的循环。当用户输入正确的答案,程序会把running变量赋值为False然后while就会停止。
在你让用户输入结果的前面添加下面这段代码:
1
2
3
|
while running: guess = raw_input ( "Guess the Number: " ) ...etc |
下面,缩进剩下的代码到同一层,这样while循环才能认出它们是循环中的代码块。
最后,你需要添加用户获胜时,把running赋值为False的语句:
1
2
3
|
if number = = guess_int: print "You got it!" running = False |
确保if下面的两行代码被缩进两层。
运行你的程序,现在再试一下。你需要多少回才能猜中正确答案?
你最终的程序看上去是这个样子的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import random running = True number = random.randint( 0 , 100 ) while running: guess = raw_input ( "Guess the Number: " ) guess_int = int (guess) if number > guess_int: print "Too low!" ? if number < guess_int: print "Too high!" if number = = guess_int: print "You got it!" running = False |
恭喜你——你已经写出了你的第一个Python程序。别不是那么难,对吧?
从这里,到何方?
现在你已经完成了Python新手教程,我打赌你一定渴望一次挑战。尝试在你的程序中添加如下功能:
- 猜测次数统计
- 更大的随机数产生范围
- 一个电脑操控的游戏对手
如果你想要做一个稍微复杂一点的游戏,请看我的另一个教程:《Beginning Game Programming for Teens with Python》