ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python闭包函数&装饰器

2022-01-20 17:58:52  阅读:202  来源: 互联网

标签:闭包 函数 python grade hogwarts student print 装饰 def


一、函数引用

  • 函数可以被引用

  • 函数可以被赋值给一个变量

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(*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,grade,hogwarts,student,print,装饰,def
来源: https://blog.csdn.net/m0_57696410/article/details/122606955

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有