Python进阶---闭包和装饰器

简介: Python进阶---闭包和装饰器

一、闭包

1、闭包的语法要求

            1. 发生函数嵌套
            2. 内层函数使用到外层函数的参数
            3. 外层函数返回内层函数的函数名

简单例子:

def func_out(data):
    def func_in():
        print(data)
 
    return func_in
 
 
a = func_out("123")
a()

2、 闭包的作用

闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁。

由于闭包引用了外部函数的变量,则外部函数的变量没有及时释放,消耗内存。

二、装饰器

装饰器:在不修改函数的原有代码的前提下 给函数增加新的功能

  • 装饰器本质上就是一个闭包函数,它可以对已有函数进行额外的功能扩展。
  • 装饰器的语法格式:
# 装饰器
# def decorator(fn): # fn:被装饰的目标函数.
#     def inner():
#         '''执行函数之前'''
#         fn() # 执行被装饰的目标函数
#         '''执行函数之后'''
#     return inner
  • 装饰器的语法糖用法: @装饰器名称,同样可以完成对已有函数的装饰操作。

1、装饰器的使用场景

  1. 函数执行时间的统计
  2. 输出日志信息
"""
时间阻塞:参数的单位为秒
time.time(10)
获取当前时间
"""
import time
 
 
def func_out(func):
    def func_in():
        start = time.time()
        func()
        end = time.time()
        print(end - start)
 
    return func_in()
 
 
@func_out
def my_func():
    for i in range(10000000):
        pass
 
 
# my_func()

2、装饰有返回值的函数的装饰器

# 1. my_test() ==> func_in()
# 2. func() ==> 原始的my_test
def func_out(func):
    def func_in():
        # ret就接受到了func的返回值 就相当于就收到了原始的my_test的返回值
        ret = func()
 
        return ret
        # return func()
 
    return func_in
 
 
@func_out
def my_test():
    return 10
 
 
a = my_test()
print(a)

3、装饰有参数的函数

def func_out(func):
    def func_in(num1):
        func(num1)
 
    return func_in
 
 
@func_out
def my_func(num1):
    print(num1)
 
 
# my_func() ==> func_in()
# func() ==> 原始的my_func
my_func(10)
  • 使用带有参数的装饰器,其实是在装饰器外面又包裹了一个函数,使用该函数接收参数,返回是装饰器,因为 @ 符号需要配合装饰器实例使用

4、通用装饰器

def func_out(func):
    def func_in(*args):
        # args ==> (10,20,30)
        # *args ==> 10,20,
        # func(*args) ==> func(10,20,30)
        func(*args)
 
    return func_in
 
 
@func_out
def my_func(num1, num2, num3):
    print(num1)
    print(num2)
    print(num3)
 
 
# my_func() ==> func_in()
# func() ==> 原始的my_func
my_func(10, 20, 30)  # func_in(10,20,30)
 
# args会以元组的形式存储单值参数
def my_func(*args):
    print(args)
    print(*args)
 
 
my_func(10, 20, 30)
 

通用装饰器的语法格式:

# 通用装饰器
def logging(fn):
  def inner(*args, **kwargs):
      print("--正在努力计算--")
      result = fn(*args, **kwargs)
      return result
 
  return inner
目录
相关文章
|
7天前
|
缓存 监控 程序员
Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。
【6月更文挑战第30天】Python装饰器是无侵入性地增强函数行为的工具,它们是接收函数并返回新函数的可调用对象。通过`@decorator`语法,可以在不修改原函数代码的情况下,添加如日志、性能监控等功能。装饰器促进代码复用、模块化,并保持源代码整洁。例如,`timer_decorator`能测量函数运行时间,展示其灵活性。
16 0
|
4天前
|
存储 安全 Java
在python中使用闭包和其他惯例
【7月更文挑战第3天】本文介绍闭包基本概念和例子,内部函数访问外部变量,实现数据隐藏。以及 Python的惯用法:用`in`检查字典键,用`dict.get()`安全取值。
14 1
在python中使用闭包和其他惯例
|
3天前
|
自然语言处理 Python
从菜鸟到大神,一篇文章带你玩转Python闭包与装饰器的深度应用
【7月更文挑战第4天】Python中的闭包和装饰器是增强代码优雅性的关键特性。闭包是能访问外部作用域变量的内部函数,如示例中的`inner_function`。装饰器则是接收函数并返回新函数的函数,用于扩展功能,如`my_decorator`。装饰器可与闭包结合,如`repeat`装饰器,它使用闭包记住参数并在调用时重复执行原函数。这些概念提升了代码复用和可维护性。
|
11天前
|
开发者 Python
Python进阶:深入剖析闭包与装饰器的应用与技巧
Python进阶:深入剖析闭包与装饰器的应用与技巧
|
11天前
|
分布式计算 算法 Python
Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解
Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解
|
11天前
|
Python
Python面向对象进阶:深入解析面向对象三要素——封装、继承与多态
Python面向对象进阶:深入解析面向对象三要素——封装、继承与多态
|
11天前
|
Java Python
Python进阶之旅:深入理解变量作用域、垃圾回收、拷贝机制与异常处理
Python进阶之旅:深入理解变量作用域、垃圾回收、拷贝机制与异常处理
|
11天前
|
Python
Python深入讲解系列之装饰器
Python深入讲解系列之装饰器
10 1
|
4天前
|
人工智能 Linux 开发工具
|
4天前
|
数据可视化 定位技术 API