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

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

一、异常常见类型


1、类型错误


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

2、缩进错误


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

3、索引错误


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

4、语法错误


SyntaxError: invalid syntax
语法错误:非法的语法

5、属性错误

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

6、key键错误

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


二、异常处理语法结构


1、基本语法结构


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


2、查看错误类型


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


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


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


4、万能异常


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


5、结合else使用


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


6、结合finally使用


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


三、异常处理补充


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


2、主动抛异常


作用:


主动让代码报错


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


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

关键词: raise
  代码表现:
    def func():
        print('嘿嘿嘿')
    raise func()
-------------------------------------------------------------------------------
    raise func()
TypeError: exceptions must derive from BaseException


四、异常处理实战应用


异常处理能少用就尽量少用

当代码中出现无法控制的情况报错才考虑使用try

使用代码模拟完成for循环遍历取值功能:

# 定义列表
list_1 = ['春', '夏', '秋', '冬']
# 将列表转换为迭代器
l2 = list_1.__iter__()
# 检测这段代码
try:
    while True:
        print(l2.__next__())
# 拦截报错信息,并处理
except StopIteration:
    pass
--------------------------------------------------------------------------------


五、生成器对象


引言:


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


生成器的本质也是含有__ 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段代码


六、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、生成器语法结构


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、索引取值


优点:

1.可以通过值的位置取值

2.同一值可取多次

缺点:

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


2、迭代取值


优点:

1.节省空间

缺点:

1.同一值只能取一次,不可多次取相同值


相关文章
|
3月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
155 67
|
1月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
31 3
|
1月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
40 2
|
27天前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
16 0
|
2月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
63 18
|
2月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
83 8
|
2月前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
42 2
|
2月前
|
Python
Python中的函数
Python中的函数
60 8
|
2月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
63 3
|
3月前
|
大数据 数据处理 开发者
Python中的迭代器和生成器:不仅仅是语法糖####
本文探讨了Python中迭代器和生成器的深层价值,它们不仅简化代码、提升性能,还促进了函数式编程风格。通过具体示例,揭示了这些工具在处理大数据、惰性求值及资源管理等方面的优势。 ####