Python学习路程——Day16
异常常见类型
'''
SyntaxError
NameError
IndexError
KeyError
IndentationError
......
'''
1、SyntaxError
三种SyntaxError:
invalid syntax(无效语法)invalid character in identifier(标识符中有无效字符)EOL while scanning string literal(检查到不完整的字符串)
(1)SyntaxError: invalid syntax(无效语法),这是语法错误中最常见的一种,通常是由下面几种情况引起的。
遗漏了标点符号,比如漏了冒号,混用中英文符号等;关键字拼写错误或遗漏,比如while写成了whlie,for…in…中的关键字in忘写了等;变量名或函数名使用了关键字
(2)SyntaxError: invalid character in identifier(标识符中有无效字符);
在运行代码的时候出现这个错误有可能是你在写代码时频繁地切换中英文输入法所造成的,修改为对应的英文符号即可。
(3)SyntaxError: EOL while scanning string literal(检查到不完整的字符串);
这种情况通常是因为遗漏了字符串两边的引号,或者混用了引号(即字符串两边的引号不统一)。
2、NameError
NameError
NameError是最普通也是最常会遇到的内建报错类名,其代表问题出现在python 变量命名上,找不到变量名会引发NameError。
3、IndexError
IndexError
引用超过list最大索引
导致“IndexError: list index out of range”
该错误发生在如下代码中:
spam = [‘cat’, ‘dog’, ‘mouse’]
print(spam[6])
4、KeyError
KeyError
使用不存在的字典键值
导致“KeyError:‘spam’”
该错误发生在如下代码中:
spam = {‘cat’: ‘Zophie’, ‘dog’: ‘Basil’, ‘mouse’: ‘Whiskers’}
print(‘The name of my pet zebra is ‘ + spam[‘zebra’])
5、IndentationError
Python是一种对缩进非常敏感的语言,最常见的情况是tab和空格的混用会导致错误,或者缩进不对
异常处理语法结构
1、基本语法结构
'''
语法结构:
try:
待检测的代码(自己无法控制,且有可能出现的错误的代码)
except 错误类型:
针对上述错误类型所指定的方案
'''
try:
name = 'jason'
print(nama)
except NameError:
print('名字未定义') # 名字未定义
2、查看错误信息
'''
语法结构:
try:
待检测的代码(自己无法控制,且有可能出现的错误的代码)
except 错误类型 as e:
针对上述错误类型所指定的方案
这里面的e打印出来是系统报的错误信息
e(error)只是一个变量名
'''
try:
name = 'jason'
print(nama)
except NameError as e:
print('名字未定义') # 名字未定义
print(e) # name 'nama' is not defined
3、针对不同的错误类型制订不同的解决方案
'''
语法结构:
try:
待检测的代码(自己无法控制,且有可能出现的错误的代码)
except 错误类型 as e:
针对上述错误类型所指定的方案
except 错误类型 as e:
针对上述错误类型所指定的方案
except 错误类型 as e:
针对上述错误类型所指定的方案
只有except的错误类型符合才会执行,反之不会执行,如果都不符合,则会报错
'''
try:
name = 'jason'
print(nama)
except IndexError as e:
print('索引错误')
print(e)
except TypeError as e:
print('类型错误')
print(e)
except NameError as e:
print('名字未定义') # 名字未定义
print(e) # name 'nama' is not defined
4、万能异常
'''
使用Exception/BaseException
语法结构:
try:
待检测的代码 (自己无法控制,且有可能出现的错误的代码)
except Exception as e:
print(e)
'''
try:
name = 'jason'
print(nama)
except Exception as e:
print(e) # name 'nama' is not defined
5、结合else使用
'''
语法结构:
try:
待检测的代码 (自己无法控制,且有可能出现的错误的代码)
except Exception as e:
print(e)
else:
try的子代码正常运行结束,没有任何的报错后,执行else子代码
'''
try:
name = 'jason'
print(name) #jason
except Exception as e:
print(e)
else:
print('No problem') # No problem
6、结合finally使用
'''
语法结构:
try:
待检测的代码 (自己无法控制,且有可能出现的错误的代码)
except Exception as e:
print(e)
else:
try的子代码正常运行结束,没有任何的报错后,执行else子代码
finally:
无论try的子代码是否报错,最后都要执行finally的子代码
'''
try:
name = 'jason'
print(nama)
except Exception as e:
print(e) # name 'nama' is not defined
else:
print('No problem')
finally:
print('it\'s cool') # it's cool
异常处理补充
1、断言
'''
assert (断言)
isinstance() 内置函数,用来判断一个对象的变量类型
语法结构:
assert 需要断言的代码
'''
name = 'jason'
assert isinstance(name, str)
print('是字符串类型的话,就执行我吧') # 是字符串类型的话,就执行我吧
2、主动抛异常
'''
raise Exception('抛出的异常错误类型')
'''
name = 'jason'
if name == 'jason':
raise Exception('抛出异常') # Exception: 抛出异常
else:
print('正常执行')
异常处理实战应用
1、异常处理使用场景
'''
1、异常处理能尽量少用就少用
2、被try监测的代码能少,就尽量少
3、当代码中可能会出现一些无法控制的情况下,才应该考虑使用
'''
2、使用异常处理的示例
'''
使用while循环+异常处理+迭代器对象,完成for循环迭代取值的功能
'''
list_one = [11, 22, 33, 44, 55, 66]
def next():
res = list_one.__iter__()
while True:
print(res.__next__())
try:
while True:
next()
except StopIteration as e:
print(e)
生成器对象
1、本质
'''
还是内置有__iter__和__next__的迭代器对象
'''
2、区别
'''
迭代器对象是解释器自动提供的
数据类型/文件对象>>>:迭代器对象(生成器)
'''
3、创建生成器的基本语法
'''
函数体代码中填写yield关键字
注意事项:
1、函数体代码中如果有yield关键字,那么函数名()就不会执行函数体代码,而是会生成一个生成器对象(迭代器对象)
2、使用加括号之后的结果调用__next__才会执行函数体代码
3、每次执行完__next__代码都会停留在yield位置,下次基于该位置继续前往找第二个yield
4、yield还有点类似于return,可以返回返回值
'''
def print_some():
print('1')
yield
print('2')
yield
print('3')
yield
print('4')
yield
print('5')
yield
print('6')
yield
res = print_some()
a = res.__next__() # 1
print(a) # a接收返回值11
res.__next__() # 2
res.__next__() # 3
res.__next__() # 4
res.__next__() # 5
res.__next__() # 6
生成器示例
'''
自定义生成器对标range功能(一个参数 两个参数 三个参数 迭代器对象)
1.先写两个参数的
2.再写一个参数的
3.最后写三个参数
'''
def my_range(start_number, end_number=None, step=1):
if not end_number:
end_number = start_number
start_number = 0
while start_number < end_number:
yield start_number
start_number += step
for i in my_range(1, 10, 2):
print(i)
yield冷门用法
def eat(name, food=None):
print(f'{name}准备用餐')
while True:
food = yield
print(f'{name}正在吃{food}')
res = eat('jason')
res.__next__()
res.send('奥力给') # 1.将括号内的数据传给yield前面的变量名 2.再自动调用__next__
res.send('力奥给')
res.send('给奥力')
生成器表达式
'''
生成器的简化写法
'''
# list_one = [i ** 2 for i in range(100)]
# print(list_one)
list_one = (i ** 2 for i in range(100)) # 生成器对象
print(list_one) # <generator object <genexpr> at 0x000002B31A7B6570>
for i in list_one:
print(i)
示例:
"""
(有难度)
大致知道流程即可
"""
def add(n, i): # 普通函数 返回两个数的和 求和函数
return n + i
def test(): # 生成器
for i in range(4):
yield i
g = test() # 激活生成器
for n in [1, 10]:
g = (add(n, i) for i in g)
"""
第一次for循环
g = (add(n, i) for i in g)
第二次for循环
g = (add(10, i) for i in (add(10, i) for i in g))
"""
res = list(g)
print(res)
#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]
#D. res=[21,22,23,24]
'''不用深入研究 大致知道起始数即可'''
标签:__,路程,name,Python,res,代码,except,Day16,print
From: https://www.cnblogs.com/HaiMan/p/16800333.html