装饰器
原始的装饰器模式
- 下面的实例是在函数 f1 执行前打印一个时间
1 | def decorator(func): |
Python 中对于装饰器的语法糖
1 | def decorator(func): |
带参数的装饰器
1 | def decorator(func): |
- 调用一个函数,如果不知道函数的参数,都可以用
func(*args, **kw)
这种形式调用,因此为了通用,装饰器的内部函数wrapper
的参数就可以为这种形式
装饰器带有参数
- 如果装饰器带有参数,可以再在外面套一层函数
1 | def log(text): |
Python 的其他知识
列表推导式
- 列表推导式类似 map 或 filter 函数,是 Python 特有的语法
1 | a = [1, 2, 3, 4, 5, 6, 7, 8] |
迭代器与生成器
迭代器
- 可迭代对象,可以被 for-in 遍历的对象,list, set 等
- 迭代器,是一个对象
- 迭代器有一次性的特征,只能遍历一次
- 迭代器一定是一个可迭代对象,但是可迭代对象不一定是迭代器,例如 list 是可迭代对象,但 list 不是迭代器,因为 list 可以重复遍历
1 | # BookCollection就是一个自定义的可迭代对象 |
解决只能遍历一次的问题
1 | import copy |
生成器
- 生成器是一个函数,主要是为了解决遍历时内存消耗过大的问题
1 | def gen(max): |
None
- None 表示空,不等于空字符串,空列表,false,0,如果是从类型还是比较运行算上都不相等
- None 在作为条件判断时会转为 False
1 | a = [] |
- 自定义对象参与条件判断与内置的
__len__
与__bool__
方法有关 - 不存在
__bool__
时会调用__len__
来判断对象时 True 还是 False,__len__
返回 0 或 False,则对象为 False,否则对象为 True - 全局 len 函数就是调用对象的
__len__
- 如果有
__bool__
方法,则由__bool__
方法来控制对象时 True 还是 False,__bool__
只能返回 Bool 类型,__len__
不再被调用
装饰器的副作用
- 添加装饰器后,函数的名字
__name__
会被改变
1 | import time |
解决办法: 使用 wraps
1 | import time |
错误处理
Python 中的异常
- Exception
- AttributeError
- IndexError
- KeyError
- NameError
- SyntaxError
- TypeError
- ValueError
- ZeroDivisionError
错误处理
1 | try: |