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
目录
相关文章
|
6天前
|
程序员 测试技术 Python
深入理解Python中的装饰器
深入理解Python中的装饰器
17 1
|
13天前
|
网络协议 Linux Python
Python进阶---网络编程
Python进阶---网络编程
31 2
|
1天前
|
Python 缓存 开发者
Python中的装饰器:优雅而强大的代码增强工具
在Python编程中,装饰器是一种强大的工具,它允许开发者在不改变原有代码结构的情况下,增加额外的功能。本文将深入探讨Python中装饰器的概念、用法和实际应用,展示其在代码优化和增强方面的威力。
|
1天前
|
Python 设计模式 缓存
Python中的装饰器:提升代码可读性与可维护性
在Python编程中,装饰器是一种强大的工具,它可以提高代码的可读性和可维护性。本文将深入探讨装饰器的概念、用法以及实际应用场景,帮助读者更好地理解和利用Python中的装饰器。
|
1天前
|
Python 缓存
Python 中的装饰器:提升代码可读性与灵活性
Python 中的装饰器是一种强大的工具,它可以提高代码的可读性和灵活性。本文将深入探讨装饰器的概念、用法以及如何在实际项目中应用装饰器来简化代码、增加功能,以及解决常见的编程问题。
|
3天前
|
Python 容器
GitHub狂揽6700 Star,Python进阶必备的案例、技巧与工程实践
当下是 Python 急剧发展的时代,越来越多的人开始学习和使用Pyhon,而大家也遇到了各种问题。这份手册清晰、细致地介绍了 Python 代码应该遵循的编程风格,并解释了背后的原理和机制。 入门 Python 语言相对简单,但写出优雅的代码并非易事。这份手册深入讲解了 Python进阶知识的方方面面,并配以许多有趣的案例故事,使读者能更轻松地理解各种原理,并更好地将其运用于日常工作。
|
5天前
|
程序员 测试技术 Python
Python中的装饰器(Decorators) :深入解析与实战应用
Python中的装饰器(Decorators) :深入解析与实战应用
10 0
|
6天前
|
存储 缓存 Python
深入理解Python中的装饰器:原理与实战
深入理解Python中的装饰器:原理与实战
14 0
|
8天前
|
监控 Python
深入解析Python中的装饰器(Decorators)及其实用场景
装饰器是Python中一个强大且灵活的功能,它允许在不修改原有函数或类代码的情况下,动态地为其添加新的功能。本文不仅介绍了装饰器的基本概念、语法和工作原理,还通过具体实例展示了装饰器在日志记录、权限校验、性能分析等实用场景中的应用,旨在帮助读者深入理解装饰器的强大之处,并激发其在实际项目中的创新应用。
|
8天前
|
缓存 监控 数据安全/隐私保护
探索Python中的装饰器:一种强大的元编程工具
在Python编程中,装饰器是一个强大而优雅的元编程工具,它允许我们在不修改原有函数或类代码的情况下,为其添加新的功能或修改其行为。本文将带您深入了解Python装饰器的概念、工作原理及其在实际编程中的应用,通过示例演示如何创建和使用装饰器,并探讨其在代码复用、性能监控和日志记录等方面的强大作用。