一、异常常见类型

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.同一值只能取一次,不可多次取相同值

Python基础之函数:6、异常相关和生成器对象、yield用法、生成器表达式的更多相关文章

  1. python基础(13):函数名的使用、第一类对象、闭包、迭代器

    1. 函数名的运用 函数名是⼀个变量,但它是⼀个特殊的变量,与括号配合可以执⾏函数的变量. 1.1 函数名的内存地址 def func(): print("呵呵") print(f ...

  2. python基础——返回函数

    python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.  我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...

  3. python基础之函数详解

    Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...

  4. python基础——匿名函数

    python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.  在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...

  5. python基础——sorted()函数

    python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...

  6. python基础——filter函数

    python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...

  7. python基础——匿名函数及递归函数

    python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...

  8. 八. Python基础(8)--函数

    八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x):     ' ...

  9. Python基础之函数:5、内置函数、迭代器对象、异常的捕获和处理

    目录 一.重要内置函数 1.zip() 2.filter() 3.sorted() 二.常见内置函数 1. abs() 2.all.any() 3.bin.oct.hex.int() 4.bytes( ...

随机推荐

  1. [多校 NOIP 联合模拟 20201130 T4] ZZH 的旅行(斜率优化dp,启发式合并,平衡树)

    题面 题目背景 因为出题人天天被 ZZH(Zou ZHen) 吊打,所以这场比赛的题目中出现了 ZZH . 简要题面 数据范围 题解 (笔者写两个log的平衡树和启发式合并卡过的,不足为奇) 首先,很 ...

  2. 事物的隔离性和MVCC

    事物的隔离性 mysql的服务端是支持多个客户端同时与之连接的,每个客户端可能还并发了好几个连接,所以mysql是需要同时处理很多事情的,每一件独立的事情就叫做事务.我们知道事务有一个叫隔离性的特性, ...

  3. metasploit进行局域网远控

    用metasploit进行局域网远程控制 Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全 ...

  4. 【原创】K8S环境下研发如何本地调试?kt-connect使用详解

    K8S环境下研发如何本地调试?kt-connect使用详解 背景 注:背景有点啰嗦,讲讲一路走来研发本地调试的变化,嫌烦的可以直接跳过,不影响阅读. 2019年 我在的公司当时是个什么情况,只有两个J ...

  5. idea每次换行后光标都跑到最左边问题

    最进用idea时发现每次换行之后一段时间光标会自动跑到最左边,默认把我的首行空格删掉了 IDEA版本为:IntelliJ IDEA 2020.2.3 x64

  6. Java 多线程:线程池

    Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: ...

  7. 正点原子keilkill脚本

    del *.bak /s del *.ddk /s del *.edk /s del *.lst /s del *.lnp /s del *.mpf /s del *.mpj /s del *.obj ...

  8. [Python]-sklearn模块-机器学习Python入门《Python机器学习手册》-02-加载数据:加载数据集

    <Python机器学习手册--从数据预处理到深度学习> 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习 ...

  9. Elasticsearch : alias数据类型

    就像其他的很多语言一样,我们可以给已有的变量取一个别名(alias).即便是对高级语言一样,比如我们定义不同的指针变量,指向同一个内存空间.这个有些类似别名的概念. 在Elasticsearch中,我 ...

  10. Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 ( 三)