在许多编程语言中,闭包的概念非常重要,特别是在处理异步编程和回调函数时。
闭包是一个强大的工具,但过度使用或不恰当使用可能会导致内存泄漏或性能问题,因此在编写代码时需要小心使用
闭包的优缺点:
使用闭包的注意点(缺点)
实例1 def give_yasuiqian(money): def child_buy(obj, m): nonlocal money if money > m: money -= m print('买', obj, '花了', m, '元, 剩余', money, '元') else: print("买", obj, '失败') return child_buy cb = give_yashuqian(1000) cb('变形金刚', 200) cb('漫画三国', 100) cb('手机', 1300)
装饰器(decorators) 是一种用于修改或增强函数或方法行为的设计模式。它们是高阶函数,接受一个函数作为参数,并返回一个新的函数。通过使用装饰器,您可以在不修改原始函数代码的情况下添加功能。
装饰器的基本语法使用 @decorator_name
。这行语句应放在需要应用装饰器的函数定义之前。
下面是一个简单的装饰器示例,它会在调用目标函数之前打印一条消息:
def mydeco(fn): fn() print("装饰器函数被调用了,并返回了fx") def fx(): print("fx被调用了") # return fn() return fx @mydeco def myfun(): print("函数myfun被调用") myfun() #函数myfun被调用 #装饰器函数被调用了,并返回了fx #fx被调用了 myfun() #fx被调用了
使用 functools.wraps
带参数的装饰器
装饰器链
类装饰器
作用
用作信号通知,通知上层调用者有错误产生需要处理
try: 可能发生异常的语句块 except 错误类型1 [as 变量名1]: 异常处理语句块1 except 错误类型2 [as 变量名2]: 异常处理语句块2 ... except 错误类型n [as 变量名n]: 异常处理语句块n except: 异常处理语句块other else: 未发生异常的语句 finally: 最终的处理语句
作用
尝试捕获异常,得到异常通知,将程序由异常状态变为正常状态
说明
except 子句可以有 1个或多个
except: 不给错误类型,可以匹配全部的错误类型
else 子句里的语句会在 没有错误发生时执行,当处于异常时不执行
finally 子句里的语句,无论何时都执行
示例
try: x = int(input("请输入一个整数:")) print('x=', x) except ValueError: print('您的输入不能转成整数') print("程序结束")
问题
# 写一个函数, get_score 函数,读取用户输入的整数成绩, # 成绩的正常值是0~100 之间, 要求, 如果不在0~100 之间 # 报 ValueError类型的错误 def get_score(): x = int(input('请输入成绩:')) if 0 <= x <= 100: return x raise ValueError
语法
raise 异常类型 或 raise 异常对象
作用
示例:
## 写一个函数, get_score 函数,读取用户输入的整数成绩, ## 成绩的正常值是0~100 之间, 要求, 如果不在0~100 之间 ## 报 ValueError类型的错误 def get_score(): x = int(input('请输入成绩:')) if 0 <= x <= 100: return x # raise ValueError raise ValueError('用户输入的成绩不在 0~100 之间') try: score = get_score() print(score) except ValueError as err: print("成绩输入有误 err=", err)
错误类型 | 说明 |
---|---|
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
ValueError | 传入无效的参数 |
AssertionError | 断言语句失败 |
StopIteration | 迭代器没有更多的值 |
IndexError | 序列中没有此索引(index) |
IndentationError | 缩进错误 |
OSError | 输入/输出操作失败 |
ImportError | 导入模块/对象失败 |
NameError | 未声明/初始化对象 (没有属性) |
AttributeError | 对象没有这个属性 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
TypeError | 对类型无效的操作 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
OverflowError | 数值运算超出最大限制 |
FloatingPointError | 浮点计算错误 |
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
Exception | 常规错误的基类 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
WindowsError | 系统调用失败 |
LookupError | 无效数据查询的基类 |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError Python | 语法错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
以下为警告类型 | |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
方法和功能
方法 | 功能 |
---|---|
match() | 判断一个正则表达式是否从开始处匹配一个字符串 |
search() | 遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象 |
findall() | 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回。如果给出的正则表达式中包含子组,就会把子组的内容单独返回,如果有多个子组就会以元组的形式返回。 |
finditer() | 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回 |
特殊字符 | 含义 |
---|---|
\d | 匹配任何十进制数字;相当于类 [0-9] |
\D | 与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9] |
\s | 匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [ \t\n\r\f\v] |
\S | 与 \s 相反,匹配任何非空白字符;相当于类 [^ \t\n\r\f\v] |
\w | 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9_] |
\W | 于 \w 相反 (注:re.ASCII 标志使得 \w 只能匹配 ASCII 字符) |
\b | 匹配单词的开始或结束 |
\B | 与 \b 相反 |