python--迭代器

1.可迭代对象

在python中 可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)

我们可以使用isinstance() 来判断一个对象是否是可迭代对象,当返回为True时表示为可迭代对象。


ok,我们现在已经知道了什么是可迭代对象了,那么我们来看下可迭代对象的本质

2.可迭代对象的本质

我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。

可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。

可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据。

那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。

3. iter()函数 和 next()函数   

我们可以通过iter()函数获取可迭代对象的迭代器。然后我们可以可以对获取到的迭代器不断使用next()函数获取下一条数据。iter()函数实际上就是调用了__iter__方法


4.迭代器:

访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有元素访问完结束。迭代器只能往前不会后退。包含有next方法的实现,在正确范围内返回期待的数据以及超出范围后能够抛出StopIteration的错误停止迭代。

迭代器要实现两种方法。1)__iter__和 2)__next__

我们可以通过inistance来判断一个对象是否是迭代器,返回为True时为迭代器


5.自定义迭代器

from collections import Iterator


class MyList(object):
    """自定义一个容器,保存多个数据,做成可迭代对象"""
    def __init__(self):
        self.container = []
        self.i = 0

    def add(self, item):
        """用来填充数据"""
        self.container.append(item)

    def __next__(self):
        if self.i < len(self.container):
            item = self.container[self.i]
            self.i += 1
            return item
        else:
            raise StopIteration

    def __iter__(self):
        return self

my_list1 = MyList()
my_list1.add(100)
my_list1.add(200)
my_list1.add(300)

for num in my_list1:
    print(num)
print(isinstance(my_list1, Iterator))



### 如何使用迭代器遍历数据结构 #### C++ 中的 `std::vector` 遍历示例 在 C++ 中,可以通过迭代器来遍历标准库容器(如 `std::vector`)。以下是一个完整的代码示例: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用显式迭代器遍历 vector 容器中的元素 for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; } ``` 上述代码展示了如何利用 `.begin()` 和 `.end()` 方法创建迭代器并遍历整个向量的内容[^3]。 --- #### Java 中的集合类遍历示例 在 Java 中,可以借助 `Iterator` 接口来遍历各种集合类(如 `ArrayList` 或其他实现 `Collection` 接口的类)。以下是具体的例子: ```java import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); // 获取集合的迭代器实例 Iterator<String> iterator = list.iterator(); // 利用 while 循环进行遍历 while (iterator.hasNext()) { System.out.println(iterator.next()); } // 另一种方式:使用增强型 for 循环隐式调用迭代器 for (String element : list) { System.out.println(element); } } } ``` 此代码片段说明了两种常见的遍历方法:基于 `while` 的手动控制以及基于范围的自动处理[^5]。 --- #### Python 中的迭代器机制简介 尽管提问主要涉及 C++ 和 Java,但为了全面理解迭代器的概念,这里也简单介绍 Python 的情况。Python 提供了内置支持以简化这一过程: ```python my_list = ["apple", "banana", "cherry"] # 创建一个迭代器对象 iter_obj = iter(my_list) # 使用 next 函数逐一提取项目直到耗尽为止 print(next(iter_obj)) # 输出 apple print(next(iter_obj)) # 输出 banana print(next(iter_obj)) # 输出 cherry # 如果继续调用,则会抛出 StopIteration 异常 ``` 或者可以直接采用更简洁的方式完成相同目标: ```python for item in my_list: print(item) ``` 这种方法背后实际上也是依赖于迭代协议的工作原理[^6]。 --- ### 总结 无论是在哪种编程语言里头,运用迭代器都能够带来诸多好处,像减少耦合度、提升灵活性等等特性均已被提及过多次[^1][^2]。因此掌握好这些技巧对于提高程序设计水平至关重要。 相关问题
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值