深入了解python迭代器(iterator)

可迭代对象(Iterable)

在 Python 中,可迭代对象是实现了 __iter__() 方法或者包含 __getitem__() 方法(支持从索引 0 开始迭代)的对象。常见的可迭代对象包括列表、元组、字符串、字典、集合、文件对象等。

# 列表是一个可迭代对象
my_list = [1, 2, 3, 4]

迭代器(Iterator)

迭代器是实现了 __iter__()__next__() 方法的对象。所有迭代器都是可迭代对象但并非所有可迭代对象都是迭代器【列表是可迭代对象,但它并不是一个迭代器,不可直接使用next()调用】。迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完,迭代器只能往前移动,不能后退。

列表被next()调用报错示例

以下代码直接使用next()函数调用my_list列表。

my_list = [1, 2, 3, 4]
print(next(my_list))
print(next(my_list))
print(next(my_list))

运行后报错:列表对象不是迭代器

Traceback (most recent call last):
  File "C:\work\pythonBase\iterator.py", line 2, in <module>
    print(next(my_list))
TypeError: 'list' object is not an iterator

iter() 函数

iter() 函数用于从一个可迭代对象中返回一个迭代器。对于实现了 __iter__() 方法的对象,iter() 调用该方法并返回迭代器;对于实现了 __getitem__() 方法的对象,iter() 创建一个从索引 0 开始访问元素的迭代器。

my_list = [1, 2, 3, 4]
my_iter = iter(my_list)  # 获取迭代器

next() 函数

next() 函数用于从迭代器中获取下一个元素。当调用 next() 时,迭代器返回下一个值。如果迭代器已无更多元素,则引发 StopIteration 异常。

print(next(my_iter))  # 输出:1
print(next(my_iter))  # 输出:2

详细示例

下面是一个包含可迭代对象、迭代器、iter()next() 函数的详细示例:

# 创建一个可迭代对象(列表)
my_list = [1, 2, 3, 4]

# 获取迭代器
my_iter = iter(my_list)

# 使用 next() 函数获取迭代器的下一个元素
print(next(my_iter))  # 输出:1
print(next(my_iter))  # 输出:2
print(next(my_iter))  # 输出:3
print(next(my_iter))  # 输出:4

# 尝试获取更多元素会引发 StopIteration 异常
try:
    print(next(my_iter))
except StopIteration:
    print("迭代器已无更多元素")

自定义迭代器

你可以通过定义一个类并实现 __iter__()__next__() 方法来自定义迭代器:

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, 4])
for item in my_iter:
    print(item)  # 输出:1 2 3 4

总结

  • 可迭代对象:实现了 __iter__()__getitem__() 方法的对象,可以返回迭代器。
  • 迭代器:实现了 __iter__()__next__() 方法的对象,可以逐一访问元素。
  • iter() 函数:用于从可迭代对象中返回迭代器。
  • next() 函数:用于从迭代器中获取下一个元素,如果无更多元素则引发 StopIteration 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jesse_Kyrie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值