资料链接:https://pan.quark.cn/s/b0304e419fa9 提取码:dwk4
一.闭包-Closure
- 闭包(Closure)是编程中的一个重要概念,通常指的是一个函数和其相关的环境(变量等)组合在一起的结构。具体来说,闭包允许函数访问其外部作用域中的变量,即使这个函数是在其外部作用域之外被调用的。
在许多编程语言中,闭包的概念非常重要,特别是在处理异步编程和回调函数时。
闭包的特性
- 封闭性:闭包能够“记住”创建它的上下文环境。
- 私有变量:通过闭包,可以隐藏变量的状态,不让外部访问。
- 延迟执行:可以在外部函数返回后,依然保持对外部状态的引用。
闭包的应用场景
- 数据封装:可以创建私有变量,隐藏实现细节。
- 函数计数器:可以用闭包实现计数器功能。
- 创建工厂函数:通过闭包生成相关的对象或函数。
-
闭包是一个强大的工具,但过度使用或不恰当使用可能会导致内存泄漏或性能问题,因此在编写代码时需要小心使用
-
闭包的优缺点:
-
- 逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。
-
- 方便调用上下文的局部变量。
-
- 加强封装性,是第2点的延伸,可以达到对变量的保护作用。
-
-
使用闭包的注意点(缺点)
-
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包
-
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。
-
实例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
- 当您使用装饰器时,原始函数的元数据(如名称和文档字符串)可能会丢失。为了解决这个问题,您可以使用 functools.wraps 来帮助保留这些信息
-
带参数的装饰器
- repeat 是一个接受参数的装饰器工厂函数,它返回一个装饰器。
decorator 是真正的装饰器,它接受一个函数 func 作为参数。
wrapper 函数重复执行被装饰的函数 num 次。
使用 @repeat(3) 应用装饰器,使 greet 函数被执行3次。
注意:带参数的装饰器需要三层函数,def wrapper(args, kwargs) 传入的是被修饰的函数的参数。
- repeat 是一个接受参数的装饰器工厂函数,它返回一个装饰器。
-
装饰器链
- uppercase 和 exclamation 是两个装饰器,分别将文本转换为大写并添加感叹号。
使用 @exclamation 和 @uppercase 创建装饰器链,它们按照声明的顺序倒着依次应用。
say_hello 函数在执行前被链中的装饰器处理,最终输出 “HELLO, BOB!”。
- uppercase 和 exclamation 是两个装饰器,分别将文本转换为大写并添加感叹号。
-
类装饰器
- MyDecorator 是一个类装饰器,它接受一个函数 func 作为参数并在 call 方法中执行额外操作。
使用 @MyDecorator 应用类装饰器,它将包装 say_hello 方法,使其在调用前后执行额外操作。与基本装饰器类似
- MyDecorator 是一个类装饰器,它接受一个函数 func 作为参数并在 call 方法中执行额外操作。
三.Python异常
作用
用作信号通知,通知上层调用者有错误产生需要处理
1. try 语句
- 语法
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("程序结束")
2. raise 语句
-
问题
# 写一个函数, 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)
3.Python全部的错误类型
错误类型 | 说明 |
---|---|
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 | 用户代码生成的警告 |
四.Python正则表达式
- 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使 Python 语言拥有全部的正则表达式功能。正则表达式在网络爬虫、数据分析中有着广泛使用,掌握正则表达式能够达到事半功倍的效果。
1.字符匹配
方法和功能
方法 | 功能 |
---|---|
match() | 判断一个正则表达式是否从开始处匹配一个字符串 |
search() | 遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象 |
findall() | 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回。如果给出的正则表达式中包含子组,就会把子组的内容单独返回,如果有多个子组就会以元组的形式返回。 |
finditer() | 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回 |
2.特殊字符
特殊字符 | 含义 |
---|---|
\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 相反 |