该系列文章:javascript
学一门编程语言正在变得愈来愈容易,只要念太高中(甚至是初中、小学),能熟练聊qq和懂得一点点office软件的人,入门一门编程语言都不在话下。咱们跟别人沟通,靠的是语言,不管是说出来仍是写出来,也无论是普通话仍是英语。那么想要跟计算机沟通,也须要靠语言,世界上如今有不少跟计算机沟通的语言,有c,jave,javascript,php,python……这些都是编程语言,它们跟咱们与别人交流的语言有何不一样呢?咱们与别人交流的语言是天然造成的,而编程语言是由某我的或者某几我的编写出来的。天然造成的咱们称为天然语言,编程语言则属于人工语言。天然语言的语法较为松散,自由,既能够用来解决问题,也能够抒发感情、讲述故事。而计算机最初被设计的时候是用来解决各类现实生活中的问题的,因此逻辑严谨,说一是一,那么跟计算机沟通的时候也须要逻辑严谨,不容含糊,语法严格,这大概就是不少人以为编程困难的地方吧。但没关系,一旦咱们习惯了这种严谨的语法和思考方式,将会大大提升咱们解决问题的效率和正确率。php
计算机使用的是二进制,经过接受到的指令执行任务,最初人们经过汇编语言(assembly language,低级语言)来与计算机沟通,告诉cpu执行什么样的指令,但是各个不一样的计算机系统结构都各自有不一样的汇编(assembly),而且用汇编编写程序效率低下(毕竟汇编更偏向于跟计算机沟通),因此对人类友好的高级编程语言应运而生(好比c语言),人们经过编译程序(充当了一个翻译家的角色)把高级编程语言编译成计算机能够理解的机器代码。这时候编程已经变得比以前容易了,然而更加高级的现代编程语言不断产生,使得编程的入门门槛进一步下降,python就是其中一门现代编程语言。html
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来介绍编程中的基本概念。java
linux和mac通常都自带python2。python
某些最新版本的linux发行版可能也自带python3,若是没有,请参考这里来安装使用。linux
最新版本的mac通常都自带python3,若是没有,请参考这里来安装使用。git
Windows系统能够从www.python.org/downloads/下载python软件(解释器),下载最新版python3.x.x。安装的时候勾选Add Python 3.x to PATH。这样就自动设置好了python的环境变量(环境变量就是设置python程序的相关路径,让Windows能够找到python程序的安装目录)。 github
python编程有命令行和图形界面( 好比IDLE )两种方式,下面使用命令行方式,经过命令行运行python程序,一般还须要一个文本编辑器来编写python程序文件(这种程序文件被称为源代码)。文本编辑器在Windows下可使用notepad++,也可使用Sublime Text(它是跨平台的,也能够在Linux和mac下使用),还可使用Visual Studio Code(它也是跨平台的),能够在网上搜索这些编辑器的安装使用教程。编程
与python解释器打交道的方式有两种: 第一个就是python交互模式。在linux下,终端输入python默认为python2.x.x,输入python3则为python3.x.x。咱们输入python3来使用python3.x.x,输入python3后就进入了python3交互模式:windows
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
,点击回车,运行该文件中的程序。
咱们编写程序的时候,要在英文输入法下输入各类符号,否则程序会报错。像下面这样,我故意在中文输入法下输入双引号,出现了“SyntaxError”错误:
>>> “李”
File "<stdin>", line 1
“李”
^
SyntaxError: invalid character in identifier
>>>
复制代码
咱们能够把python交互模式直接看作一个命令行的计算器来使用,好比输入4+5
点击回车,python交互模式下就会显示计算结果。
>>> 4+5
9
>>>
复制代码
能够尝试在交互模式下进行不一样的计算,“+”表示加法,“-”表示减法,“*”表示乘法,“/”表示除法。
>>> 5*6
30
>>>2/3
0.6666666666666666
>>>
复制代码
“%”表示除余,就是说结果会返回一个数被另外一个数整除除不尽时的余数:
>>> 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
这个表达式就复杂了一些,一般把一个数字自己也叫作表达式。
若是咱们想计算一个复杂一点的表达式,好比(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
),点击回车,程序不会显示任何结果:
咱们已经知道了什么是变量,并知道如何给变量赋值。一个变量呢,就像一个空盒子,赋值就是给盒子里塞东西。塞进去的是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
复制代码
前面咱们已经说到程序自上而下一行行运行,那若是咱们想要程序再也不这么无聊的运行下去,而是有选择的执行某一段代码,该怎么办呢?那就要经过设置判断条件来把程序分隔成一块一起,程序在运行时根据当时的状况来判断符合哪一个条件从而执行那个条件下的一块代码。好比咱们想要实现一个“饮料选择器”,当温度低于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的值是什么?
复制代码
若是咱们想要在程序运行的过程当中与人互动(与别的程序或者程序片断互动),那么咱们就须要引入未知数。这个未知数会在程序运行过程当中实时地获得某人(其余程序)的输入(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函数,它的参数就应该是数字,当你输入不是数字的参数时,就会获得奇怪的结果:
函数的参数能够是任意多个,参数之间用逗号隔开,调用的时候须要按照顺序给参数赋值:
def addTwo(a,b):
return a+b
a=addTwo(5,4)
print(a)
复制代码
上面程序运行结果为9。
函数的参数能够没有,也能够不返回任何值:
def foo():
""" pass语句表示什么也不作,当你没有想好函数的具体实现时 能够用pass语句先代替 """
pass
复制代码
python中的函数有很是高的灵活性,在函数调用的时候可使用关键字参数的形式,也就是在调用的时候直接给定义时给出的参数名(关键字)赋值,这时候参数没有必要按照顺序给参数赋值:
def addTwo(a,b):
return a+b
a=addTwo(b=4,a=5)
print(a)
复制代码
上面程序运行结果为9。
python中的函数在定义的时候能够设置默认参数,也就是说若是调用的时候没有给参数赋值,则会使用默认的值:
def addTwo(a,b=4):
return a+b
a=addTwo(5,5)
print(a)
b=addTwo(5)
print(b)
复制代码
上面程序a的值是10,b的值为9。
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)
复制代码
程序运行如图所示:
前面说到函数是个黑盒子,意思就是:若是把整个程序看作一整个解决某个大问题的流程(步骤)的话,定义一个函数,就比如预先定义了一个解决这个大问题里的某一特定小问题的流程(步骤)的模板,一旦调用该函数,则解决该大问题的流程就变成了解决该大问题里这个特定的小问题的流程(步骤)了。当函数返回结果或者函数内部流程结束,对该函数的调用结束,解决该大问题的流程继续。所以,函数内部的运做能够说是在不一样的流程里,在函数以外是不可见的,可是由于它的流程是在整个程序的流程里,因此它可使用、修改函数以外的变量。函数内部定义的变量从该函数外部是没法访问到的,这样的变量被称为局部变量,而在整个程序的全部地方都能访问到的变量被称为全局变量。
x=0 #全局变量
def blackbox():
y=3 #局部变量
blackbox()
#str函数是内置函数,将数字转换为字符串
print(str(y))
复制代码
上面的这段代码由于从函数外部没法访问到函数内部定义的变量y,因此程序运行中会出现NameError: name 'y' is not defined:
x=0 #全局变量
def blackbox():
x=3 #是改变全局变量的值,仍是从新定义了一个局部变量?
print(str(x))
blackbox()
print(str(x))
复制代码
上面这段程序运行结果为下图:
上段代码中因为初始化变量与变量的赋值语句的语法相同,致使解释器没法分清咱们在函数内部写的x=3
的意图何在?是从新定义一个局部变量仍是改变全局变量x
的值?从程序运行结果来看,python在这种状况下选择了定义局部变量,而函数外部因为没法访问函数里的局部变量,则会使用外部定义的全局变量。让局部变量跟全局变量同名是种很迷惑人的作法,因此在定义一个变量的时候应该尽最大可能让变量名具备惟一性。若是要在函数内部修改全局变量的值,则能够这样作:
x=0 #全局变量
def blackbox():
""" 下面代码先使用global关键字后面跟全局变量x的方式来 说明此处的x是前面定义的全局变量x """
global x
x=3
blackbox()
print(str(x))
复制代码
上段代码运行以下:
任何程序都是自上而下一行行运行,假如咱们想要某个函数(某段程序)运行不少次,咱们该怎么办呢,一种天然的想法就是把这个函数(这段程序)多写几遍,想要运行几遍就写几遍,这固然是容许的,好比说,咱们想要在终端一行一行的打印出“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))
复制代码
欢迎浏览个人我的博客,https://diwugebingren.github.io