首页 > 编程语言 >python 闭包、装饰器

python 闭包、装饰器

时间:2024-07-28 11:59:00浏览次数:16  
标签:闭包 函数 python def print 装饰 datas

一、闭包:

1. 外部函数嵌套内部函数  

2. 外部函数返回内部函数  

3.内部函数可以访问外部函数局部变量 

        闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用来实现一些特定功能,例如保护变量、实现装饰器等。

import random


def fun1():
    print("fun1")
    datas = []

    def fun2():
        datas.append(random.randint(0, 100))
        print("fun2", datas)

    return fun2


r = fun1()
r()

r1 = fun1()
r1()

print(id(r), id(r1))

特点和用途:

  • 访问外部变量:闭包可以访问定义它们的外部函数的局部变量,即使外部函数已经返回,闭包仍然保留对这些变量的引用。

  • 保护变量:可以通过闭包来保护数据,因为外部函数的局部变量在闭包中不会被销毁或修改,除非内部函数显式地修改它们。

  • 实现装饰器:装饰器本质上就是闭包,它能够在不修改原函数代码的情况下,动态地增加功能。

闭包在Python中常用于函数式编程和实现一些高级的编程模式,能够提供更灵活和高效的编程解决方案。 

二、装饰器:

目的:不改变函数原有实现给函数添加新功能

概念:一个闭包就是一个函数+在创建这个函数时可以访问的变量

实现:闭包+@语法

        装饰器(Decorator)是Python中一种特殊的函数,它可以修改其他函数的行为或功能。装饰器本质上是一个函数,它接收一个函数作为输入,并返回一个新的函数作为输出。装饰器通常用于在不改变原函数代码的情况下,动态地增加功能、修改函数的行为或者执行额外的操作。

装饰器案例:

1.时间开销:

import random
import time

datas = [random.randint(1, 1000) for i in range(1000)]
datas_copy = datas.copy()


def time_cost(f):
    def calc(sort_type):
        start = time.time()
        f(sort_type)
        print(f"{f.__name__} {time.time() - start}")
    return calc


@time_cost
def fun1(sort_type):
    datas.sort(reverse=sort_type)
    print(datas)


@time_cost
def fun2(sort_type):
    new_datas = sorted(datas_copy, reverse=sort_type)
    print(new_datas)


# fun1 = time_cost(fun1)
fun1(True)


# fun2 = time_cost(fun2)
fun2(True)

 权限校验:

user = None


def login_required(f):
    def chair():
        global user
        if user:
            f()
        else:
            while True:
                username = input("用户名")
                password = input("密码")
                if username == "admin" and password == "666666":
                    user = "admin"
                    f()
                    break
                else:
                    print("用户名或密码错误")
    return chair


def index():
    print("首页")


@login_required
def center():
    print("个人中心")


@login_required
def cart():
    print("购物车")


index()

# center = login_required(center)
center()

# cart = login_required(cart)
cart()

装饰器的特点和用途:

  • 修改函数行为:装饰器允许我们在不修改原函数代码的情况下,添加、修改或扩展函数的行为。

  • 动态增加功能:可以在函数调用前后执行额外的操作,如输入验证、性能测试、日志记录等。

  • 代码复用和简化:装饰器可以避免代码重复,使代码更加简洁和易于维护。

  • 装饰器链:可以同时应用多个装饰器,形成装饰器链,每个装饰器可以独立地修改函数的行为。

在实际应用中,装饰器是Python中非常强大和灵活的特性,被广泛用于Web框架、日志系统、权限控制等需要动态修改函数行为的场景。 

标签:闭包,函数,python,def,print,装饰,datas
From: https://blog.csdn.net/2401_86120676/article/details/140646158

相关文章

  • 掌握 IPython %%time 魔法命令:高效测量代码块执行时间
    引言在编程和数据分析中,了解代码的执行时间是优化性能的关键步骤。IPython,作为一个强大的交互式计算环境,提供了多种工具来帮助用户测量和优化代码。其中,%%time魔法命令是IPython中用来测量代码块执行时间的便捷工具。本文将详细介绍%%time魔法命令的使用方法,并通过一......
  • 探索 IPython 中的 %%javascript 魔法命令:运行 JavaScript 代码的秘籍
    引言IPython是一个强大的交互式计算环境,它不仅支持Python语言,还通过各种魔法命令扩展了其功能。其中,%%javascript魔法命令是IPython扩展中一个非常有趣的特性,它允许用户在IPython环境中直接运行JavaScript代码。这对于需要在数据科学和科学计算中使用JavaScript......
  • pythonasm库分析,看看你和自学编程小学生的差距
    下面是pythonasm.asm库的源代码fromkeystoneimport*fromcapstoneimport*assembly_instructions=[]#储存汇编指令的列表#汇编指令写入列表defmov(reg1,reg2):assembly_instructions.append(f"mov{reg1},{reg2}")defdb(value):assembly_instructio......
  • 【Python系列】Python 中的垃圾收集:深入理解与实践
    ......
  • Python酷库之旅-第三方库Pandas(050)
    目录一、用法精讲181、pandas.Series.var方法181-1、语法181-2、参数181-3、功能181-4、返回值181-5、说明181-6、用法181-6-1、数据准备181-6-2、代码示例181-6-3、结果输出182、pandas.Series.kurtosis方法182-1、语法182-2、参数182-3、功能182-4、返回值1......
  • 使用 python matplotlib 和 metpy 添加辅助 y 轴
    我知道这个问题似乎与这里的许多其他问题类似,但我已经尝试过它们,不幸的是它们都没有解决我在尝试添加辅助y轴时当前面临的问题。问题是很简单,但我找不到任何可以修复它的东西:在SkewT图上添加辅助y轴会更改图的y限制,而不仅仅是添加轴。基本上,我希望添加辅......
  • Python实现基于卷积神经网络的恶意代码分类系统(设计思路概述)
    这个设计是关于一个基于卷积神经网络(CNN)的恶意代码分类系统,其主要目标是对恶意代码进行自动分类,帮助用户识别并防范不同类型的恶意软件。以下是该系统的设计思路、方法及实现过程的详细解释:设计思路恶意代码图像化:由于直接对恶意代码的源代码或二进制形式进行分类难度较......
  • Python实现基于卷积神经网络的恶意代码分类系统
    目录摘要IABSTRACTII1绪论11.1研究背景与意义11.2国内外研究现状21.3技术路线32相关知识背景52.1恶意代码检测概述52.2深度学习技术基础62.2.1卷积神经网络基本结构72.2.2激活72.2.3池化83基于卷积神经网络的恶意代码分类方法103.1卷......
  • 如何在Python脚本中解析和打印来自pymeter的API响应和错误代码?
    如何在python脚本中解析和打印来自pymeter的API响应和错误代码?PyMeter是jmeter的python版本。(pymeter帮助文档-https://pymeter.readthedocs.io/en/latest/api.html)我正在尝试获取API的性能统计数据-https://reqres.in/api/users?page=2......
  • 【YOLOv8】实战二:手把手教你使用YOLOv8实现实时目标检测、实例分割、姿态估计、目标追
    简介UltralyticsYOLOv8是一种前沿的、最先进的(SOTA)模型,它在前代YOLO版本的成功基础上进行了进一步的创新,引入了全新的特性和改进,以进一步提升性能和灵活性。作为一个高速、精准且易于操作的设计,YOLOv8在广泛的领域中,包括目标检测与跟踪、实例分割、图像分类以及姿势估计等任......