一、条件分支
将if…else缩减为单一行的条件表达式:
w = 100 + (10 if a >5 else 0)
一般使用的时候最好用圆括号括起来,防止误操作。
二、循环
1.while循环
while boolean_expression:
while_suite
else:
else_suite
如果while循环正常终止,则执行else,如果while被break或者抛出异常或者return,则不会执行else语句中的suite。如果suite中出现continue语句,则会重新返回到循环起点开始执行。
def list_find(lst,target):
index = 0
while index < len(lst):
if lst[index] = target:
break
index = index + 1
else:
index = -1
return index
2.for in 循环
for experssion in iterable:
for_suite
else:
else_suite
通常experssion或者是一个单独的变量,或者是一个变量序列,一般是以元组形式给出,如果将元组或列表应用于experssion,则其中每一数据项都会被拆分到表达式的项。如果在for_suite中调用了continue,则会重新返回到循环起点运行,循环终止则运行else_suite。如果被break、异常、return,则不会运行else_suite。
def list_find(lst,target):
for index,x in enumerate(lst):
if x == target:
break
else:
index = -1
return index
三、捕获与产生异常
异常的捕获是使用try…except…模块实现的,其通常语法如下:
try:
try_suite
except exception_group1 as variable1:
except_suite1
except exception_group2 as variable2:
except_suite2
else:
else_suite
finally:
finally_suite
其中至少要包含一个except块,如果try模块正常执行,则下来执行else模块,如果抛出异常,则不执行else模块,如果有finally模块,则最终总是运行finally模块。else跟finally模块可选。
如果try的suite中出现异常,则每个except分支会顺序尝试执行,如果该异常与某个异常组(元组)匹配,则相应的suite得以执行。要与异常组进行匹配,异常必须与组中列出的异常类型(或其中的一个)一致,或与组中列出的异常类型的子类一致。
例如,如果在字典中产生KeyError异常,那么包含Exception类的第一个except分支将匹配这一异常,因为KeyError是Exception的非直接子类,如果except分支没有Exception异常,但存在一个LookupError子类,那么KeyError异常也可以匹配,因为KeyError也是Exception的子类,如果哪个分支含有KeyError也将匹配。总是匹配第一个except分支,如果匹配上,则接下来的分支不执行。因此,以下是一个不正常的实例:
try:
x = d[5]
except LookupError as err:
print(err)
except KeyError as err1:
print(err1)
else:
print('No error')
finally:
print('end!')
由上例,在使用多个except分支时,我们必须对其排序,从最具针对性的异常(在异常系中最底层)到最通常的异常(异常系中最顶层)。
直接写成except:也是可能的,即为不设置异常组,写成这种风格的异常块将捕获任意异常,包括BaseException等非Exception异常。
如果没有哪个except块匹配到异常,python会沿着调用栈回溯,并寻找适当的异常处理程序。如果找不到合适的异常处理程序,则程序将终止,并在该控制台上打印该异常以及回溯信息。
如果没有exception产生,那么可选的else模块将被执行。在所有任意情况下——没有发生异常,发生异常并被处理,发生异常回溯到调用栈等,finally模块都将被执行。如果没有异常产生或者异常被某个except捕获,则最后运行finally模块。如果异常没有被捕获,则运行完finally模块后,回溯到调用栈处理。
try…except…finally控制流如下:
四、产生异常
异常提供了一种改变控制流的有效方法,我们可以使用内置的异常,或创建自己的异常,以便产生我们所需要的异常并对其进行处理。有以下产生异常的方法:
raise exception(args)
raise exception(args) from original_excepton
raise
使用第一种语法时,指定的异常应该为内置的异常,或者继承自Exception的自定义异常。如果给定一些文本为该异常的参数,那么在捕获到该异常并打印时,这些文本应该作为输出信息。
使用第二种语法时,即没有指定异常时,raise将重新产生当前活跃的异常——如果没有就会产生一个TypeError。
实例如下:
try:
raise KeyError('name')
except KeyError as err:
print(err)
else:
print('no exception')
finally:
print('stop')
out:
'name'
stop
五、自定义异常
class exceptionName(baseException):pass