一、闭包
一个闭包最基本的知识就是三要素
1.外部函数嵌套内部函数
2.外部函数将内部函数返回
3.内部函数可以访问和保存外部函数局部变量
1、一个最最基本的闭包
以前我们写函数都是写的同级别关系,因为顺序关系,f2可以调用f1,f1不能调用f2
def f1():
pass
def f2():
pass
正常情况下我们写函数都是顺序,如下图代码
def f1():
print("f1")
def f2():
print("f2")
f1()
f2()
2、外部函数嵌套内部函数
下面代码f2函数就是在f1里面的内部函数
def f1():
print("f1")
def f2():
print("f2")
f2()#想要执行f2必须在函数内部执行
f1()
3、外部函数将内部函数返回
def f1():
print("f1")
def f2():
print("f2")
return f2 # 外部函数将内部函数返回
f1()
4、内部函数可以访问和保存外部函数局部变量
def f1():
print("f1")
i = 0
def f2():
print("f2",i)#内部函数f2访问和保存外部函数局部变量i
return f2
f1()
二、装饰器
目的就是不改变函数,就能给函数添加新功能
1.定义一个简单的函数
#首先定义三个函数
#加上功能,检测有没有登录,先给index添加功能
#给购物车,我的页面添加功能
def index():
username = input("请输入用户名:")
if username == "admin":
print("欢迎查看首页")
else:
print("用户校验失败")
index()
def cart():
username = input("请输入用户名:")
if username == "admin":
print("欢迎访问购物车")
else:
print("用户校验失败")
cart()
def mine():
username = input("请输入用户名:")
if username == "admin":
print("欢迎访问我的页面")
else:
print("用户校验失败")
mine()
2、使用闭包进行编写
因为使用之前写的话,代码重复太高,因此我们来结合闭包
# 1.定义三个基本函数
# 2.编写闭包
# 3.使用闭包加工原始3个函数
# 4,给闭包添加权限校验
# 5.函数调用
# 使用@装饰器语法糖
def index():
print("首页")
def chart():
print("购物车")
def mine():
print("个人中心")
# login_required使用闭包对f进行加工
def login_required(f):
def check():
username = input("请输入用户名")
if username == "admin":
f()
else:
print("校验失败")
return check
index = login_required(index)
index()
chart = login_required(chart)
chart()
mine = login_required(mine)
mine()
3、将不改变函数名的赋值更改为语法糖
def login_required(f):
def check():
username = input('输入姓名:')
if username == 'admin':
f()
print('校验成功')
else:
print('校验失败')
return check
@login_required
def mine():
print('我的')
@login_required
def cart():
print('购物车')
def index():
print('首页')
mine()
cart()
4、装饰器的案例使用
随机0-1000以内的500个数字放入列表,使用冒泡排序与选择排序对列表进行升序,编写装饰器统计两个方法的时间开销。
import time
lis = []
for m in range(500):
num = random.randint(0, 1000)
lis.append(num)
l1 = [i for i in lis]
def fun(f):
def sort_num():
start = time.time()
f()
end = time.time() - start
print(end)
return sort_num
@fun
def bubble_sort():
"""
冒泡排序
"""
for i in range(len(lis) - 1):
for j in range(i + 1, len(lis)):
if lis[i] > lis[j]:
lis[i], lis[j] = lis[j], lis[i]
@fun
def select_sort():
"""
选择排序
"""
for i in range(len(l1) - 1):
max_index = i
for j in range(i + 1, len(l1)):
if l1[max_index] > l1[j]:
max_index = j
l1[i], l1[max_index] = l1[max_index], l1[i]
# bubble_sort = fun(bubble_sort)
bubble_sort()
select_sort()
三、内置函数
1、数学计算
len、max、min、sorted、divmod、pow、round、sum
# len:求可迭代元素长度
print(len('hello'))
# 5
# max:求可迭代元素的最大值
print(max([10, -1, 3 + 11]))
# 14
# 根据后面的条件,得到前面元素的最大值
print(max([{"age": 20}, {"age": 15}, {"age": 50}], key=lambda x: x['age']))
# {'age': 50}
# min:最小值
print(min([{"age": 20}, {"age": 15}, {"age": 50}], key=lambda x: x['age']))
# {'age': 15}
# sorted:按照ascii大小对可迭代元素进行排序
print(sorted('3569238412gujdrg'))
# ['1', '2', '2', '3', '3', '4', '5', '6', '8', '9', 'd', 'g', 'g', 'j', 'r', 'u']
# abs:求绝对值
print(abs(-90))
# 90
# divmod:以元组的形式返回整除结果与余数的结果【divmod(被除数;除数)】
print(divmod(200, 6))
# (33, 2)
# pow:以第一个元素为底,以第二个元素为指数的次方数
print(pow(2, 5))
# 32
# round():四舍五入
print(round(3.14))
# 3
# sum:求和(其中的元素为可迭代的列表)
print(sum([i for i in range(10)]))
print(sum([1, 2, 3, 4, 5, 6, 7]))
# 45
# 28
2、判断是否全假或者全真
all、any
# all:所有元素为真才为真;为空返回的结果也为真
print(all([False, 'False', 10]))
print(all('False'))
print(all(''))
# False
# True
# True
# any:所有元素都为假才为假,空为假
print(any([None, 'a', 0]))
print(any([]))
# True
# False
3、进制转换
# bin:将十进制转化为二进制
print(bin(10))
# oct:将十进制转化为八进制
print(oct(10))
# hex:将十进制转化为十六进制
print(hex(100))
# 0b1010
# 0o12
# 0x64
4、ASCII与字符的转换
chr、ord
# 将ASCII转换为字符
print(chr(97))
# 将字符串转ASCII
print(ord('A'))
# a
# 65
5、局部与全局字典
globals、locals
# locals:以字典的形式返回内置函数
def fun():
i = 10
print(locals())
fun()
# globals:以字典的形式返回全局变量
print(globals())
6、id返回对象唯一标识
# id()
# 返回对象唯一标识
i = 10
print(id(i))