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]
'''不用深入研究 大致知道起始数即可'''

原文地址:http://www.cnblogs.com/HaiMan/p/16800333.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性