Python基础:迭代器(Iterators)详解

在这里插入图片描述

什么是迭代器?

  迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

1. 迭代对象

  Python中使用迭代器的地方很多,大多数的容器对象都是可迭代对象,如列表、元组、字典、字符串等,均可以使用for语句进行迭代循环,如

for element in [1,2,3]:
    print(element)
for element in ('a','b','c'):
    print(element)
for key in {'one':1,'two':2}:
    print(key)
for char in 'abc':
    print(char)
for line in open('test.txt',encoding='utf-8'):
    print(line,end=' ')

  这种访问风格清晰、简洁又方便。
  迭代器的使用非常普遍并使得 Python 成为一个统一的整体。 在幕后,for语句会在容器对象上调用iter()
  该函数返回一个定义了__next__() 方法的迭代器对象,此方法将逐一访问容器中的元素。 当元素用尽时,__next__() 将引发 StopIteration 异常来通知终止for 循环。 可以使用next() 内置函数来调用 __next__() 方法。

2. 使用 next()方法

在这里插入图片描述

  字符‘abc’可以正常使用next()三次,当迭代次数超过了字符串中的元素个数,就会抛出StopIteration异常

3. 其他迭代器示例

# 使用内置的 iter() 和 next() 函数
my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)

# 逐个输出列表中的元素
print(next(my_iterator))  # 输出 1
print(next(my_iterator))  # 输出 2
# 使用生成器函数创建迭代器
def square_generator(n):
    for i in range(n):
        yield i ** 2

squares = square_generator(5)
for square in squares:
    print(square)
# 使用 enumerate() 构建迭代器获取元素和索引
my_list = ['apple', 'banana', 'orange']

for index, value in enumerate(my_list):
    print(f"Index: {index}, Value: {value}")
# 使用 zip() 合并多个可迭代对象
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]

for name, age in zip(names, ages):
    print(f"Name: {name}, Age: {age}")

4. 自定义迭代器

4.1 自定义iter()和next()

定义一个方法 返回一个带有方法的对象。如果类 定义,然后可以返回:__next__()__iter__()self

class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]

rev = Reverse('spam')
iter(rev)

for char in rev:
    print(char)

4.2 自定义迭代器中实现斐波那契数列

  斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递推的方法定义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。

class Fibonacci:
    def __init__(self, limit):
        self.limit = limit
        self.a, self.b = 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        if self.a <= self.limit:
            result = self.a
            self.a, self.b = self.b, self.a + self.b
            return result
        else:
            raise StopIteration

fib_iter = Fibonacci(20)
for num in fib_iter:
    print(num)

  生成:

在这里插入图片描述

  使用迭代器的主要优势是它们不需要在开始时就加载整个数据集到内存中。这对于大数据集或者流数据尤其有用。
  迭代器是Python中一个强大而灵活的工具,可以简化遍历复杂数据结构的过程。通过理解和使用迭代器,可以编写出更高效、更优雅的Python代码。

5 参考:

迭代器官方文档

在这里插入图片描述

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会用 Python 实现。 首先是 `myrange` 类: ```python class myrange: def __init__(self, start, stop=None, step=1): if stop is None: stop = start start = 0 self.start = start self.stop = stop self.step = step self.current = start def __iter__(self): return self def __next__(self): if self.step > 0 and self.current >= self.stop: raise StopIteration elif self.step < 0 and self.current <= self.stop: raise StopIteration else: result = self.current self.current += self.step return result ``` `myrange` 类接受与 `range()` 函数相同的参数,即起始值、终止值和步长。它的 `__iter__` 方法返回自身,因此它是可迭代的。`__next__` 方法计算下一个值并返回它,直到达到终止值或步长为零。 接下来是 `myzip` 类: ```python class myzip: def __init__(self, *args): self.iterators = [iter(arg) for arg in args] def __iter__(self): return self def __next__(self): try: return tuple(next(iterator) for iterator in self.iterators) except StopIteration: raise StopIteration ``` `myzip` 类接受任意数量的可迭代对象,并为每个对象创建一个迭代器。它的 `__iter__` 方法返回自身,因此它是可迭代的。`__next__` 方法从每个迭代器中取出一个元素,并返回一个元组,直到任何一个迭代器抛出 `StopIteration` 异常。此时,它也抛出 `StopIteration` 异常以终止迭代。 使用这两个类的例子: ```python # 使用 myrange for i in myrange(5): print(i) # 0 1 2 3 4 # 使用 myzip a = [1, 2, 3] b = ['a', 'b', 'c'] for x, y in myzip(a, b): print(x, y) # 1 a 2 b 3 c ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snail哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值