【无标题】迭代器和生成器的区别及其各自实现方式和使用场景

系列文章目录

前言

小伙伴们,今天我们将进入迭代器和生成器的使用,这俩个呢对我们处理信息的时候帮助是非常大的。对于我们的电脑将减轻负重,不至于内存的损耗过大。未来我们在训练模型处理数据时,会频繁的使用生成器。

一, 迭代器

Iterator

迭代器提供了一种惰性(lazy evaluation)获取数据的方法,使得我们能够逐步访问序列中的元素,而无需一次性加载所有数据。其主要优点包括节省内存、提高性能、支持自定义遍历逻辑等。

1.1 特点

  1. 惰性计算:按需生成数据,节省内存。
  2. 实现协议
    • __iter__():返回自身。
    • __next__():返回下一个元素;如果没有更多元素,则抛出 StopIteration 异常。
  3. **可迭代对象(Iterable)**与迭代器不同:
    • 可迭代对象实现 __iter__() 方法,返回一个迭代器。
    • 迭代器既实现 __iter__() 又实现 __next__()

1.2 迭代器的创建

  • 迭代器只能往前取值,不会后退
  • 用iter函数可以返回一个可迭代对象的迭代器
# 示例 可迭代对象
L = [1, 3, 5, 7]
it = iter(L)  # 从L对象中获取迭代器
next(it)  # 1  从迭代器中提取一个数据
next(it)  # 3
print(next(it))   # 5
next(it)  # 7
# 示例2 生成器函数
It = iter(range(1, 10, 3))
next(It)  # 1
print(next(It))  # 4
next(It)  # 7

1.3 自定义迭代器

# 自定义迭代器类
class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self  # 迭代器返回自身

    def __next__(self):
        if self.index < len(self.data):
            result = self.data[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration  # 数据迭代结束

# 使用自定义迭代器
my_iter = MyIterator([1, 2, 3])
for item in my_iter:
    print(item)

二, 生成器

Generator

生成器是一种特殊的迭代器,通过函数定义,用 yieldyieldyield 语句生成值。生成器可以自动实现迭代协议,无需手动实现 __iter__()__next__()

2.1 特点

  1. 简洁:比手动实现迭代器更易写。
  2. 惰性计算:生成器在每次调用 next()next()next() 时生成一个值,而不是一次性生成所有值。
  3. yield:暂停函数执行并返回值,保留函数的状态,以便下一次继续执行。

示例代码:

# 生成器函数
def my_generator():
    print("Start")
    yield 1
    print("Continue")
    yield 2
    print("End")
    yield 3

# 使用生成器
gen = my_generator()
for val in gen:
    print(val)

输出:

Start
1
Continue
2
End
3

案例参考:

def Descendorder(n):
    while n > 0:
        yield n
        n -= 1

# 创建生成器对象
generator = Descendorder(5)

# 通过迭代生成器获取值
print(next(generator))  #5
print(next(generator))  #4

# 使用 for 循环迭代生成器
for i in generator:
    print('for循环:', i)  #3  2  1

2.2 生成器表达式

生成器可以用表达式形式定义,类似列表推导式,但使用小括号 ()

  • 语法
(表达式 for 变量 in 可迭代对象 [if 真值表达式])

[] 内容代表可以省略

# 生成器表达式
gen_expr = (x**2 for x in range(5))
print(next(gen_expr))  # 0
print(next(gen_expr))  # 1

总结

首先呢,这俩个都是帮助我们节省内存,不同的是,当我们用到迭代器的时候我们可以自定义自己的迭代器,生成我们自己需要的。
生成器呢,它是真的惰性通过yield来控制我们的输出,确保是一条一条数据进行处理,方便我们在处理大批量数据时,不会占用过多的内存空间。

你可能感兴趣的:(python,机器学习,开发语言)