闭包
闭包的定义:
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
通过闭包的定义,我们可以得知闭包的形成条件:
1- 在函数嵌套(函数里面再定义函数)的前提下
2- 内部函数使用了外部函数的变量(还包括外部函数的参数)
3- 外部函数返回了内部函数
2,闭包的作用
闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁。
def f1(num):def f2(a,b):r = num + 100+a+bprint(r)return f2if __name__ == '__main__':a = f1(100)a(100,50)
# 就是一个外部方法接收参数,内部方法进行计算,并让外部函数返回内部函数的名字
# 目的就是延长外部参数的生命周期
装饰器
装饰器的定义
就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
装饰器的功能特点:
不修改已有函数的源代码
不修改已有函数的调用方式
给已有函数增加额外的功能
# 添加一个登录验证的功能
def check(fn):def inner():print("请先登录....")fn()return innerdef comment():print("发表评论")# 使用装饰器来装饰函数
comment = check(comment)
comment()
装饰器的语法糖写法
Python给提供了一个装饰函数更加简单的写法,那就是语法糖,语法糖的书写格式是: @装饰器名字,通过语法糖的方式也可以完成对已有函数的装饰
# 添加一个登录验证的功能
def check(fn):print("装饰器函数执行了")def inner():print("请先登录....")fn()return inner# 使用语法糖方式来装饰函数
@check
def comment():print("发表评论")comment()
说明:
@check 等价于 comment = check(comment)
装饰器的执行时间是加载模块时立即执行
# 添加输出日志的功能
def logging(fn):def inner(num1, num2):print("--正在努力计算--")fn(num1, num2)return inner# 使用装饰器装饰函数
@logging
def sum_num(a, b):result = a + bprint(result)sum_num(1, 2)
with语句
try:# 1、以读的方式打开文件f = open("1.txt", "r")# 2、读取文件内容f.write("xxxxx")except IOError as e:print("文件操作出错", e)finally:# 3、关闭文件f.close()
# 1、以写的方式打开文件
with open("1.txt", "w") as f:# 2、读取文件内容f.write("hello world")
深浅拷贝
import copynum1 =1
print(id(num1))
num1=2
print(id(num1))num2 = copy.copy(num1)
print(id(num2))print("以下为不可变类型"*5)
li = [1,2,3]
print(id(li))
li.append(4)
print(id(li))li2 = copy.copy(li)
print(id(li2))
print(li2)print("浅拷贝两层"*7)
li3 = [1,2,3,[4,5]]
print(id(li3))
# 第二层打印出来的id值是相同的
print(id(li3[3]))li2 = copy.copy(li3)
print(id(li3[3]))
print(id(li2))
print(li2)print("深拷贝"*50)li4 = [1,2,3,[4,5]]
print(id(li4))
# 第二层打印出来的id值是不同的
print(id(li3[3]))li5 = copy.deepcopy(li4)
print(id(li5[3]))
print(id(li5))print("浅拷贝外面可变,里面不可变"*30)
list1 =['qw',12,(1,2)]print(id(list1))
list1.append(4)
print(id(list1))
print(id(list1[2]))list12 = copy.deepcopy(list1)
print(id(list12))
print(id(list12[2]))
140723981244064
140723981244096
140723981244096
以下为不可变类型以下为不可变类型以下为不可变类型
2338845806400
2338845806400
2338845810816
[1, 2, 3, 4]
浅拷贝两层浅拷贝两层浅拷贝两层浅拷贝两层
2338845811136
2338845740608
2338845740608
2338845811584
[1, 2, 3, [4, 5]]
深拷贝深拷贝深拷贝深拷贝深拷贝深拷贝深拷贝深拷贝深
2338845811456
2338845740608
2338845805120
2338845811200
浅拷贝外面可变,里面不可变浅拷贝外面可变,里面不可
2338847010496
2338847010496
2338844366720
2338847009920
2338844366720
re模块(正则表达式)
\w
-
匹配非特殊字符
-
数字、字母、中文、
-
\W
-
匹配特殊字符
-
\s
-
匹配空格、\n、\t
-
一个长度
-
-
\S
-
匹配非空格、非\n、非\t
-
数字、特殊字符、中文等等都行
-
# 导入re模块
import re# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()