Python--迭代器、生成器和装饰器

embedded/2024/11/13 9:17:19/

在 Python 中,迭代器和生成器是处理可迭代对象的两个核心概念,它们可以帮助我们高效地遍历数据。装饰器则是 Python 中的一种高级功能,用于修改函数或类的行为。接下来详细阐述并扩展这些概念。

1. 迭代器

迭代器的定义

迭代器是一个实现了 __iter__()__next__() 方法的对象。__iter__() 返回迭代器对象本身,__next__() 返回容器的下一个元素。如果没有元素可返回,则应抛出 StopIteration 异常。

示例:自定义迭代器
class MyIterator:def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return selfdef __next__(self):if self.index < len(self.data):result = self.data[self.index]self.index += 1return resultelse:raise StopIteration# 使用自定义迭代器
my_list = [1, 2, 3, 4]
iterator = MyIterator(my_list)for item in iterator:print(item)
迭代器的特点
  • 状态保持:迭代器在每次调用 __next__() 时记住它的状态,以便在下次调用时继续。
  • 惰性求值:与一次性加载所有数据不同,迭代器每次只生成一个值,这对于处理大数据集非常有用。

2. 生成器

生成器的定义

生成器是使用 yield 关键字定义的特殊类型的迭代器。它们简化了迭代器的编写,通过函数形式实现。

示例:生成器函数
def my_generator():yield 1yield 2yield 3# 使用生成器
gen = my_generator()for value in gen:print(value)
生成器的特点
  • 惰性求值:生成器在运行时逐步生成值,而不是一次性生成所有值。
  • 状态挂起:生成器函数的执行会在 yield 语句处挂起,并在 next() 调用时恢复执行。
生成器表达式

生成器表达式类似于列表推导式,但使用圆括号而不是方括号,适用于需要逐步生成值的场景。

gen_exp = (x * x for x in range(5))for value in gen_exp:print(value)

3. 装饰器

装饰器是用来在不改变原函数或类代码的情况下,增强或修改其行为的一种方式。

函数装饰器

函数装饰器是最常见的装饰器形式。使用 @decorator_name 语法将装饰器应用于函数。装饰器本质上是一个接受函数作为参数的高阶函数。

示例:简单的函数装饰器
def simple_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@simple_decorator
def say_hello():print("Hello!")# 调用函数
say_hello()
装饰器的扩展功能
  • 参数化装饰器:装饰器本身可以接受参数,从而提供更灵活的功能。
def repeat_decorator(times):def decorator(func):def wrapper(*args, **kwargs):for _ in range(times):func(*args, **kwargs)return wrapperreturn decorator@repeat_decorator(3)
def greet(name):print(f"Hello, {name}!")greet("Alice")
类装饰器

类装饰器通过定义 __call__() 方法,使得类的实例可以像函数一样被调用,来实现装饰器功能。类装饰器提供了更强大的功能,因为它可以保持状态。

示例:简单的类装饰器
class SimpleClassDecorator:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):print("Before the function is called.")result = self.func(*args, **kwargs)print("After the function is called.")return result@SimpleClassDecorator
def greet(name):print(f"Hello, {name}!")greet("Alice")
类装饰器的特点
  • 状态保持:类装饰器可以在实例中存储状态,以便在多次调用中使用。
  • 更多的控制:类装饰器允许定义多个方法和属性,提供比简单函数装饰器更复杂的行为。

总结

  • 迭代器 是实现了 __iter__()__next__() 方法的对象,允许我们通过 for 循环或手动调用 next() 逐步访问数据。它们在处理大型或无限数据流时非常有用。
  • 生成器 是通过 yield 创建的特殊迭代器,提供了一种简洁的方式来编写复杂的迭代逻辑,并且它们也是惰性求值的。
  • 生成器表达式 是一种简化语法,用于创建生成器,类似于列表推导式,但生成器表达式更加节省内存。
  • 装饰器 是一种用于增强或修改函数或类行为的强大工具。函数装饰器通过高阶函数实现,而类装饰器通过 __call__() 方法提供更复杂的功能。通过装饰器,代码可以更加模块化、可复用,并且易于维护。

这些概念在 Python 中具有广泛的应用,不仅可以提高代码的效率,还可以增强代码的可读性和可维护性。


http://www.ppmy.cn/embedded/102051.html

相关文章

react state 状态数据

props 和 state props 特点是只读&#xff0c;即修改不会让视图同步更新&#xff0c;想要更新必须再次调用 render() 渲染函数 state 特点是可读可写&#xff0c;在使用 this.setState({属性名: 属性值}) 修改时会同步更新视图state 创建和使用 state 必须在类组件的 construct…

计算机三级网络技术总结 第二章中小型网络系统总体规划与设计

采用RAID&#xff08;磁盘阵列技术&#xff09;在一定程度上可以提高磁盘存储容量集群系统&#xff08;cluster&#xff09;当一台主机出现故障&#xff0c;虽然不会使整个网络无法工作&#xff0c;但会影响性能系统高可用性&#xff1a;MTBF/&#xff08;MTBFMTBR&#xff09;…

电动汽车充电负荷预测!基于动态交通信息的电动汽车充电负荷时空分布预测程序代码!

前言 随着世界能源产业结构的调整和人们对环境问题的不断重视&#xff0c;促进了新能源汽车的发展与应用。而电动汽车(Electric Vehicle, EV)可以有效降低化石燃料的依赖和温室气体排放&#xff0c;满足未来能源需求以及电网系统与交通系统可持续发展的要求。然而&#xff0c;…

朋友圈个人IP打造技巧

1、不要设置三天可见 新加一个好友&#xff0c;我们都会下意识地去看看他的朋友圈&#xff0c;想看看他平时在做什么、喜欢什么、关注什么&#xff0c;了解一下他的爱好、职业、性格、甚至人品等等。千万不要逆人性行事&#xff0c;不要拒绝别人的好奇心。 记住&#xff1a;信…

浅析STM32外部中断易死机解决

本案例stm32死机或程序跑飞是实际产品中出现的&#xff0c;初步怀疑是外部中断口&#xff0c;有极强的干扰所致&#xff0c;于是拿着信号发生器实测&#xff0c;当信号发生器产生300KHz的信号&#xff0c;甚至到12MHz的信号时&#xff0c;期间&#xff0c;程序跑飞或死机。看门…

云原生系列 - Nginx(高级篇)

前言 学习视频&#xff1a;尚硅谷Nginx教程&#xff08;亿级流量nginx架构设计&#xff09;本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删学习文档&#xff1a; 云原生系列 - Nginx(基础篇)云原生系列 - Nginx(高级篇) 一、扩容 通过扩容提升整体吞吐量…

虚幻引擎UE5入坑记

前言 Unreal Engine 和Unity Engine作为目前主流的游戏引擎&#xff0c;各有优缺点。而我目前的工作还是以Unity开发为主&#xff0c;在使用Unity的过程中&#xff0c;总避免不了听到或看到过UE相关的东西&#xff0c;从开始的好奇到后面想要去学习它&#xff0c;但是&#xf…

c语言每日学习8.24

void reverse_string(char* str) 为什么不用传递数组的长度&#xff1f; 在C语言中&#xff0c;字符串通常是以空字符\0结尾的字符数组。因此&#xff0c;当你传递一个字符串&#xff08;即字符数组的指针&#xff09;给函数时&#xff0c;函数可以通过遍历字符串直到遇到空字…