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

python闭包和装饰器

时间:2024-07-24 13:53:56浏览次数:13  
标签:闭包 函数 python datas time print 装饰 def

一、闭包


1.闭包的三要素

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

2.内部函数可以调用外部函数的局部变量

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

2.示例代码 

# 外部函数
def func1():
    print("func1")

    # 内部函数
    def func2():
        print("func2")

    # 外部函数返回内部函数
    return func2


r = func1()  # 起始这里是 r = func2 是一个函数
print(type(r))
r()  # 其实这里是 func2()

 二、装饰器

装饰器是建立在闭包的基础上的,在闭包内调用想要被装饰的函数。

 1.无参装饰器

格式;写完装饰器之后,在想要被装饰的函数上方写上 @装饰器名

import random
import time

# 装饰器  形参是一个函数
def use_time(func):
    def time_cost():
        star = time.time()
        func()
        print(f"{func.__name__}使用时间:{time.time() - star}")

    return time_cost


# 使用两个内容一样的数列,用来对比排序花费的时间
datas = [random.randint(1, 500) for i in range(1000)]
datas_copy = datas.copy()


@use_time
def my_fun1():
    datas.sort()
    print(datas)


@use_time
def my_fun2():
    new_datas_copy = sorted(datas_copy)
    print(new_datas_copy)


my_fun1()

my_fun2()

 2.带参装饰器

格式:@装饰器名(参数)

def replace(times):
    def wake(func):
        def up(*args):
            for i in range(times):
                print("闹钟响了")
                func(*args)
                print("闹钟关闭")
                print("--------------")

        return up

    return wake


@replace(5)
def wake_up(name):
    print(f"{name}快起床啦~~~")


wake_up("布布")   # 打印5遍  闹钟响了
                  #         布布快起床啦
                    #       闹钟关闭

标签:闭包,函数,python,datas,time,print,装饰,def
From: https://blog.csdn.net/2201_76129403/article/details/140629196

相关文章

  • python Subprocess 模块
    Subprocess介绍subprocess模块是Python标准库中的一个模块,用于管理子进程(子程序)。通过subprocess模块,可以在Python脚本中启动新的进程、连接到它们的输入/输出流以及获取它们的返回值。Subprocess主要功能1.执行外部命令:subprocess允许你在Python脚本中执行系统命......
  • 计数调用装饰器 - 为什么我将函数属性重置回 0?
    下面的代码计算了装饰函数func被调用的次数:fromfunctoolsimportwrapsdefcounting_calls(func):@wraps(func)definner(*args,**kwargs):inner.call_count+=1returnfunc(*args,**kwargs)inner.call_count=0returninner......
  • Python 类型提示:自引用类型检查
    我认为静态类型确实会让我在Python中的生活更轻松,考虑到我通常使用C语言工作。我创建了一个像这样的类:classnode(object):"""properties,constructor,etc."""defadd_outneighbor(self,neighbor:node)->None:"""d......
  • Python用shp文件裁剪多个遥感影像的方法
      本文介绍基于Python中ArcPy模块,基于矢量数据范围,对大量栅格遥感影像加以批量裁剪掩膜的方法。  首先,话不多说,本文所需要的代码如下所示。#-*-coding:utf-8-*-"""CreatedonTueDec1320:07:482022@author:fkxxgis"""importarcpyfromarcpy.saimport*......
  • 以编程方式删除 Python 源中的类型提示
    我有一些为Python3.5编写的源代码,我想使其在Python3.4下可执行。我使用的3.5中唯一在3.4中不可用的功能是类型提示,因此我想编写一个脚本来完全删除这些功能。乍一看这似乎很容易,我决定编写一些正则表达式这样做,但后来我想到了一些边缘情况,我不确定如何解决像这样的......
  • Python 类型暗示​​一个充满 myclass 对象的双端队列
    使用Python3.6或更高版本,我想输入提示一个返回MyClass对象的函数myfunc我如何提示myqueue是一个deque|||充满MyClass对象?objects?fromcollectionsimportdequeglobal_queue=deque()classMyClass:passdefmyfunc(m......
  • python之名称空间和作用域(关键字:global和nonlocal的使用)
    文章目录前言1、名称空间和作用域1.1引言1.2名称空间1.2.1内置名称空间1.2.2全局名称空间1.2.3局部名称空间1.2.4名称空间的产生和销毁顺序1.3作用域1.3.1全局作用域1.3.2局部作用域1.3.3名字的查找顺序1.4关键字:global1.5关键字:nonlocal前言本篇文章......
  • 用于 isinstance() 检查的 dict_keys 的显式 python3 类型是什么?
    在Python3中,我应该使用什么类型来检查字典键是否属于它?>>>d={1:2}>>>type(d.keys())<class'dict_keys'>所以我很自然地尝试了这个:>>>isinstance(d.keys(),dict_keys)Traceback(mostrecentcalllast):File"<stdin>",......
  • 初学Python时需要认识清楚的几个概念:对象、函数、圆括号给、点取、方括号取
    这是我在自学Python的过程中自己挑选和提炼出来的几个重要的概念,之所以特意介绍这些概念,其中包含了我自己的思维方式和我对Python设计理念的认识,有其独特性和局限性。我希望这篇文章能够给喜爱Python的朋友们带来一些启发。1、对象(Object)对象是Python编程的基本单元。就像音是......
  • 如何接受文件或路径作为python中方法的参数
    我正在尝试编写一个方法,该方法将接受打开的文件myFile=open("myFile.txt")obj.writeTo(myFile)myFile.close()或带有路径的字符串obj.writeTo("myFile.txt")该方法的实现如下:defwriteTo(self,hessianFile):ifisinstance(hessianFile,file):pr......