Python进阶:深入剖析闭包与装饰器的应用与技巧

简介: Python进阶:深入剖析闭包与装饰器的应用与技巧

前言

    在Python编程的进阶道路上,闭包和装饰器是两个不可或缺的高级特性。它们为代码提供了强大的灵活性和复用性,使得函数式编程在Python中得以广泛应用。本博客将深入剖析闭包与装饰器的概念、原理以及应用场景,帮助您更好地理解并掌握这两个强大的工具。无论您是Python初学者还是资深开发者,相信本文都能为您带来有价值的启示和收获。让我们一同探索Python闭包与装饰器的奥秘吧!


一、闭包是什么?

1.概念

1.内外函数嵌套

2.内函数引用外函数作用域下的非全局变量(嵌套作用域下的变量、外函数的参数)

3.外函数返回内函数对象(闭包可以返回内函数名,返回内函数调用)

2.定义

2.1 返回内函数引用

# 定义:第一种方式:返回内函数引用(内函数引用、内函数本身、内函数对象--->内函数名)
def outer():
    a = 10
    def inner():
        print(a)
    return inner


# 调用
# outer() === inner
# outer()() === inner()
outer()()

2.2 返回内函数调用

# 定义:第二种方式:返回内函数调用
def outer1(a):
    def inner():
        print(a)
    return inner()


# 调用
# outer1() === inner()
outer1(20)

二、装饰器

1.概念

装饰器作用:再不改变原函数的基础上给函数增加新的功能,利用了闭包的思路,本质上就是一个内部闭函数

2.使用

装饰器使用:想要装饰哪一个原函数就在哪个原函数上方编写 @装饰器名字

3.简单装饰器

# 简单装饰器功能实现 --》再进行自我介绍之前输出“请进行自我介绍”
# 1.内外函数嵌套
def outer(f):   # f == func
    def inner():
        # 2.内函数引用外函数作用域下的非全局变量
        print("请进行自我介绍")
        # 调用原函数-->函数名()-->f() === func()
        f()
    # 3.外函数返回内函数(内函数名、内函数调用)
    return inner

# @outer === outer(原函数名)()
@outer
def func():
    print("我是法外狂徒张三")
func()

4.装饰带参数的原函数

4.1 结论

装饰带参数的原函数: \color{red}{装饰带参数的原函数:}装饰带参数的原函数:

1.内函数参数的数量要与原函数参数数量一致

2.内函数中原函数的调用参数的数量和参数名都要与内函数一致

4.2 普通参数

# 装饰器功能:再进行自我介绍前输出  "请进行自我介绍"
# 1.内外函数嵌套
def outer(f):
    def inner(x,y):
        # 2.内函数引用外函数作用域下的非全局变量
        print("请进行自我介绍")
        # 调用原函数
        f(x,y)
    # 3.外函数返回内函数
    return inner


# 原函数功能:我叫xxx
@outer
def func(name,age):
    print(f"我叫{name},我今年{age}岁")
func("李四",18)

4.3 不定长参数

# 装饰带不定长参数的原函数
# 装饰器功能:在打印和结果之前输出"开始进行求和操作",结果打印结束以后输出"求和完成"
def outer(f):
    def inner(*args):
        print("开始进行求和操作")
        # 调用原函数
        f(*args)
        print("求和完成")
    return inner


# 原函数功能:实现用户任意传递两个数字,再函数内部输出和的结果
@outer
def func(*args):
    # args元组里
    print(f"求和的结果为:{sum(args)}")
func(10,20,4,9,30,78,45,76,10)

5.装饰带返回值的原函数

# 装饰带返回值的原函数--》内函数中必须要有返回值

# 装饰器:在操作之间进行输出 请进行自我介绍
def outer(f):
    def inner():
        print("请进行自我介绍")
        print(f())
        return "hello" 
    return inner


# 原函数功能:进行自我介绍  返回 我叫张三
@outer
def func():
    return "我叫张三"
print(func())

6.装饰带参数和返回值的原函数

# 装饰带参数和返回值的原函数

# 装饰器功能:在自我介绍前输出  “请开始自我介绍”   并要求输出的自我介绍需要增加p标签
def outer(f):
    def inner(x):
        print("请开始自我介绍")
        # 获取自我介绍的字符串-->调用原函数-->得到返回值
        data = "<p>" + f(x) + "</p>"
        return data
    return inner


# 原函数功能:返回自我介绍  "我叫xxx" 姓名让用户传参指定
@outer
def func(name):
    return f"我叫{name}"
print(func("李四"))

7.一个装饰器装饰多个原函数

import time


# 一个装饰器装饰多个原函数
# 装饰器:统计运行时长,对时长进行判断,如果小于0.005则 非一般的速度,否则输出太慢了
def outer(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        if end - start < 0.001:
            print("非一般的速度")
        else:
            print("太慢了")
    return inner


# 原函数1:统计1988-2024之间的闰年,存放在列表中;
#  判断区间内是否存在,存在则打印所有的闰年及数量;不存在则提示
@outer
def func1():
    list1 = []
    for i in range(1988,2025):
        if i % 4 == 0 and i % 100 != 0 or i % 400 == 0:
            list1.append(i)
    if len(list1) > 0:
        print(list1)
        print(f"有{len(list1)}个满足条件的数据")
    else:
        print("区间内没有满足条件的数据")

func1()


# 原函数2:统计40-400之间的回文数,存放在列表中;
#  判断区间内是否存在,存在则打印所有的回文数及数量;不存在则提示
@outer
def func2():
    list1 = []
    for i in range(40,401):
        if str(i) == str(i)[::-1]:
            list1.append(i)
    if len(list1) > 0:
        print(list1)
        print(f"有{len(list1)}个满足条件的数据")
    else:
        print("区间内没有满足条件的数据")

func2()

8.多个装饰器装饰一个原函数

# 多个装饰器装饰一个原函数

# 装饰器1:在调用原函数前输出 "装饰器1的开始";在调用原函数结束输出  "装饰器1的结束"
def outer1(f):
    def inner():
        print("装饰器1的开始")
        f()
        print("装饰器1的结束")
    return inner


# 装饰器2:在调用原函数前输出 "装饰器2的开始";在调用原函数结束输出  "装饰器2的结束"
def outer2(f):
    def inner():
        print("装饰器2的开始")
        f()
        print("装饰器2的结束")
    return inner


# 原函数 输出“我是原函数”
@outer2
@outer1
def func():
    print("我是原函数")
func()


# 总结:
# 装饰器的调用顺序:从下往上
# 装饰器的执行顺序:从上往下  -->执行结果


相关文章
|
2天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
25 11
|
3天前
|
设计模式 Python
掌握Python中的装饰器
【10月更文挑战第34天】装饰器是Python中一种强大的工具,它允许我们在不修改原函数代码的情况下增加其功能。本文通过简单易懂的语言和实例,引导你理解装饰器的概念、种类及其应用,帮助你在编程实践中灵活使用这一高级特性。
|
2天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第35天】装饰器在Python中是一种强大的工具,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文旨在通过简明的语言和实际的编码示例,带领读者理解装饰器的概念、用法及其在实际编程场景中的应用,从而提升代码的可读性和复用性。
|
1天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
4天前
|
设计模式 缓存 监控
Python中的装饰器:代码的魔法增强剂
在Python编程中,装饰器是一种强大而灵活的工具,它允许程序员在不修改函数或方法源代码的情况下增加额外的功能。本文将探讨装饰器的定义、工作原理以及如何通过自定义和标准库中的装饰器来优化代码结构和提高开发效率。通过实例演示,我们将深入了解装饰器的应用,包括日志记录、性能测量、事务处理等常见场景。此外,我们还将讨论装饰器的高级用法,如带参数的装饰器和类装饰器,为读者提供全面的装饰器使用指南。
|
2天前
|
数据库 Python
Python 应用
Python 应用。
18 4
|
2天前
|
测试技术 开发者 Python
探索Python中的装饰器:从基础到高级应用
【10月更文挑战第36天】装饰器在Python中是提升代码效率和可读性的利器,它们允许开发者在不改变原有函数定义的情况下增加额外的功能。本文将引导读者从理解装饰器的基本概念出发,通过实际代码示例,逐步深入到更复杂的应用场景,如装饰器堆叠和带参数的装饰器。我们将一起探索如何利用这一强大工具来优化我们的编码实践。
|
3天前
|
Python
深入浅出Python装饰器
【10月更文挑战第34天】在编程的世界里,我们常常需要扩展函数的功能,但又不想修改其源代码。Python装饰器的引入,就像是给函数穿上了一件魔法斗篷,让这一切变得可能。本文将带你领略装饰器的魔力,从基础概念到实际应用,一起探索这个强大的工具如何简化我们的代码并增加程序的可读性。
|
3天前
|
设计模式 程序员 数据处理
编程之旅:探索Python中的装饰器
【10月更文挑战第34天】在编程的海洋中,Python这艘航船以其简洁优雅著称。其中,装饰器作为一项高级特性,如同船上的风帆,让代码更加灵活和强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一起感受编程之美。
|
3天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
13 1