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

一、条件分支
将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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值