python基础学习四——控制结构与异常

来源:互联网 发布:使命召唤 ol命运数据 编辑:程序博客网 时间:2024/06/07 11:27

一、条件分支
将if…else缩减为单一行的条件表达式:
这里写图片描述

w = 100 + (10 if a >5 else 0)

一般使用的时候最好用圆括号括起来,防止误操作。
二、循环
1.while循环

while boolean_expression:    while_suiteelse:    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_suiteelse:    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_suiteexcept exception_group1 as variable1:    except_suite1except exception_group2 as variable2:    except_suite2else:    else_suitefinally:    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_exceptonraise

使用第一种语法时,指定的异常应该为内置的异常,或者继承自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