闭包的定义:
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
通过闭包的定义,我们可以得知闭包的形成条件:
1- 在函数嵌套(函数里面再定义函数)的前提下
2- 内部函数使用了外部函数的变量(还包括外部函数的参数)
3- 外部函数返回了内部函数
2,闭包的作用
闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁。
def f1(num):
def f2(a,b):
r = num + 100+a+b
print(r)
return f2
if __name__ == '__main__':
a = f1(100)
a(100,50)
# 就是一个外部方法接收参数,内部方法进行计算,并让外部函数返回内部函数的名字
# 目的就是延长外部参数的生命周期
装饰器的定义
就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
装饰器的功能特点:
不修改已有函数的源代码
不修改已有函数的调用方式
给已有函数增加额外的功能
# 添加一个登录验证的功能
def check(fn):
def inner():
print("请先登录....")
fn()
return inner
def 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 + b
print(result)
sum_num(1, 2)
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 copy
num1 =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
\w
匹配非特殊字符
数字、字母、中文、
\W
匹配特殊字符
\s
匹配空格、\n、\t
一个长度
\S
匹配非空格、非\n、非\t
数字、特殊字符、中文等等都行
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()