网络编程
位置:首页>> 网络编程>> Python编程>> Python闭包及装饰器运行原理解析

Python闭包及装饰器运行原理解析

作者:吞风吻雨ii  发布时间:2022-12-16 20:59:06 

标签:python,闭包,装饰器

一、闭包

闭包从形式上来说是在外部函数中定义内部函数,并且内部函数引用了外部函数的变量,此变量叫做自由变量。

或者说是将组成函数的语句和这些语句的执行环境打包在一起。

闭包满足的条件:

必须有一个内嵌函数

内嵌函数必须使用外部函数的变量

外部函数的返回值必须是内嵌函数


def closure():
value = []
def fun(tmp):
 value.append(tmp)
 return value
return fun

cc = closure()
cc(0) #[0] 等同于closure(fun(0))
cc(1) #[0,1]
cc(2) #[0,1,2]

外部函数closure中有变量value和内部函数fun,并且内部函数fun引用了自由变量value,当执行cc = closure()时,就产生了一个闭包fun,该闭包持有只有变量value,当函数closure生命周期结束后,value依然存在,因为它被闭包引用了。

二、装饰器

装饰器其实就是闭包的应用,只不过其传递的是函数。


def add_time(fun):
def wrapper():
 print('time: 12:00')
 return fun()
return wrapper

def add_format(fun):
def wrapper():
 print('\n')
 return fun()
return wrapper

@add_format #等同于demo = add_format(add_time(demo))
@add_time #等同于 demo = add_time(demo)
def demo():
return 'hello world!'

另外,装饰器会将demo函数的元信息丢失,例如__name__等等。

例如demo函数的__name__会由'demo'变成了'wrapper',这时需要用到functools库,在wrapper函数前加上@functools.wraps(fun):


import functools

def add_time(fun):
@functools.wraps(fun)
def wrapper():
 print('time: 12:00')
 return fun()
return wrapper

def add_format(fun):
@functools.wraps(fun)
def wrapper():
 print('\n')
 return fun()
return wrapper

@add_format #等同于demo = add_format(add_time(demo))
@add_time #等同于 demo = add_time(demo)
def demo():
return 'hello world!'

例如给任意函数加上打印时间的功能的装饰器:


def metric(fn):
start=time.time()
@functools.wraps(fn)
def wrapper(*args,**kw):
 end=time.time()
 print('%s executed in %s ms' % (fn.__name__,start-end))
 return fn(*args,**kw)
return wrapper

来源:https://www.cnblogs.com/LMIx/p/13126617.html

0
投稿

猜你喜欢

  • 代码如下:<% '=================================================
  • 可以,具体说明和代码见下: <%@ Language=VBScript %><%Option
  • 将数据写入Excel文件中,用python实现起来非常的简单,下面一步步地教大家。一、导入excel表格文件处理函数import xlwt注
  • 然而有些情况只需要传递几个文件,而且文件体积并不太大,这种情况下使用组件则有点牛刀杀鸡的感觉,通过html自带的<input type
  • 有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以
  • PHP asXML()函数实例格式化 XML(版本 1.0)中的 SimpleXML 对象的数据:<?php $note=<&l
  • 微软在今天早上发布新的安全通告证实,一处远程执行代码漏洞影响到了整个SQL Server产品线。该漏洞的入侵代码在两周前已经被公布在互联网上
  •  你用过css么?当然,我是指你喜欢做网页的话,用过?很好,那你用过它的特效么?没有?那请跟我来。让我先通俗的介绍一下css,cs
  • 先简单说一下MP3的ID3 标记,因为主要是操作这个玩意MP3最开始的时候没有我们今天看到的那样,有歌手、年代,专集等等信息只有一些简单的参
  • 1、python中__name__是什么意思?很多python的初学者可能都会遇到一个问题:__name__是什么意思?在刚开始学习pyth
  • XMLHTTP对象及其方法------------------MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到R
  • 通用用法但上图的字段名,类型需要根据不同接口填写,如某服务接口:因而对应的上传代码如下:# 输出参数:请求响应报文import reques
  • Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为:def 函数名(参数1, 参数2, ……, 参数N):执行语
  • k近邻算法的介绍k近邻算法是一种基本的分类和回归方法,这里只实现分类的k近邻算法。k近邻算法的输入为实例的特征向量,对应特征空间的点;输出为
  • Mysql数据库常用命令:启动Mysql数据库C:》cd Mysql5.0 binC:Mysql5.0 bin》mysqld –instal
  • 说明Python语言中列表(List)与其他语言的数组(Array)类似,是一种有序的集合数据结构,Python List可支持各种数据类型
  • 实例如下所示:# -*- coding:utf-8 -*- #os模块中包含很多操作文件和目录的函数 import os #获取目标文件夹的
  • Python字符串的format函数format()函数用来收集其后的位置参数和关键字段参数,并用他们的值填充字符串中的占位符。通常格式如下
  • 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的
  • Bit-Packed Data TypesMySQL有一些存储类型使用一个值中的一些单个的比特位来紧凑的存储数据。纯技术上将,不管是底层的存
手机版 网络编程 asp之家 www.aspxhome.com