一)分支语句
1.if-else语句
语句格式:
if条件:
语句1
语句2
....
else:
语句1
语句2
....
分支外的语句
.....
if-else语句流程图如下:
2.省略else的if语句
前面介绍的if-else语句是实现两分支,如果两分支中其中一个分支不需要做任何事情,则需要执行空语句,此时就会浪费时间和精力,如果我们使用省略else的if语句来完成此种情况,则可以省时省力。其语句格式如下:
if条件:
语句1
语句2
……
分支外的语句
……
省略else的if语句流程图如下:
3. if-elif 语句
Python语言的if-elif 语句的格式如下:
if 条件:
语句
……
elif 条件:
语句
……
elif 条件:
语句
……
……
else:
语句
……
分支外的语句
……
if-elif 语句流程图如下:
4. if 语句嵌套
(1)内层的语句嵌套在满足if条件的语句
格式如下:
if 条件:
if 条件:
语句
……
else:
语句
……
else:
语句
……
分支外的语句
……
(2)内层的语句嵌套在else条件的语句
if 条件:
语句
……
else:
if 条件:
语句
……
else:
语句
……
分支外的语句
……
(3)双层嵌套语句流程图如下:
5.判断多个条件
if-elif语句和if的嵌套实现多分支时,需要考虑条件之间的关系,这样写出来的程序才能更高效、更简洁,但是编程思路稍显复杂而且要求必须清楚。大家如果想要思路简单,而且又必须编写多分支程序,可以使用判断多个条件的方式来实现。
具体的实现方法比较简单,就是将所有的条件都单独列出,互相之间没有关系即可。
分支语句在使用过程中需要注意以下几点:
- 条件表达式就是计算结果必须为布尔值的表达式。
- 不同于C语言和java语言,Python语言的分支表达式不需要使用小括号,而是在表达式后面使用冒号。
- 满足某一条件的语句不需要使用大括号,但是属于同一级别的语句必须同一距离缩进。
- 不推荐使用判断多个条件的if语句实现多分支。 不推荐使用if语句的嵌套。
- 不同于C语言和java语言,Python语言没有switch-case语句。
二)循环语句
1. for语句
在循环结构中最常用的一种循环语句就是for循环语句,for循环语句一般用于实现已知循环次数的循环结构,可以循环遍历任何序列,如列表、元组和字符串等,其具体的语句格式如下:
for 变量 in 序列:
语句1
语句2
……
循环结构流程图:
2. while 语句
while语句与for语句类似,都是实现循环结构的,与for循环的区别是,while循环之前,先判断一次,如果满足条件的话再循环,for循环的时候必须有一个可迭代的对象,才能循环,比如说得有一个列表或者字符串。另外,与for循环不同的是while循环一般多用于循环次数未知的情况,
其具体的语句格式如下:
while 条件:
语句1
语句2
……
3. 循环嵌套
循环的嵌套跟前面讲的if语句的嵌套意思是一样的,即循环体中又含有循环,当然也可以多层嵌套,但是一般不提倡嵌套层数过多,双层循环即可。循环的嵌套包括for语句嵌套for语句、while语句嵌套while语句、for语句嵌套while语句、while语句嵌套for语句,所有循环的嵌套方式都是一样的,只是使用的语句不同而已。
循环嵌套流程图:
a- for语句的嵌套
其语句基本格式如下:
for 变量 in 序列:
语句1
语句2
……
for 变量 in 序列:
语句1
语句2
……
……
b- while语句的嵌套
同for语句的嵌套类似,while语句的嵌套是while的循环体里面还含有while循环。其语句基本格式如下:
while 条件:
语句1
语句2
……
while 条件:
语句1
语句2
……
……
c- for与while的互相嵌套
同for语句和while语句的嵌套类似,for与while互相嵌套就是for的循环体里面含有while循环,或者的while循环体里面含有for循环。其语句基本格式如下:
(1)while嵌套for语句的格式:
while 条件:
语句1
语句2
……
for 变量 in 序列:
语句1
语句2
……
……
(2)for嵌套while语句的格式:
for 变量 in 序列:
语句1
语句2
……
while 条件:
语句1
语句2
……
……
三)其他语句
1. break语句
Python语言的break语句,就像在C语言中一样,打破了最小封闭for或while循环。break语句用来终止循环语句,即还满足循环条件或者序列还没被完全递归完,也会停止执行循环语句。break语句用在while和for循环中。如果你使用的是嵌套循环,break语句将停止执行本层的循环,并开始执行下一行代码。
例如下面是一个普通的循环:
for i in range(5):
print(i)
print(‘-------’)
当循环执行时输出0-4的五个数字,每个数字下面一行分割线。如果我们需要只输出前几个数字(如0-2),则需要在指定时刻(执行完第三次循环的时候)结束循环,此时就需要用到break语句,代码如下:
for i in range(5):
print(i)
print(‘-------’)
if i==3:
break
2. continue语句
Python语言中continue 语句的用法跟C语言中的用法相同,都是跳出本次循环,而break语句则是跳出整个循环。continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环,用在while和for循环中。
例如break语句中的只输出0-2的数字实例,如果我们想输出除3以外的所有0-4的数字,则不能使用上述方法,需要将其中的break语句改为continue语句,改后的代码如下:
for i in range(5):
print(i)
print(‘-------’)
if i==3:
continue
此时,输出的结果是只有0,1,2,4四个数字。
注意:
- break和continue语句只能用在循环结构中,不能单独使用。
- break和continue语句用于嵌套循环时,只会对所处的当前层的循环起作用。
3. pass语句
在实际开发中,有时候我们需要先搭建起程序的整体逻辑结构,而暂时不去实现其中的某些细节。针对此种情况,各种语言的处理方式大致相同,都是在这些不需要当时实现的地方使用空的语句,并且加上适当的注释,方便以后再添加代码。Python语言的空语句是pass语句,pass 是 Python 中的关键字,用来让解释器跳过此处而不做任何事情,其作用除了保持程序结构的完整性以外,一般用作占位符。
四)异常语句
调试Python程序时,经常会报出一些异常,异常的原因一方面可能是写程序时由于疏忽或者考虑不全造成了错误,这时就需要根据异常追溯到出错点,进行分析改正;另一方面可能是外界原因导致的异常,这些异常很多是不可避免的,但我们可以对异常进行捕获处理,防止程序终止。为了处理这些情况,Python语言提供了功能强大的异常处理机制。
1. Python语言中的异常类:
Python中的所有异常类都是Exception的子类,都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。下面介绍几种常见的异常。
a-内置异常
Python的异常处理能力是很强大的,它有很多内置异常,可向用户准确反馈出错信息,BaseException是所有内置异常的基类。异常一旦引发而且没有捕捉SystemExit异常,程序执行就会终止,如果交互式会话遇到一个未被捕捉的SystemExit异常,会话就会终止。
b-requests模块的相关异常
requests是一个十分好用的模块,而requests模块中的内置异常在做爬虫时经常需要用到,因此我们讲解一下requests模块的内置异常。要调用requests模块的内置异常,只要在“import request”后面跟上“from requests.exceptions import xxx”就可以了,比如:
from requests.exceptions import ConnectionError, ReadTimeout
或者也可以这样写:
from requests import ConnectionError, ReadTimeout
c-用户自定义异常
除了使用Python内置的异常类之外,你也可以通过创建一个新的异常类拥有自己的异常,异常应该是通过直接或间接的方式继承自Exception类。
2. 异常处理
当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。Python的异常捕获常用try…except…结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。其异常处理的结构有以下几种。
a- try…except结构
异常处理结构中最常见也最基本的结构。其中try子句中的代码块包含可能出现的语句,而except子句中的代码块用来处理异常。如果try中的代码块没有出现异常,则继续往下执行异常处理结构后面的代码;如果出现异常并且被except子句捕获,则执行except子句中的异常处理代码;如果出现异常但是没有被except捕获,则继续往外层抛出;如果所有层都没有捕获并处理该异常,则程序终止并将该异常抛给最终用户。
语法结构如下:
try:
try块
except Exception[as reason]:
exception块
如果要捕获所有类型异常,可以使用BaseException,即Python异常类的基类,代码格式如下:
try:
try块
except BaseException as e:
exception块
b- try…except…else结构
带else子句的异常处理结构是一种特殊形式的选择结构。如果try中的代码抛出了异常,并且被某个except捕获,则执行相应的异常处理代码,这种情况下不会执行else中的代码,依赖于try代码块成功执行的代码都应该放到else代码块中;如果try中的代码没有抛出任何异常,则执行else块中的代码。 工作原理:Python尝试执行try代码块中的代码;只有可能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块成功执行时才需要运行的代码,这些代码应放在else代码块中。except代码块告诉Python,如果尝试运行try代码块中的代码时引发了指定的异常,通过预测可能发生错误的代码,编写健壮的程序,它们即使面临无效数据或缺少资源,也能继续运行,从而能抵御无意的用户错误和恶意的攻击。
c-带有多个except的try结构
在实际开发中,同一段代码可能会抛出多个异常,需要针对不同异常类型进行相应的处理。为了支持多个异常的捕捉和处理,Python提供了带有过个except的异常处理结构,类似于多分支选择结构。一旦某个except捕获了异常,则后面剩余的except子句将不会再执行。 将要捕获的异常写在一个元组中,可以使用一个except语句捕获多个异常,并且共用同一段异常处理代码,当然,除非确定要捕获的多个异常可以使用同一段代码来处理,否则并不建议这样做。
d-try…except…finally结构
try…except…finally结构中的finally后面的语句块无论是否发生异常都会执行,常用来做一些清理工作以释放try语句中申请的资源。 需要注意的问题是,如果try子句中的异常没有被捕获和处理,或者except子句或else子句中的代码出现了异常,那么这些异常将会在finally子句执行完成后再次抛出。finally中的代码也可能会抛出异常,使用带有finally子句的异常处理结构时,应尽量避免在子句中使用return语句,否则可能会出现出乎意料的错误。
e-2.5 断言
Python在unittest.TestCase类中提过了很多断言的方法。断言方法检查你认为该满足的条件是否确实满足。如果不满足Python将引发异常。 语法:
assert expression[,reason]
assert语句一般用于对程序某个时刻必须满足的条件进行验证,仅当”debug” 为True时有效。当Python脚本以_()选项编译为字节码文件是,assert语句将被移除以提高运行速度。
f-上下文管理
使用上下文管理语句with可以自动管理资源,在代码块执行完毕后自动还原进入改代码块之前的现场或上下文。不论何种原因跳出with块,也不论是否发生异常,总能保证资源被正确释放,大大简化了程序员的工作,常用于文件操作、网络通信之类的场合。 with语句的语法如下:
with context_expr [as var]:
with块
g-用sys模块回溯最后的异常
当发生异常时Python会回溯异常,给出大量的提示,可能会给程序员的定位和纠错带来一定的困难,这是可以使用sys模块回溯最近一次异常。语法为:
import sys
try:
block
except:
t==sys.exc_info()
print(t)
sys.exc_info()返回值是一个三元组(type,value/message,traceback)。其中,type表示异常的类型,value/message表示异常的信息或者参数,而traceback则包含调用栈信息的对象。 sys.exc_info()可以直接定位最终引发异常的原因,结果比较简洁,但是缺点是难以直接确定引发异常的代码位置。
3. 异常抛出
在Python中,程序运行出现错误的时候会引发异常,但是我们也可以主动地抛出异常,主动抛出异常的方式主要是使用raise语句。 raise语句的格式是:
raise [someException [, args [, traceback]]]
4.自定义异常
实际开发中,有时候Python系统提供的异常类型不能满足开发的需求,跟java一样,Python也可以自定义异常,异常类继承自 Exception 类,可以直接继承,或者间接继承,并且可以手动抛出。注意,自定义异常只能由自己抛出(即使用前面讲过的raise语句抛出),Python解释器是不知道用户自定义异常是什么东西的。