Python学习 day5

资料链接:https://pan.quark.cn/s/b0304e419fa9 提取码:dwk4

一.闭包-Closure

  • 闭包(Closure)是编程中的一个重要概念,通常指的是一个函数和其相关的环境(变量等)组合在一起的结构。具体来说,闭包允许函数访问其外部作用域中的变量,即使这个函数是在其外部作用域之外被调用的。

在许多编程语言中,闭包的概念非常重要,特别是在处理异步编程和回调函数时。

闭包的特性

  1. 封闭性:闭包能够“记住”创建它的上下文环境。
  2. 私有变量:通过闭包,可以隐藏变量的状态,不让外部访问。
  3. 延迟执行:可以在外部函数返回后,依然保持对外部状态的引用。

闭包的应用场景

  1. 数据封装:可以创建私有变量,隐藏实现细节。
  2. 函数计数器:可以用闭包实现计数器功能。
  3. 创建工厂函数:通过闭包生成相关的对象或函数。
  • 闭包是一个强大的工具,但过度使用或不恰当使用可能会导致内存泄漏或性能问题,因此在编写代码时需要小心使用

  • 闭包的优缺点:

      1. 逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。
      1. 方便调用上下文的局部变量。
      1. 加强封装性,是第2点的延伸,可以达到对变量的保护作用。
  • 使用闭包的注意点(缺点)

      1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包
      1. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(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) 传入的是被修饰的函数的参数。
  • 装饰器链

    • uppercase 和 exclamation 是两个装饰器,分别将文本转换为大写并添加感叹号。
      使用 @exclamation 和 @uppercase 创建装饰器链,它们按照声明的顺序倒着依次应用。
      say_hello 函数在执行前被链中的装饰器处理,最终输出 “HELLO, BOB!”。
  • 类装饰器

    • MyDecorator 是一个类装饰器,它接受一个函数 func 作为参数并在 call 方法中执行额外操作。
      使用 @MyDecorator 应用类装饰器,它将包装 say_hello 方法,使其在调用前后执行额外操作。与基本装饰器类似

三.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语法错误
TabErrorTab 和空格混用
SystemError一般的解释器系统错误
UnicodeErrorUnicode 相关的错误
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeTranslateErrorUnicode 转换时错误
以下为警告类型
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 相反
  • 33
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值