一、函数引用
  • 函数可以被引用
  • 函数可以被赋值给一个变量
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')

最新文章

  1. 掌握Thinkphp3.2.0----CURD
  2. html5 canvas画流程图
  3. 【代码笔记】iOS-时间选择框
  4. 大众点评试题分析(C/C++)
  5. linux 捕获信号处理中遇到的死锁
  6. ESB数据发布思路
  7. [cocos2d-x3.0]Android+NDK+Eclipse环境搭建及编译步骤~
  8. httpclient发送不带参数post数据
  9. tarjan求强连通分量+缩点+割点以及一些证明
  10. 定义一个Matrix类,实现矩阵的加法和乘法
  11. HEOI2018——welcome to NOI2018
  12. RMQ问题--范围最小值问题
  13. boost.asio包装类st_asio_wrapper开发教程(一)
  14. 在云端服务器centos7安装jvm并且运行java程序
  15. django表单的api
  16. [Lua]内存泄漏与垃圾回收
  17. 3.HTML+CSS 制作个太阳
  18. Java常见对象之String
  19. 0810 smarty
  20. 解决jsp两种提交方式乱码 的方法

热门文章

  1. 在执行java代码时,设置了断点,然后莫名的没执行完方法内的代码就结束了,此刻一般在出错处代码用try,catch包括起来
  2. Linux启动、停止宝塔
  3. Linux(centos)安装es(elasticsearch)
  4. 【LeetCode】122.Best Time to Buy and Sell Stock II 解题报告(Java & Python & C++)
  5. 【LeetCode】102. Binary Tree Level Order Traversal 二叉树的层序遍历 (Python&C++)
  6. C. Not Equal on a Segment(codeforces)
  7. 「算法笔记」状压 DP
  8. Ubuntu安装Git及Git配置
  9. Representation Learning with Contrastive Predictive Coding
  10. C++ std-11 常用方法