python闭包函数&装饰器

python闭包函数&装饰器

一、函数引用

  • 函数可以被引用

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

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# 第四步,装饰器的使用@timerdef hogwarts():    print("霍格沃兹测试学社")hogwarts()@timerdef 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@timerdef hogwarts():    print("霍格沃兹测试学社")hogwarts()@timerdef 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@timerdef hogwarts(name, age):    print("霍格沃兹测试学社", name, age)hogwarts('Tom', 4)@timerdef hogwarts2(name, age, sex):    print("霍格沃兹测试学社2", name, age, sex)hogwarts2('jack', 11, 'man')

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部