• 【Python基础之函数:异常相关和生成器对象、yield用法、生成器表达式】


    在这里插入图片描述

    🤵‍♂️ 个人主页@老虎也淘气 个人主页
    ✍🏻作者简介:Python学习者
    🐋 希望大家多多支持我们一起进步!😄
    如果文章对你有帮助的话,
    欢迎评论 💬点赞👍🏻 收藏 📂加关注

    一、异常常见类型

    1、类型错误

    TypeError: must be str, not int
    类型错误:必须是一个字符串
    
    • 1
    • 2

    2、缩进错误

    IndentationError: unindent does not match any outer indentation level
    缩进错误:未知缩进不匹配任何缩进等级
    
    • 1
    • 2

    3、索引错误

    IndexError: string index out of range
    索引错误:字符串超出了范围
    
    • 1
    • 2

    4、语法错误

    SyntaxError: invalid syntax
    语法错误:非法的语法
    
    • 1
    • 2

    5、属性错误

    AttributeError: 'tuple' object has no attribute 'remove'
    属性错误:元组对象没有属性‘remove’
    
    • 1
    • 2

    6、key键错误

    KeyError: 'fond'
    key键错误:没有指定的键‘fond’
    
    • 1
    • 2

    二、异常处理语法结构

    1、基本语法结构

    关键词:
    	try# 监测的代码(可能出错的代码)
       except 错误类型:
    		# 针对错误做的措施	
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、查看错误类型

    代码用法:
    	try# 监测的代码(可能出错的代码)
       except 错误类型 as e:
    		# 针对错误做的措施	e 就是错误的类型 可用print接收打印
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、针对不同类型所作措施

    代码用法:
        try:
            待监测的代码(可能会出错的代码)
        except 错误类型1 as e:  # e就是系统提示的错误信息
            针对上述错误类型1制定的方案
        except 错误类型2 as e:  # e就是系统提示的错误信息
            针对上述错误类型2制定的方案
        except 错误类型3 as e:  # e就是系统提示的错误信息
            针对上述错误类型3制定的方案
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4、万能异常

    关键词: Excpetion/Baseexcpetion
    代码用法:
    	 try:
            待监测的代码(可能会出错的代码)
        excpet Excpetion as e:  # e就是系统提示的错误信息
            针对各种错误统一做出处理
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5、结合else使用

    代码用法:
        try:
            待监测的代码(可能会出错的代码)
        except Exception as e:  # e就是系统提示的错误信息
            针对各种常见的错误类型全部统一处理
        else:
            try的子代码正常运行结束没有任何的报错后 再执行else子代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6、结合finally使用

    代码用法:
    	 try:
            待监测的代码(可能会出错的代码)
        except Exception as e:  # e就是系统提示的错误信息
            针对各种常见的错误类型全部统一处理
        else:
            try的子代码正常运行结束没有任何的报错后 再执行else子代码
        finally:
            无论try的子代码是否报错 最后都要执行finally子代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    三、异常处理补充

    1、断言

    作用:

    ​ 用来判断代码类型,判断正确则正常按顺序往下执行,反之则报错

    ​ 在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助

    关键词:assert isinstance
    	代码用法:
    	 判断正确:
        list_1 = [1, 2, 3, 4]
        assert isinstance(list_1 , list)
        print('判断正确...该我出场了...')
    ---------------------------------------------------------------------------------------
    判断正确...该我出场了...
        
    	判断错误:
        ist_1 = [1, 2, 3, 4]
        assert isinstance(list_1 , str)
        print('判断正确...该我出场了...')
    --------------------------------------------------------------------------------------
        assert isinstance(list_1 , str)
    AssertionError
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2、主动抛异常

    作用:

    ​ 主动让代码报错

    ​ 有时,程序需要主动抛出异常,因为某些情况下,你需要反馈消息给更上层的调用者,告诉它有一些异常情况发生,而你抛出异常的地方,没有能力处理它,因此需要向上抛出异常。

    这种情况为什么不让系统自己抛出异常呢?一个原因是上层的调用者本身就希望能够捕获有别于系统异常的自定义异常,二来,有些情况下,程序的逻辑是没有异常的,但是,从业务角度考虑,的确是一个不寻常的情况,因此需要我们主动抛出异常。

    关键词: raise
    	代码表现:
        def func():
            print('嘿嘿嘿')
    
        raise func()
    -------------------------------------------------------------------------------
        raise func()
    TypeError: exceptions must derive from BaseException
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    四、异常处理实战应用

    异常处理能少用就尽量少用
    当代码中出现无法控制的情况报错才考虑使用try
    使用代码模拟完成for循环遍历取值功能:

    # 定义列表
    list_1 = ['春', '夏', '秋', '冬']
    # 将列表转换为迭代器
    l2 = list_1.__iter__()
    # 检测这段代码
    try:
        while True:
            print(l2.__next__())
    # 拦截报错信息,并处理
    except StopIteration:
        pass
    --------------------------------------------------------------------------------
    春
    夏
    秋
    冬
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    五、生成器对象

    引言:

    ​ 生成器的本质也是迭代器,它是由程序员编写出来的迭代器

    ​ 生成器的本质也是含有__ iter __ 和__ next __ 的迭代对象

    1、创建生成器的基本语法

    1、需要在函数体代码中填写关键词:yield
    2、当函数体代码中含有yield关键词时,运行此段函数体代码并不会执行,而是将函数体代码变为生成器对象
    3、在使用__ next __调用生成器对象后代码才会运行
    4、代码在运行后遇到yield关键词后会停止运行,并在当前位置停留,下次基于该位置继续往下找第二个yield

    关键词:yield    # 在函数体代码中填写
    1.基本用法:	
        代码用法:
            def func(a):
                print(a+0, '执行了第1段代码')
                yield
                print(a+1, '执行了第2段代码')
                yield
                print(a+2, '执行了第2段代码')
                yield
    
            res = func(1).__iter__()
            res.__next__()
            res.__next__()
            res.__next__()
    ------------------------------------------------------------------------------
    1 执行了第1段代码
    2 执行了第2段代码
    3 执行了第2段代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    六、yield冷门用法

    yield关键词还可以给函数体进行传参

    def func(name, verb=None):
        print(f'{name}')
        while True:
            verb = yield
            print(f'{name}{verb}')
    
    
    res = func('kangkang')
    res.__next__()
    res.send('吃饭')
    res.send('码代码')
    res.send('睡觉')
    res.send('背单词')
    ---------------------------------------------------------------------------------------
    kangkang
    kangkang在吃饭
    kangkang在码代码
    kangkang在睡觉
    kangkang在背单词
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    七、生成器表达式

    1、什么是生成器表达式

    生成器表达式就区别与之前的所学的表达式,生成器表达式就相当于生成了一个数据值库,只有在我们进行取值是才会生成,能够大幅度节省内存空间

    2、生成器语法结构

    list_1 = [i for i in range(0, 100)]
    print(list_1)
    -------------------------------------------------------------------------------------
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
    
    • 1
    • 2
    • 3
    • 4

    八、索引取值和迭代取值的区别

    1、索引取值

    优点:
    1.可以通过值的位置取值

    2.同一值可取多次

    缺点:
    1.依赖与索引的方式才能取值

    2、迭代取值

    优点:
    1.节省空间
    缺点:
    1.同一值只能取一次,不可多次取相同值
    在这里插入图片描述

  • 相关阅读:
    时态图根据时间轴动态播放热力图
    Opencv之RANSAC算法用于直线拟合及特征点集匹配详解
    Android Studio打造一个小说阅读App
    初阶数据结构学习记录——열셋 排序(2)
    文件操作 和 IO - 详解
    云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)
    Flutter热更新技术探索
    华为云中对象存储服务软件开发工具包(OBS SDK) C语言介绍
    PMP考试提分必刷题
    Jmeter —— jmeter接口自动化测试操作流程
  • 原文地址:https://blog.csdn.net/m0_66106755/article/details/127811178