16_Python的迭代器

在这里插入图片描述
在Python中,迭代是一个非常重要的概念。迭代通常指的是按照某种顺序逐个访问容器中的元素的行为。如使用for循环遍历取值的过程。

可迭代对象(Iterable)

可迭代对象是任何可以返回一个迭代器的对象。简单来说,它是可以逐一返回其成员项的对象。大多数内置集合类型,如list、set、dict、tuple和str都是可迭代的。即可以使用for循环遍历取值的对象。如:字符串、列表、元组、集合、字典。

  • 可迭代对象一般都具有一个 __iter__ 方法,用于创建迭代器

可迭代对象的特点:

  • 可以使用iter()函数从可迭代对象中得到一个迭代器。
  • 可以在for循环中使用,因为for循环背后使用了迭代器。
# 对列表进行for循环遍历
my_list = [1, 2, 3]
for item in my_list:
    print(item)
# 对元组进行for循环遍历
t = (1, 2, 3)
for item in t:
    print(item)
# 对集合进行for循环遍历
st = (1, 2, 3, 4)
for item in st:
    print(item)
# 对字典进行遍历
my_dict = {'name':'Jim', 'age':12}
for i in my_dict:
    print(i)

迭代器(Iterator)

迭代器是实现了 __iter__()__next__() 方法的对象。 __iter__() 方法返回迭代器本身,而 __next__() 方法返回序列中的下一个项目。

迭代器是特殊的可迭代对象,

  • __next__ :访问迭代器中的元素
    • 从迭代提中的第一个元素开始访问,一只访问到最后一个元素。如果继续进行访问会报StopIteration异常。访问之后会将元素丢弃,不会存在内存中。

迭代器的特点:

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 使用next()函数可以手动获取下一个元素,当没有更多元素时,会抛出一个StopIteration异常。
class MyIterator:
    def __init__(self, items):
        self.items = items
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        current_item = self.items[self.index]
        self.index += 1
        return current_item

# 使用迭代器
my_iterator = MyIterator([1, 2, 3])
for item in my_iterator:
    print(item)
it1 = my_list.__iter__()
it1
it1.__next__()
it1.__next__()
it1.__next__()
# 访问最后一个元素后,再访问会报错:StopIteration。
it1.__next__()

迭代对象和迭代器的总结

  • 所有迭代器都是可迭代的,但不是所有可迭代的都是迭代器。
  • 可迭代对象提供一个迭代器,而迭代器可以用来迭代其中的元素。

在Python编程中,理解这两个概念对于编写高效的循环和操作集合类型至关重要。

# 使用for循环访问迭代器
class MyIterator:
    def __init__(self, items):
        self.items = items
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        current_item = self.items[self.index]
        self.index += 1
        return current_item

# 创建一个迭代器实例
my_iterator = MyIterator([1, 2, 3, 4, 5])

# 使用for循环来访问迭代器
for item in my_iterator:
    print(item)
# 使用while循环
my_iterator = MyIterator([1, 2, 3, 4, 5, 6])
it = iter(my_iterator)
while True:
    try:
        print(next(it))
    except StopIteration:
        break

迭代器的优点

  • 内存效率:迭代器按需计算值,这意味着它们不需要在内存中存储整个数据集。
  • 惰性计算:迭代器只在需要时计算下一个值,这对于大数据集或无限数据流来说非常有用。
  • 提供一个统一的接口:迭代器提供了一个通用的接口来遍历数据结构,而不需要关心底层数据结构的细节。

以下是一个使用迭代器的实例,其中我们创建了一个生成斐波那契数列的迭代器。斐波那契数列是一个无限序列,使用迭代器可以有效地生成它,而不需要预先计算整个序列。

class FibonacciIterator:
    def __init__(self):
        # 初始化前两个斐波那契数
        self.first = 0
        self.second = 1

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

    def __next__(self):
        # 计算下一个斐波那契数
        next_value = self.first + self.second
        # 更新前两个数
        self.first, self.second = self.second, next_value
        # 返回下一个斐波那契数
        return self.first

# 创建斐波那契数列迭代器
fib_iterator = FibonacciIterator()

# 使用for循环打印前10个斐波那契数
for i, value in enumerate(fib_iterator):
    if i >= 10:  # 打印前10个数后停止
        break
    print(value)

附件

本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.youkuaiyun.com/download/fx_yzjy101/89779395

如有问题请留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值