当前位置: 首页 > article >正文

python中的迭代器、生成器和装饰器(一)

这三个概念应该经常能看到,但是关于其中各自的含义,很有可能还是模糊朦胧、半懂半懵的状态。今天正好复习到这里,把我对这几个概念的理解记录一下。
首先,装饰器和另外两个“器”不太一样,装饰器可以理解为一种特殊的函数,这个函数特殊之处在于以函数为参数,也就是函数的函数。说起来有点绕,看下代码:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with arguments {args} and keyword arguments {kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned {result}")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

#add(1,3)

首先,最后两句应该能看懂,平时编程的时候也经常在def一个函数之前加上@xxx_decorator,这也就是装饰器的用法啦,通过在自定义的函数函数前面加上@装饰器函数名,就可以实现装饰的效果(装饰装饰,说白了就是一些锦上添花的工作,所以常用的装饰器就是做一些日志记录、性能分析等小工作)。
下面看下log_decorator内部,也就是代码的第一部分,先看整体,该函数传入的参数为一个func(函数),返回的是一个wrapper(一个包装了func的函数)。
当add函数使用@log_decorator来装饰时,调用add函数相当于是执行了log_decorator(add),add函数中的参数会被传递到wrapper中,然后依次执行wrapper中的内容。现在我们调用已经装饰好了的add函数,假设是add(1,3),得到的输出会是:

Calling add with arguments (1, 3) and keyword arguments {}
add returned 4
#通过这种输出,可以实现日志记录的功能

注:wrapper 函数的参数 *args 和 **kwargs 是通用的形式,表示接受任意数量和类型的位置参数和关键字参数。关于什么是位置参数和关键字参数,请看以下代码:

def add(x, y):
    return x + y

result = add(3, 5)
#在这个例子中,x 和 y 都是位置参数。
#当调用 add(3, 5) 时,3 被赋值给 x,5 被赋值给 y

def greet(name, message):
    return f"Hello, {name}! {message}"

result = greet(name="Alice", message="How are you?")
#在这个例子中,name 和 message 都是关键字参数。
#通过在函数调用中使用 name= 和 message=,可以清晰地指定参数的值,而不依赖于它们在函数定义中的位置。

最后,刷力扣时经常会用到的@lru_cache就是一个装饰器,用来实现缓存功能,提升函数的执行效率。(记得在使用之前先import一下,from functools import lru_cache)


http://www.kler.cn/a/160020.html

相关文章:

  • Mit6.S081-实验环境搭建
  • [CKS] 关闭API凭据自动挂载
  • 低代码集成多方API的简单实现
  • 分享一个傻瓜式一键启动的加速器
  • GitHub Org
  • Vue常用加密方式
  • Java不可变集合
  • 你敢信!贪吃蛇游戏居然能插入到富文本编辑器里!
  • 查看mysql 或SQL server 的连接数,mysql超时、最大连接数配置
  • 2023亚太地区五岳杯量子计算挑战赛
  • 智能优化算法应用:基于饥饿游戏算法无线传感器网络(WSN)覆盖优化 - 附代码
  • JavaScript中使用JSON的基本操作示例
  • 【C#学习笔记】委托与事件 (从观察者模式看C#的委托与事件)
  • 音视频的功耗优化
  • 7Docker搭建es和kibana
  • 对String类的深入理解
  • 【人体解剖学与组织胚胎学】练习三 高度相联知识点整理及对应习题
  • Linux环境变量与命令行参数
  • Java第二十一章网络通信
  • InST论文复现
  • 本地缓存LoadingCache使用【详解】
  • Hadoop入门学习笔记
  • Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问
  • JavaScript中处理时间差
  • torch 如何实现两点分布采样,100个样本中20个样本为1,80个为2
  • Docker-多容器应用