1.装饰器
1.1 闭包
- 闭包三要素:
- 1. 外部函数嵌套内部函数
-
def f1(): def f2(): pass
2.外部函数将内部函数返回
-
def f1(): print("f1") def f2(): print("f2") return f2 r = f1() r()
3.内部函数可以访问保存外部函数局部变
-
def f1(): print("f1") i = 0 def f2(): # nonlocal相当于global, 但是使用的是外部函数的局部变量 nonlocal i i += 1 print("f2", i) return f2 # r 等于f2(r内部保存了变量i) r = f1() r() r() r()
1.2 装饰器
装饰器是Python中一种非常有用的语法特性,它可以在不修改原函数代码的情况下,通过在原函数的前后添加额外的功能或逻辑。装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个新的函数。
编写代码演示装饰器语法的思路:
- 定义3个基本函数
- 编译闭包
- 使用闭包加工原始3个函数
- 给闭包添加权限校验
- 函数调用
- 使用@装饰器语法糖
1.3案例
1.时间统计:随机 0-1000以内的500个数字放入列表,使用冒泡排序与选择排序对列表进行升序,编写装饰器,统计两个方法的时间开销
import random
import time
l0 = []
for i in range(500):
l0.append(random.randint(0,1000))
l1 = [i for i in l0]
def time_calc(f):
def calc():
start = time.time()
f()
print(time.time() - start)
return calc
@time_calc
def sort1():
for i in range(len(l0)-1):
for j in range(i+1,len(l0)):
if l0[i] > l0[j]:
l0[i],l0[j] = l0[j],l0[i]
@time_calc
def sort2():
for i in range(len(l0)-1):
min_index = i
for j in range(i+1,len(l0)):
if l1[j] < l1[min_index]:
min_index = j
if min_index != i:
l1[i], l1[min_index] = l1[min_index], l1[i]
sort1()
sort2()
2.用户校验:用户输入用户名进入首页,输入正确进入购物车和个人中心
def login_required(f):
def check():
username = input("输入用户名")
if username == "admin":
f()
else:
print("校验失败")
return check
def index():
print("首页")
@login_required
def cart():
print("购物车")
@login_required
def mine():
print("我的")
index()
cart()
mine()
2.内置函数
1.len 长度
print(len("hello"))
2.数学部分
import math
# 绝对值
print(abs(-20))
# 求整除和余,第一个为整除,第二个为求余
print(divmod(50,6))
#次方
print(pow(10,2))
# 向上取整,向下取整
print(math.ceil(3.14))
print(math.floor(3.14))
# 四舍五入
print(round(3.5))
#求和
print(sum([i for i in range(10)]))
3.all
# 所有元素为真,结果为真;一个元素未假,结果为假
print(all([10,2,1]), all([]))
4.any
# 所有元素为假,结果为假,内容为空,返回假
print(any([False,0,None]),any([]))
5.进制
# 十进制转二
print(bin(10))
# 十进制转八进制
print(oct(21))
# 十进制转十六进制
print(hex(20))
6.callable 可调用函数和类名
# 可调用,函数.类名
print(callable(10),callable(lambda x:x))
7.ASCII
# ASCII 字符转码,码转字符
print(chr(98),chr(67),ord("A"),ord("Z"))
8.局部与全部字典
num = 100
s0 = "hello"
def f():
i = 99
# 返回所有局部变量,在函数内部使用
result2 = locals()
print(result2)
f()
# 返回全局变量
result = globals()
print(result)
9.输入输出
input 输入 print输出
10.最大与最小
print(max([{"age":20"},{"age":15,},{age":30}],key = lambda x:x["age"]))
print(min([{"age": 15}, {"age": 5}, {"age": 25}], key=lambda x: x["age"]))
11. Id :返回对象唯一标识
12.未来学习
- delattr:删除属性
- getattr:获取属性
- hasattr:是否有属性
- setattr:设置属性