Python的闭包和装饰器你真的了解吗
作者:尤诺. 发布时间:2023-04-24 00:18:05
标签:Python,闭包,装饰器
闭包
闭包就是能够读取其他函数内部变量的函数。
def test1(k, b):
def test1_1(x):
print(k*x+b)
return test1_1
t1 = test1(1, 2)
t1(0)
t1(1)
t1(2)
闭包中修改数据
x = 300
def test1():
x = 200
def test2():
nonlocal x
print("----1----x = {}".format(x))
x = 100
print("----2----x = {}".format(x))
return test2
t1 = test1()
t1()
装饰器
实现对无参数函数的装饰器
def set_func(func):
def call_func():
print("装饰器执行")
func()
return call_func
@set_func # 等价于sumNum = set_func(sumNum)
def sumNum():
print("sumNum")
sumNum()
实现对有参数函数的装饰器
# 对有参数、无返回值的函数进行装饰
def set_func(func):
def call_func(num):
print("装饰器")
func(num)
return call_func
@set_func
def sumNum(num):
print("sumNum = {}".format(num))
sumNum(100)
对不定长参数的函数进行装饰
def set_func(func):
def call_func(*args, **kwargs):
print("装饰器")
func(*args, **kwargs) # 拆包
return call_func
@set_func
def sumNum(num, *args, **kwargs):
print("sumNum = {}".format(num))
print("args = {}".format(args))
print("kwargs = {}".format(kwargs))
sumNum(100, 200, c=100)
对有返回值的函数进行装饰
def set_func(func):
def call_func(*args, **kwargs):
print("装饰器")
return func(*args, **kwargs) # 拆包
return call_func
@set_func
def sumNum(num, *args, **kwargs):
print("sumNum = {}".format(num))
print("args = {}".format(args))
print("kwargs = {}".format(kwargs))
return "200 ok"
sumNum(100, 200, c=100)
多个装饰器对同一个函数装饰
def add_h1(func):
def h1():
h1_str = "<h1>" + func() + "</h1>"
return h1_str
return h1
def add_a(func):
def call_func():
a_str = "<a>" + func() + "</a>"
return a_str
return call_func
@add_h1
@add_a
def get_str():
return "haha"
get_str()
输出为:<h1><a>haha</a></h1>
来源:https://blog.csdn.net/weixin_43670190/article/details/122916070
0
投稿
猜你喜欢
- 安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my- huge.cnf
- 函数最重要的目的是方便我们重复使用相同的一段程序。将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复
- 一切从一个糟糕的浏览器开始,它完全不支持 XHTML。什么是 MIME Type? 为什么这么说呢?首先,我们要了解浏览器是如何处理内容的。
- 1,exists和in的理解exists:如果子查询中包括某一行,那么就为TRUE in:如果操作数为TRUE等于表达式列表中的一个,那么就
- 一个小项目自动登录淘宝联盟抓取数据,由于之前在Github上看过类似用Python写的代码因此选择用Python来写,第一次用Python正
- ASP开发中有用的function集合,挺有用处的!希望大家保留!<% '**
- 前言MySQL8.0 开始支持不可见索引。 优化器根本不使用不可见索引,但会以其他的方式正常维护。默认情况下 索引是可见的。 通过不可见索引
- 如何验证信用卡是否可用,合法? 核实信用卡的真伪是一件麻烦的事儿,看看下面的代码,也许会给你帮上忙:<Script 
- 0x00 前言eval是Python用于执行python表达式的一个内置函数,使用eval,可以很方便的将字符串动态执行。比如下列代码:&g
- 最新MySql8.27主从复制以及SpringBoot项目中的读写分离实战1、MySql主从复制MySQL主从复制是一个异步的复制过程,底层
- 在python中启动和关闭线程:首先导入threadingimport threading然后定义一个方法def serial_read()
- 本文实例为大家分享了python实现网上购物系统的具体代码,供大家参考,具体内容如下1.购物商城的需求分析:1、输出欢迎界面还有登录注册菜单
- form 表单中的button按钮<button>提交</button> :放在form表单中,会有一个提交事件,会
- 共同点两者都接收两个参数,第一个参数是行的范围,第二个参数是列的范围不同点loc函数接收的是行/列的名称,iloc函数接收的是行/列的下标(
- 近期将公司的MySQL架构升级了,由原先的一主多从换成了DRBD+Heartbeat双主多从,正好手上有一个电子商务网站新项目也要上线了,用
- 用python实现的抓取腾讯视频所有电影的爬虫# -*- coding: utf-8 -*-import reimport urllib2f
- 百万级数据处理方案数据存储结构设计表字段设计表字段 not null,因为 null 值很难查询优化且占用额外的索引空间,推荐默认数字 0。
- 错误信息:ERROR 2002 (HY000): Can't connect to local MySQL server throu
- 下载paramiko首先,我的windows系统上有python2和python3。使用下面命令切换到python3:activate py
- 本文实例讲述了Python实现利用最大公约数求三个正整数的最小公倍数。分享给大家供大家参考,具体如下:在求解两个数的小公倍数的方法时,假设两