【Python入门篇】三分钟教你学会闭包,装饰器

本文详细解释了闭包的基本概念,如何通过外部函数嵌套和返回内部函数实现,以及如何利用闭包简化装饰器的编写。同时介绍了装饰器的作用和一个实际案例。还涵盖了Python内置函数的数学计算、逻辑判断、进制转换、ASCII转换和局部/全局字典等内容。
摘要由CSDN通过智能技术生成

一、闭包

一个闭包最基本的知识就是三要素

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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值