学一门编程语言正在变得越来越容易,只要念过高中(甚至是初中、小学),能熟练聊qq和懂得一点点office软件的人,入门一门编程语言都不在话下。我们跟别人沟通,靠的是语言,无论是说出来还是写出来,也不管是普通话还是英语。那么想要跟计算机沟通,也需要靠语言,世界上现在有很多跟计算机沟通的语言,有c,jave,javascript,php,python……这些都是编程语言,它们跟我们与别人交流的语言有何不同呢?我们与别人交流的语言是自然形成的,而编程语言是由某个人或者某几个人编写出来的。自然形成的我们称为自然语言,编程语言则属于人工语言。自然语言的语法较为松散,自由,既可以用来解决问题,也可以抒发感情、讲述故事。而计算机最初被设计的时候是用来解决各种现实生活中的问题的,所以逻辑严谨,说一不二,那么跟计算机沟通的时候也需要逻辑严谨,不容含糊,语法严格,这大概就是很多人觉得编程困难的地方吧。但不要紧,一旦我们习惯了这种严谨的语法和思考方式,将会大大提高我们解决问题的效率和正确率。
计算机使用的是二进制,通过接受到的指令执行任务,最初人们通过汇编语言(assembly language,低级语言)来与计算机沟通,告诉cpu执行什么样的指令,可是各个不同的计算机系统结构都各自有不同的汇编(assembly),并且用汇编编写程序效率低下(毕竟汇编更偏向于跟计算机沟通),所以对人类友好的高级编程语言应运而生(比如c语言),人们通过编译程序(充当了一个翻译家的角色)把高级编程语言编译成计算机可以理解的机器代码。这时候编程已经变得比之前容易了,然而更加高级的现代编程语言不断产生,使得编程的入门门槛进一步降低,python就是其中一门现代编程语言。
python是一种解释型语言,也就是说用python编写好的程序不需要提前编译,而是在运行时由解释器一行一行地把python源代码翻译成cpu可以读懂的机器代码。要运行python程序,需要从python官网下载python软件,安装到自己的电脑上。从官网下载下来的python软件中带有CPython,这是用c语言写成的python解释器,我们在命令行下运行用python编写的程序时,就是在用CPython这个解释器来翻译程序。世界上还有其他各种python解释器,比如Jython(运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行),但CPython的使用是最广泛的。经过多年发展,python最新版本(截止写作这篇文章之时)已经是3.7了,现在主要有两个大的不同版本的python,一个是python2.x.x,另一个是python3.x.x,这两个版本在实际使用中会有些微的不同,这次我们用python3.x.x来介绍编程中的基本概念。
1.准备工作
linux和mac一般都自带python2。
某些最新版本的linux发行版可能也自带python3,如果没有,请参考这里来安装使用。
最新版本的mac一般都自带python3,如果没有,请参考这里来安装使用。
Windows系统可以从https://www.python.org/downloads/下载python软件(解释器),下载最新版python3.x.x。安装的时候勾选Add Python 3.x to PATH。这样就自动设置好了python的环境变量(环境变量就是设置python程序的相关路径,让Windows可以找到python程序的安装目录)。
python编程有命令行和图形界面( 比如IDLE )两种方式,下面使用命令行方式,通过命令行运行python程序,通常还需要一个文本编辑器来编写python程序文件(这种程序文件被称为源代码)。文本编辑器在Windows下可以使用notepad++,也可以使用Sublime Text(它是跨平台的,也可以在Linux和mac下使用),可以在网上搜索这些编辑器的安装使用教程。
与python解释器打交道的方式有两种:
第一个就是python交互模式。在linux下,终端输入python默认为python2.x.x,输入python3则为python3.x.x。我们输入python3来使用python3.x.x,输入python3后就进入了python3交互模式:
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
在windows系统下,需要在cmd(命令提示符)下输入python进入,如果不知道cmd(命令提示符)是什么,可以参考这里。
“>>>”是python交互模式的提示符(提示你可以在它后面输入东西),所以我们在“>>>”后面输入python语句,输完后点击回车,则python语句立即执行,并打印出执行结果。如果要退出python交互模式,输入exit()就可以了。
第二个则是用python运行python源代码。 打开你熟悉的文本编辑器,编写程序,在保存文件时将文件名以.py
为后缀(文件扩展名,可以起到指定文件类型的作用)。然后在该文件所在目录打开命令行,比方说该文件叫filename.py,则输入python filename.py
,点击回车,运行该文件中的程序。
2.基础概念
我们编写程序的时候,要在英文输入法下输入各种符号,不然程序会报错。像下面这样,我故意在中文输入法下输入双引号,出现了“SyntaxError”错误:
>>> “李”
File "<stdin>", line 1
“李”
^
SyntaxError: invalid character in identifier
>>>
我们可以把python交互模式直接看做一个命令行的计算器来使用,比如输入4+5
点击回车,python交互模式下就会显示计算结果。
>>> 4+5
9
>>>
可以尝试在交互模式下进行不同的计算,“+”表示加法,“-”表示减法,“*”表示乘法,“/”表示除法。
>>> 5*6
30
>>>2/3
0.6666666666666666
>>>
“%”表示除余,就是说结果会返回一个数被另一个数整除除不尽时的余数:
image
>>> 9%2
1
>>> 0%2
0
>>> 1%2
1
>>> 2%2
0
>>> 3%2
1
>>>
“**”表示幂运算,比如输入4**2
则表示4的二次方:
>>> 4**2
16
>>>
“//”表示一种特殊除法,结果返回商的整数部分(向下取整),比如9//5
,9除以5为1.8,那么9//5
的结果就取了1.8的整数部分:
>>> 9//5
1
>>>
“+”,“-”,“”,“/”,“%”,“*”,“//”这些符号表明了应该怎么样来操作这些符号之前和之后的两个数字,比如,4+5就说明了需要把4和5加起来,所以这些符号就叫操作符。而像4+5
这样操作某些数的式子,叫做表达式,4+5
这个表达式是比较简单的,(4+5)/2
这个表达式就复杂了一些,通常把一个数字本身也叫做表达式。
2.1变量
如果我们想计算一个复杂一点的表达式,比如(5/6)+((4/(4+5))*((3/2)-8))
,由于它的计算过程相对复杂,因此很难理解这个式子具体做了什么样的操作。这时候我们想要看懂这个表达式所表达的意义,就希望能够拆分它,通过给计算过程中的某些中间结果一些“名称”就可以拆分成很多步了。比如(4+5)/2
,我们首先给4+5
起一个“名称”,就叫做a吧。现在我们就可以把(4+5)/2
拆分成两步:
a是4+5的“名称” #第一步
a/2 #第二步
像上面这样子写的东西叫做伪代码(Pseudocode),可以通过伪代码来大致描述一个程序的计算流程跟步骤,在这个伪代码中,第一行代码会首先运行,第二行代码会在第一行代码运行完成后运行,其实在真正的源代码文件中,代码也是如此运行的,从文件第一行开始,自上而下,逐行运行,直到最后一行代码被运行完。“#”后面跟的文字包括“#”是代码中的注释,编译器或者解释器会忽略掉这部分内容,写注释是为了增加程序的可读性,当时写的程序很可能作者会明白程序表达的东西,但是过一两个月可能就会连作者自己都不知道,所以为了给作者自己或者别人阅读源代码提供便利,要尽量在注释里解释介绍程序的作用或者思路。
在计算机术语中,给某个计算过程的某些中间结果起的“名称”就是变量(variable)。该用什么符号来表示变量呢,各种编程语言给我们的自由度非常高,除了避开编程语言中保留的某些关键符号(关键字)和一些会与其他东西产生混淆的符号,并注意不能把数字放在变量名中的第一个位置(例如“0a”就是一个不合法的变量名),我们可以使用任何字母、标点符号、数字的组合(中文和中文标点除外),为了代码的可读性,尽量使用具有描述性的单词,比如user,id,phone_numbers……等。我们编写的程序可能会很长很长(程序很复杂),比如说可能会有1000行,那么通过各种变量,我们一步步的计录下程序运行过程中所得出的一些结果,再把这些结果提供给后面的程序,直到得出最终结果。在程序的世界里,给变量赋值的符号是“=”(不同于数学中这个符号的用法),上面的伪代码在python程序中可以实现如下:
a=4+5 #变量a得到4+5的值
a/2 #(4+5)/2的值
这是两行python代码,你把它复制到python交互模式的提示符中点击回车,得到如下结果:
>>> a=4+5 #变量a得到4+5的值
>>> a/2 #(4+5)/2的值
4.5
>>>
但是你将它复制到一个文件中,并把文件名改为example.py,然后在python命令行模式下输入python example.py
(在linux下,要使用python3就得输入python3 example.py
),点击回车,程序不会显示任何结果:
这就是python两个模式下的区别,交互模式会自动打印出结果,命令行模式下则不会打印出结果(除非你自己告诉程序打印出哪个结果(变量))。交互模式下写的python语句能立即执行,但无法保存,不能重复使用。所以想要写复杂一点的程序就要写入python源代码文件中。
我们已经知道了什么是变量,并知道如何给变量赋值。一个变量呢,就像一个空盒子,赋值就是给盒子里塞东西。塞进去的是4
那该变量就表示4
,塞进去的是4+5
那该变量就表示4+5
的值。所以,给变量进行多次赋值是允许的,只不过在变量再次被赋值时,上次赋的值就被抹去了。我们要用到一个变量的时候,必须先声明这个变量。第一次给刚声明的变量赋值叫做初始化一个变量。在python中,声明变量跟初始化变量是一步完成的,就是给出变量名并赋一个值给它:
#该变量名第一次出现,所以下面的语句
#是声明和初始化了该变量
a=7
现在我们需要扩展下我们的认知,计算机程序中的变量不光可以表示数字表达式(例如4+5)的值,还可以记录、存储一些文字内容,比如这句英文:life is but a dream.这种文字性的内容我们可以看做是一串字符的序列(有顺序的一串符号,想象用一条线串起不同的符号,符号的位置是固定的),这种序列称为字符串。在python中,用双引号""或者单引号''来圈住字符串,也可以说是用""或者''来表示引号中间的内容就是字符串。下面举几个例子:
#给变量str1赋值,值的内容是字符串"life is but a dream"
str1="life is but a dream"
#给变量str1继续赋值,任何符号都可以成为字符串,包括数字以及空格
str1='12'
str1=' '
#字符串可以用“+”串联起来
str1="life is but a dream"+"12"
str2="hello"+str1
str3=str1+str2
#给变量number1赋值,值的内容是数字12,给某个变量赋予数值直接写上数值
number1=12
#给变量number1再次赋值
number1=37
在python中,变量可以表示任何东西,一个变量可以多次赋予不同类型的值:
a=5
a="5"
a='string'
一个编程语言有了这种特性,我们就可以说这个编程语言是动态类型语言(动态语言),很显然,python是动态类型语言(动态语言)。
在一些更为传统的编程语言里,存储数字的变量跟存储字符串的变量是有区别的,存储数字的变量不能把字符串赋值给它,存储字符串的不能把数字赋值给它,需要变量的时候首先要通过编程语言里的标识符(编程语言里保留的一些表明变量的值的类型的字符)来表明这个变量是要存储什么的,然后隔个空格跟上变量名称,这叫做声明一个变量,例如在c语言中,声明一个整数类型的变量可以这样做:
int a; //声明一个int变量
a=3; //初始化变量,a是int变量,所以赋值的时候只能是整数
a="3" //这在c语言中是不允许的
像这种声明变量时需要指定类型(并且一旦指定类型,赋值的时候只能赋予与变量类型符合的值)的编程语言被称为静态类型语言(静态语言)。一般的,变量里存储数字时可以分为整数(int),浮点数(float),整数(int)的概念我们在数学里学过,那么浮点数(float)到底是什么呢,其实我们在数学里也是学过的,那就是小数(有小数点的数)。在计算机里,浮点数跟整数的存储方式不同,所以有必要分清两者的概念。
#把一个整数赋值给变量
number1=123
#把一个浮点数二次赋值给同一个变量
number1=12.44
2.2条件
前面我们已经说到程序自上而下一行行运行,那如果我们想要程序不再这么无聊的运行下去,而是有选择的执行某一段代码,该怎么办呢?那就要通过设置判断条件来把程序分隔成一块一块儿,程序在运行时根据当时的情况来判断符合哪个条件从而执行那个条件下的一块代码。比如我们想要实现一个“饮料选择器”,当温度低于10摄氏度时,我们就喝热饮,当温度等于或者大于10摄氏度时,我们就喝冷饮。用伪代码可以表示:
if temp<10:
#下面是一段代码块
喝热饮
……
……
#上面是一段代码块
else if temp>=10:
#下面是一段代码块
喝冷饮
……
……
#上面是一段代码块
上面的伪代码中,if,else if表示了它们在英文里相同的意思(if表示如果,else if表示否则如果),在一般的编程语言里,if,else if 是关键字,它们同其他一些关键字被编程语言保留,你想要起变量的名字(后面我们还会给函数起名字)都不能使用这些被保留的关键字,因为关键字在程序中表示了特殊的意思,比如在这儿if,else if 后面跟上表达式就是一个条件语句。而条件语句后面就可以跟一段代码块,跟其他地方的代码区分开来,上面伪代码中可以把注释中间的东西想象成很长的一段代码块。
上面伪代码中的“temp<10”是一个表达式,“temp”看做存储温度的变量,“<”这个符号跟数学里的意义一样表示“小于”,那么“temp<10”这个表达式的值就有两种可能,一种就是“temp”变量的值大于10,另一种就是“temp”变量的值小于10。在第一种情况下,“temp<10”这个表达式显然不符合事实,所以“if temp<10:”下面的代码块不会执行,与之相对应的,“else if temp>=10:”下面的代码块就会执行。在第二种情况下,“temp<10”这个表达式显然符合事实,所以“if temp<10:”下面的代码块会立即执行,与之相对应的,“else if temp>=10:”下面的代码块则不会执行。这样就达到了有选择的执行某一段代码的目的。
像“temp<10”或者“temp>=10”这样的表达式可以称为比较表达式,像“<”或者“>=”这样的操作符可以称为比较操作符。常见的比较操作符如下:
操作符 | 解释 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 等于 |
!= | 不等于 |
比较表达式的值如何表示呢,这里我们需要再次扩展我们的变量所能表达的类型,变量除了表示数字、文字内容,还能表示比较表达式(比如“temp>=10”)的值,从前面的解释中我们知道比较表达式的值就两种可能,一种符合事实,这时候我们就规定比较表达式的值为True(也可以用数字“1”表示),另一种不符合事实,这时候我们就规定比较表达式的值为False(也可以用数字“0”表示)。这种只有两个值(True和False)的变量类型称为布尔(boolean)类型。
一般来说,if,else if这两个关键字后面跟的比较表达式的值是相反的,所以就只会执行比较表达式的值为True的那个条件语句下的代码块。另外还有包含else关键字的条件语句,else后面会省略比较表达式,当if或者else if条件语句中比较表达式的值都为Flase的时候就会执行else条件语句下的代码块。假如temp变量的值为11,可以想想下面的伪代码中到底会执行哪一个代码块:
if temp<=10:
喝热奶茶
……
……
else if temp>=15:
吃冰激凌
……
……
else:
喝凉开水
……
……
比较表达式也可以串联在一起使用,比如你想表达温度大于10并且小于15时,就要用and
这个操作符把temp>10
跟temp<15
给串起来,则表达式就变成了temp>10 and temp <15
;当你想要表达温度大于10或者小于15时,就要用or
这个操作符把temp>10
跟temp<15
给串起来,则表达式就变成了temp>10 or temp <15
;当你想表达温度大于10
这个事实不成立时,就要给temp>10
之前加上not
操作符,表达式变成了not temp>10
。
and
,or
和not
被称为布尔操作符(在python语言中),因为这些操作符的作用就是串联起别的比较表达式来改变整个表达式的布尔值。当然在别的编程语言中,这些操作符会有所不同,这是无关紧要的,重要的是操作符所起到的功能。
表达式 | 功能 |
---|---|
a and b |
a与b的布尔值都为True则a and b 为True,否则为False |
a or b |
a与b的布尔值有一个为True则a or b 为True,否则为False |
not a |
a的布尔值为True则not a 为False,a的布尔值为False则not a 为True |
假如temp变量的值为9,可以想想下面的伪代码中到底会执行哪一个代码块:
if temp<=10 or temp>=15:
什么都不喝
……
……
else:
喝凉开水
……
……
细心的你可能已经发现了,在“if temp<10:”或者“else if temp>=10:”这两个条件语句中,末尾都有一个“:”,事实上上面的伪代码是基本符合python语法的,在python中我们通过关键字后面隔个空格,再写上比较表达式,末尾再加上“:”的方式来表明一个条件语句,再更加细致一点,你会发现条件语句之下有一段代码全是相对于条件语句来说向右缩进的,一般是打四个空格来实现这样的缩进,通过这样的缩进来表明自身是受条件语句约束的代码块。在python里,通过“:”和缩进来实现代码块,下文要讲到的循环、函数、对象等也能通过这样的方式实现受其约束的代码块。在其他编程语言里,一种实现代码块的方式是通过“{”和“}”把代码包裹起来实现的,该小节开头的伪代码可以写成这样:
if (temp<10) {
喝热饮
……
……
}
else if (temp>=10){
喝冷饮
……
……
}
一般来说呢,编程语言里会有if条件语句,else if条件语句,else条件语句,switch条件语句。在python的语法里,else if变成了elif,更加简洁了,并且没有switch语句。该小节开头的伪代码我们可以写成python源代码:
temp=10
drink="喝什么"
if temp<10:
drink="喝热饮"
elif temp>=10:
drink="喝冷饮"
再多写个例子:
temp=16
drink="喝什么"
if temp<10:
drink="喝热饮"
elif temp>=10 and temp<=15:
drink="喝凉开水"
else:
drink="吃冰激凌"
#想想,最后drink的值是什么?
2.3函数
如果我们想要在程序运行的过程中与人互动(与别的程序或者程序片段互动),那么我们就需要引入未知数。这个未知数会在程序运行过程中实时地得到某人(其他程序)的输入(input),从而程序根据输入(input)的数据计算下去。
比如我们想计算小萌某一天走过的路程有多远,已知小萌的行进速度是5公里每小时,那么我们不知道的就是小萌在某一天到底走了多长时间,这个未知数我们可以暂时先用t来表示,这样我们就能够用t*5来表示小萌某天走过的路程。
我们现在想要计算小萌今天的路程,则只需要问问小萌今天走了多长时间的路,小萌说走了2.5小时,我们把t*5中的t换成2.5,再计算下就知道小萌走了12.5公里。
像这个例子中的t*5
(t是未知数,未来会得到一个具体输入(input))这样,包含了未知数的这种构造就是函数(function)。该小节开头所说的让程序在运行过程中得到一个具体输入(input)就需要函数这样的构造。函数中的未知数被称为该函数的参数。
该小节第二段的例子展示了定义一个函数的过程,用t*5
计算出来的路程就是函数的输出(output),也可以说是函数的结果。那么t*5
其实可以看作函数本身。t是函数的参数,我们也可以用a来表示则函数本身成为了a*5
,a*5
与t*5
是等价的,函数的参数名称与函数的运行结果无关。既然函数的参数可以用任意名称来表示,那么函数本身呢?函数本身也能用任意名称来表示,比如这里我们可以用mile
来表示t*5
,以后我们就可以把t*5
直接叫mile函数。在python中,定义这个函数需要这样做:
"""
如你所见
这是一个多行注释
首行和末尾行用要用三个双引号包裹起来哦
"""
"""
def是定义函数的关键字,mile是函数的名称(名称可以自由的发挥想象力),
圆括号里的是函数的参数(参数名称可以自由的发挥想象力),return是函数返回某个值的关键字。
"""
def mile(t):
m=t*5
return m #返回变量m的值
该小节的第三段展示了我们人类使用一个函数的过程,而在程序里,不需要我们人类操心,我们只需要把参数丢进函数,函数就会计算出结果来。我们可以把函数看作黑盒子,不需要知道函数的具体实现过程。我们可以使用别人定义好的函数,只需要知道函数的参数和函数的返回值(或者函数的作用),以及函数的名称。这样我们就不用什么都靠自己编写实现,而可以站在巨人的肩膀上专心编写自己的程序逻辑。假如一段很长的代码都是为了得到某个结果,而在程序里你需要多次计算在不同参数输入下的这个结果,把这段代码用定义函数的方式包裹起来,可以达到重复使用这段代码的效果。函数的使用在程序里我们称为函数的调用,在python中,调用上面刚刚定义的mile函数需要这样做:
#给mile函数填入参数2,然后将mile函数返回的计算结果赋值给变量n
n=mile(2)
#参数也可以使用之前初始化好的变量,看下面的例子
a=3
b=mile(a)
函数的参数跟变量一样,也是有各种类型的,有数字、字符串、布尔值……在定义函数的时候要想清楚输入的参数是什么类型,比如我们之前定义的mile函数,它的参数就应该是数字,当你输入不是数字的参数时,就会得到奇怪的结果:
image
函数的参数可以是任意多个,参数之间用逗号隔开:
def addTwo(a,b):
return a+b
函数的参数可以没有,也可以不返回任何值:
def foo():
"""
pass语句表示什么也不做,当你没有想好函数的具体实现时
可以用pass语句先代替
"""
pass
python解释器内置了一些函数,我们可以直接拿来用,最常用的就是print函数。这个函数的作用就是在命令行下打印出函数参数中输入的字符串,你可以在交互模式下试试:
print("hello,world!")
另一个常用的函数就是input函数。这个函数的作用就是在命令行下接受用户的输入,你可以在交互模式下试试:
input("请输入一句话: ")
现在我们用2.2小节关于温度的例子写一个示例程序,把我们目前学习到的概念都运用一下:
"""
首先我们定义个函数,把2.2小节例子中的条件语句用函数包裹起来,
以便复用这段代码
"""
def drink_selector(temp):
t=int(temp) #int函数内置函数,可以把字符串转换为整数
if t<10:
print("喝热饮")
elif t>=10 and t<=15:
print("喝凉开水")
else:
print("吃冰激凌")
"""
我们从用户输入中得到temperature变量的值
input函数得到的用户输入是字符串
"""
temperature=input("请输入当前温度: ")
#调用我们之前定义好的函数,让函数告诉我们该喝什么饮料
drink_selector(temperature)
程序运行如图所示:
image
前面说到函数是个黑盒子,意思就是:如果把整个程序看做一整个解决某个大问题的流程(步骤)的话,定义一个函数,就好比预先定义了一个解决这个大问题里的某一特定小问题的流程(步骤)的模板,一旦调用该函数,则解决该大问题的流程就变成了解决该大问题里这个特定的小问题的流程(步骤)了。当函数返回结果或者函数内部流程结束,对该函数的调用结束,解决该大问题的流程继续。因此,函数内部的运作可以说是在不同的流程里,在函数之外是不可见的,但是因为它的流程是在整个程序的流程里,所以它可以使用、修改函数之外的变量。函数内部定义的变量从该函数外部是无法访问到的,这样的变量被称为局部变量,而在整个程序的所有地方都能访问到的变量被称为全局变量。
x=0 #全局变量
def blackbox():
y=3 #局部变量
blackbox()
#str函数是内置函数,将数字转换为字符串
print(str(y))
上面的这段代码因为从函数外部无法访问到函数内部定义的变量y,所以程序运行中会出现NameError: name 'y' is not defined:
像上面这样在程序运行过程中出现错误的代码,我们就说代码里有bug(故障,缺陷)。还有一种bug,就是在程序运行过程中会出现奇怪的行为,或者得出的结果与我们希望得到的有出入。
x=0 #全局变量
def blackbox():
x=3 #是改变全局变量的值,还是重新定义了一个局部变量?
print(str(x))
blackbox()
print(str(x))
上面这段程序运行结果为下图:
image
上段代码中由于初始化变量与变量的赋值语句的语法相同,导致解释器无法分清我们在函数内部写的x=3
的意图何在?是重新定义一个局部变量还是改变全局变量x
的值?从程序运行结果来看,python在这种情况下选择了定义局部变量,而函数外部由于无法访问函数里的局部变量,则会使用外部定义的全局变量。让局部变量跟全局变量同名是种很迷惑人的做法,所以在定义一个变量的时候应该尽最大可能让变量名具有唯一性。如果要在函数内部修改全局变量的值,则可以这样做:
x=0 #全局变量
def blackbox():
"""
下面代码先使用global关键字后面跟全局变量x的方式来
说明此处的x是前面定义的全局变量x
"""
global x
x=3
blackbox()
print(str(x))
上段代码运行如下:
image
2.4循环
任何程序都是自上而下一行行运行,假如我们想要某个函数(某段程序)运行很多次,我们该怎么办呢,一种自然的想法就是把这个函数(这段程序)多写几遍,想要运行几遍就写几遍,这当然是允许的,比如说,我们想要在终端一行一行的打印出“hello,world!”这句英文的每个字母跟标点,则我们可以这样做:
print("h")
print("e")
print("l")
print("l")
print("o")
print(",")
print("w")
print("o")
print("r")
print("l")
print("d")
print("!")
但是当我们想要运行几百上千遍这个函数(这段程序)时,我们人类是特别不擅长做这种复制粘贴的重复工作的,尤其是当这种重复动作达到几百上千次时,复制过程中甚至会出现难以察觉的错误,导致程序运行结果出现偏差。所以这不是好的方法,在各种编程语言里,可以通过循环语句来实现多次运行同一函数(同一段程序),并且能够在重复运行某个函数(某段程序)的时候每次给予这个函数(这段程序)的参数(变量)都不同。下面的python代码跟本小节第一段python代码有相同的运行结果,但因为运用了循环语句(loop statement)而更加简洁:
#for循环(for loop)
for letter in "hello,world!":
print(letter)
这段代码里“for”和“in”是组成循环语句的关键字,再一次的,python语法里用“:”作为循环语句的结尾,并且该语句下的代码是相对于该循环语句向右缩进,来表明这是受该循环语句约束的代码块。这段代码如何循环呢?它首先会把“hello,world!”字符串中有12个字母数出来,然后根据有12个字母就循环12次,也就是让受该循环语句约束的代码块print(letter)
运行12次。第一次循环则取出第一个字母“h”赋值给参数letter,然后print函数会根据参数letter打印出字母“h”,第二次循环则会取出第二个字母“e”……直到第十二次循环把“!”取出来打印出来,循环结束。看下面一段代码:
#另一种for循环(for loop)
for index in range(0,12):
print("hello,world!"[index])
这段代码跟上一段代码的作用一样,都是分行打印出“hello,world!”的每个字符,但用到了另一种形式的循环,这种循环更为传统,就是通过数字索引的方式达到循环的目的。range函数是个python内置函数,根据提供的参数0
和12
会给循环提供一串从0
到11
的索引数字,索引数字的取值范围包括左边的0
但不包括右边的12
。第一次循环的时候索引index的值为0,第二次循环的时候索引index的值为1……直到第十二次循环索引index的值为11,这时候索引数字完了,循环就结束了。值得特别注意的是,计算机世界里,计数是从0开始的。所以通过range函数给定了12个索引数字之后,最后一次循环给出的索引数字index是11,而不是12。''hello,world!''[index]
,这是个新的写法,字符串后面用方括号把索引数字包裹起来,则表示从字符串中取出对应位置上的单个的字符。在这段代码里,第一次循环的时候,index为0,则''hello,world!''[0]
就是“h”,第二次循环的时候,index为1,则''hello,world!''[1]
就是“e”……第十二次循环的时候,index为11,这时候从0开始计数已经是第十二次了,所以''hello,world!''[11]
就是“!”。再看下面一段代码:
string="hello,world!"
count = 0
#len函数是内置函数,返回字符串的长度
while count <len(string):
print(string[count])
#下面的代码表示增量,每一次循环count的值加1
count=count+1
这段代码跟上一段代码作用相同。这段代码用到了while这个关键字,这是又一种循环方式,叫while循环(while loop),当count
变量的值小于"hello,world!"
的总长度时,就继续循环下去:
- 第一次循环,
count
变量的值为0,count <len(string)
的值为True,所以受该循环语句约束的代码块运行一次,当count=conut+1
运行之后,count
的值变为1; - 第二次循环,
count
变量的值为1,count <len(string)
的值为True,所以受该循环语句约束的代码块运行一次,当count=conut+1
运行之后,count
的值变为2; - ……
- ……
- 第十一次循环,
count
变量的值为10,count <len(string)
的值为True,所以受该循环语句约束的代码块运行一次,当count=conut+1
运行之后,count
的值变为11; - 第十二次循环,
count
变量的值为11,count <len(string)
的值为True,所以受该循环语句约束的代码块运行一次,当count=conut+1
运行之后,count
的值变为12; - 现在
count
变量的值都为12,count <len(string)
的值为False,退出循环。
这种循环可以实现无限循环:
number=1
#这儿number==1这个比较表达式的布尔值永远为True,所以循环永远继续
while number==1:
print("这个循环不会结束")
while True: #布尔值永远为True,所以循环永远继续
print("这个循环也不会结束")
上面的两种无限循环可以使用CTRL+C 来中断循环。但是任何循环都是可以在内部中断的,通过在该循环中使用break语句,就可以中断该循环,下面的代码就演示了如何使用break语句:
number=1
count=0
while number==1:
print("这个循环不会结束")
count=count+1;
if count>18:
"""
设置break语句,在变量count大于18时,该循环中断
想想,这个循环一共循环几次?
"""
break
在python中用在循环中的另一个可以改变循环行为的语句是continue语句。当出现continue语句时,该循环的该次循环中,出现在continue语句之后的语句被忽略,不再执行:
#该程序显示小于12的奇数
for index in range(0,12):
"""
假如index能被2整除,则为偶数,反之为奇数
当index是偶数的时候,运用continue语句忽略后面的print语句
"""
if index%2==0:
continue
print("奇数:"+str(index))
欢迎关注我的公众号
网友评论