一、函数引用
  • 函数可以被引用
  • 函数可以被赋值给一个变量
def hogwarts():
print("hogwarts") # hogwarts() # 函数调用
print(hogwarts)
print('----------------')
harry = hogwarts # 把函数对象赋值给一个变量
print(harry)
print('----------------')
harry() # 引用函数

二、闭包函数

  • 闭包的内部函数中,对外部作用域的变量进行引用
  • 闭包无法修改外部函数的局部变量
  • 闭包可以保存当前的运行环境
def student_grade(grade): # 闭包无法修改外部函数的局部变量
grade = '22'
print('外函数年级:', grade) def output_student(name, gender):
grade = '11'
print('内函数年级为:', grade)
# print(f"霍格沃兹测试学社开学啦!"
# f"学生的名称是{name},"
# f"性别是{gender}年级是{grade}") return output_student student = student_grade(1)
student("罗恩", "男")
student("哈利", "男") student("赫敏", "女")
三、python装饰器
  • 行业需求: 涉及 Python 技术栈,面试常见题
  • 使用需求: 优化代码的可读性,可维护性
四、装饰器示例
  • 函数体开始执行与结束执行的时候分别添加打印信息
""" 装饰器示例
函数体开始执行与结束执行的时候分别添加打印信息 """
def hogwarts():
print("霍格沃兹测试学社") def hogwarts2():
print("霍格沃兹测试学社2") # 把中间的执行函数,使用参数代替
def function_tips(func):
print("函数开始执行")
# 不在写死的任何的一个函数,而是任意外部传入的函数
func()
print('函数结束执行') # 函数对象
function_tips(hogwarts)
function_tips(hogwarts2)

# 使用装饰器的代码
# 第一步,定义两个函数,一个内函数,一个外函数
# 第五步,在装饰器执行过程中,会自动传入一个参数,参数就是被装饰函数的函数对象
def timer(func):
def inner():
# 第二步,在内函数添加装饰器逻辑
print("函数开始执行")
func()
print('函数结束执行')
# 第三步,把内函数的函数对象return出去 return inner # 第四步,装饰器的使用
@timer
def hogwarts():
print("霍格沃兹测试学社") hogwarts() @timer
def hogwarts2():
print("霍格沃兹测试学社2") hogwarts2()
五、装饰器练习(装饰器不带参数)
实现一个计时器的装饰器,计算函数执行时间
import datetime

"""
三步走: 1、定义一个外函数,外函数有一个形参,接受被装饰的函数对象
2、定义一个内函数,内函数内调用传入函数
3、定义外函数的返回值,外函数返回值固定的格式为内置函数对象
"""
"""实现一个计时器的装饰器,计算函数执行时间""" def timer(func):
def inner():
# 获取当前时间
start_time = datetime.datetime.now()
func()
end_time = datetime.datetime.now()
print(f"函数的执行时间{end_time - start_time}") return inner @timer
def hogwarts():
print("霍格沃兹测试学社") hogwarts() @timer
def hogwarts2():
print("霍格沃兹测试学社2") hogwarts2()

六、装饰器带参数

def timer(func):
# 如果被装饰函数有参数,那么需要在内函数加形参以及在函数参数调用的时候添加参数信息
# 如果写死一个参数,但是无法确定被装饰函数的参数数量,这种写法就不行,会报错
# 解决方法:把两个地方的参数全部换成不定长参数
def inner(*args, **kwargs):
# 获取当前时间
start_time = datetime.datetime.now()
func(*args, **kwargs)
end_time = datetime.datetime.now()
print(f"函数的执行时间{end_time - start_time}") return inner @timer
def hogwarts(name, age):
print("霍格沃兹测试学社", name, age) hogwarts('Tom', 4) @timer
def hogwarts2(name, age, sex):
print("霍格沃兹测试学社2", name, age, sex) hogwarts2('jack', 11, 'man')

python闭包函数&装饰器的更多相关文章

  1. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

  2. python 闭包和装饰器

    python 闭包和装饰器 一.闭包闭包:外部函数FunOut()里面包含一个内部函数FunIn(),并且外部函数返回内部函数的对象FunIn,内部函数存在对外部函数的变量的引用.那么这个内部函数Fu ...

  3. python 复习函数 装饰器

    # 函数 —— 2天 # 函数的定义和调用 # def 函数名(形参): #函数体 #return 返回值 #调用 函数名(实参) # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),* ...

  4. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  5. python闭包与装饰器

    转自小马哥: 闭包和装饰器充分体现了Python语法糖的优雅感觉. 在本文中,我们的实验要完成两个工作,一个是加法,一个是累计调用加法的次数,最普通的Python程序可以这么写: def valida ...

  6. 详解Python闭包,装饰器及类装饰器

    在项目开发中,总会遇到在原代码的基础上添加额外的功能模块,原有的代码也许是很久以前所写,为了添加新功能的代码块,您一般还得重新熟悉源代码,稍微搞清楚一点它的逻辑,这无疑是一件特别头疼的事情.今天我们介 ...

  7. 高逼格利器之Python闭包与装饰器

    生活在魔都的小明,终于攒够了首付,在魔都郊区买了一套房子:有一天,小明踩了狗屎,中了一注彩票,得到了20w,小明很是欢喜,于是想干脆用这20万来装修房子吧(decoration): 整个装修过程,小明 ...

  8. Python—闭包和装饰器

    闭包 定义:内部函数对外部函数变量的引用,则将该函数与用到的变量称为闭包. 闭包必须满足以下三个条件: 必须有一个内嵌函数. 内嵌函数必须引用外部函数中的变量. 外部函数返回值必须是内嵌函数的引用. ...

  9. Python 简明教程 --- 22,Python 闭包与装饰器

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 当你选择了一种语言,意味着你还选择了一组技术.一个社区. 目录 本节我们来介绍闭包与装饰器. 闭包与 ...

随机推荐

  1. java 常用类库:Math:常用min、max;floor;ceil;random;

    Math //7.取整数小于目标的最大整数(Math.floor(1.2));//8.取整数.获取大于目标的最大整数System.out.println(Math.ceil(1.2)); //18.获 ...

  2. c++基础之operator =处理

    1.注意自我赋值 先看个例子: class A {}; A a ; a = a; // 注意这句 可能实际中,你不会这样做,但是实际中,是有可能的,并且这样做,也不违背语法. BUT, 如果上面的例子 ...

  3. 【LeetCode】1. Two Sum 两数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:two sum, 两数之和,题解,leetcode, 力 ...

  4. 「实用」打造自我感觉非常漂亮的Mac终端

    背景 (今天我是一个美妆博主) 突然发现自己使用的iterm2终端样式有些朴素,为了让她看起来花枝招展的,我决定给她打扮打扮.毕竟每天面对她的时间比对象还多-- 效果对比 因为每个人的喜好都不一样,所 ...

  5. 一个网关服务性能问题的Dump分析

    本篇文章分为三部分,首先简单介绍一下分析的工具Windbg,其次针对一个网关服务性能问题进行逐步刨析,最后针对性能问题的分析总结. 一 Windbg介绍 1.Windbg是个非常强大的调试器,它设计了 ...

  6. Jmeter环境变量配置你不得不知道的事情

    在安装Jmeter的过程中大家肯定需要配置环境,但是为什么要配置JDK的环境变量呢?大家有没有好奇过,有没有仔细去像一下呢,其实在安装Jmeter前,大家应该都知道Jmeter是我们JAVA开发的,J ...

  7. 【优雅代码】03-optional杜绝空指针异常

    [优雅代码]03-optional杜绝空指针异常 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺 ...

  8. Vue.js高效前端开发 • 【Vue组件】

    全部章节 >>>> 文章目录 一.Vue组件介绍 1.组件概述 2.组件使用步骤 3.实践练习 一.Vue组件使用 1.组件注册 2.组件注册语法糖 3.使用script或te ...

  9. 基于node和npm的命令行工具——tive-cli

    前端开发过程中经常会用到各种各样的脚手架工具.npm全局工具包等命令行工具,如:Vue脚手架@vue/cli.React脚手架create-react-app.node进程守卫工具pm2.本地静态服务 ...

  10. hisql 与sqlsugar,freesql 数据插入性能测试

    hisql与目前比较流行的ORM框架性能测试对比 hisql 一直定位为新一代的ORM框架 为低代码开发而生 测试数据数据库为sqlserver数据库 测试源码地址hisql与sqlsugar fre ...