page contents

Python中的可迭代对象、迭代器和生成器

在 Python 中,可迭代对象、迭代器和生成器,都提供了生成数据集合和有序遍历数据的方法。如果生成的数据量比较小,推荐使用可迭代对象;如果生成的数据量比较大,推荐使用迭代器或生成器,由于生成器的实现通常更加简单,因此,能用生成器实现就尽量不要用迭代器。本文主要对以下几项内容做基本介绍:

attachments-2025-08-wy6RV0a668a919cb597fe.jpg在 Python 中,可迭代对象、迭代器和生成器,都提供了生成数据集合和有序遍历数据的方法。如果生成的数据量比较小,推荐使用可迭代对象;如果生成的数据量比较大,推荐使用迭代器或生成器,由于生成器的实现通常更加简单,因此,能用生成器实现就尽量不要用迭代器。本文主要对以下几项内容做基本介绍:

可迭代对象

迭代器

自定义可迭代对象和迭代器

生成器

可迭代对象

可迭代对象(Iterable) 是指实现了 __iter__() 方法的对象,常见的可迭代对象有 列表(list)、元组(tuple)、字符串(str)、字典(dict)、集合(set)等,可迭代对象的特性如下:可以通过 for 循环访问,不可以通过 next() 访问。

示例如下:

# 可以通过 for 循环访问my_list = list(range(6))for elem in my_list:    print(elem)# 以下代码会报错,因为 my_list 不是迭代器,不能通过 next() 访问# print(next(my_list))

可以重复遍历。

示例如下:

# 可以重复遍历my_list = list(range(6))for elem in my_list:    print(elem)  # 会执行这一句for elem in my_list:    print(elem)  # 会执行这一句一次生成所有数据。打印结果一般为所有元素。示例如下:my_list = list(range(6))print(my_list)  # 输出: [0, 1, 2, 3, 4, 5]

可以通过 iter() 将可迭代对象转换为迭代器。

迭代器

迭代器(Iterator) 是指实现了 __iter__() 和 __next__() 方法的对象,Python 中的内置函数 enumerate()、zip()、map()、filter()等返回的是迭代器,迭代器的特性如下:可以通过 for 循环和 next() 访问,next() 是 Python 中的内置函数,用于获取迭代器的下一个元素。

示例如下:

my_list = ['one', 'two', 'three']my_iterator = enumerate(my_list, start=1)

# 输出: (1, 'one')print(next(my_iterator))

# 输出:# (2, 'two')# (3, 'three')for elem in my_iterator:    print(elem)

只能单方向遍历,并且只能遍历一次。

示例如下:

my_list = ['one', 'two', 'three']my_iterator = enumerate(my_list, start=1)for elem in my_iterator:    print(elem)  # 会执行这一句for elem in my_iterator:    print(elem)  # 不会执行这一句

除了用 for 循环对迭代器进行遍历,有不少的内置函数(例如,max()、min()等)也会对迭代器进行遍历,遍历之后,再对迭代器进行遍历不会有返回结果。

示例如下:

my_list = ['one', 'two', 'three']my_iterator = enumerate(my_list, start=1)print(max(my_iterator))  # 输出: (3, 'three')for elem in my_iterator:    print(elem)  # 不会执行这一句,因为 max() 已经单向遍历过 my_iterator 一次

使用时生成数据,适合产生大量数据的场景。打印结果一般为对象的地址。

示例如下:

my_list = ['one', 'two', 'three']my_iterator = enumerate(my_list, start=1)

# 输出类似 <enumerate object at 0x00000299B14B0680>print(my_iterator)

可以通过 list() 等方法转换为可迭代对象。

自定义可迭代对象和迭代器

需求如下:产生 [begin, stop) 之间的整数,自定义可迭代对象 MyIterable 和迭代器 MyIterator。

示例如下:

class MyIterator:    """    自定义迭代器    """    def __init__(self, begin, end):        self.begin = begin        self.end = end        self.index = begin    def __iter__(self):        return self    def __next__(self):        if self.index < self.end:            result = self.index            self.index += 1            return result        else:            raise StopIterationclass MyIterable:    """    自定义可迭代对象    """    def __init__(self, begin, end):        self.begin = begin        self.end = end    def __iter__(self):        # 返回一个迭代器对象        return MyIterator(self.begin, self.end)    def __repr__(self):        return str(list(self))my_iterator = MyIterator(1, 3)# 输出:# 1# 2for elem in my_iterator:    print(elem)my_iterable = MyIterable(1, 3)# 输出:# 1# 2for elem in my_iterable:    print(elem)# 输出: [1, 2]print(my_iterable)

生成器

生成器(Generator)是一种特殊的迭代器,和迭代器一样按需生成值、而不是一次生成所有值。生成器不需要实现 __iter__() 和 __next__() 方法,而是通过"函数+ yield"来实现,实现方式更加简洁。每次调用 yield 时,函数会暂停并返回一个值,下次调用时会从暂停的地方继续执行。

示例如下:

# 生成 [begin, end)范围的整数def generate(begin, end):    for i in range(begin, end):        yield imy_generator = generate(6, 9)

# 输出: 6print(next(my_generator))

# 输出:# 7# 8for elem in my_generator:    print(elem)# 输出: <class 'generator'>print(type(my_generator))

在上述示例中,yield i 的意思是:使用 yield 关键字返回当前的值 i,并暂停函数的执行,下次调用时,函数会从 yield 语句之后继续执行。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-08-23 09:31
  • 阅读 ( 14 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1335 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2172 文章
  3. Pack 1335 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章