前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python入门第十三讲】可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)

【Python入门第十三讲】可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)

原创
作者头像
不惑
发布2024-02-08 09:41:50
6350
发布2024-02-08 09:41:50
举报
文章被收录于专栏:Python基础系列Goboy

在 Python 中,可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)是处理数据集合和处理大数据时常用的概念和工具。

可迭代对象(Iterable)

可迭代对象(Iterable)是指在 Python 中能够使用迭代器进行遍历的对象。它包括了各种容器对象,如列表(list)、元组(tuple)、集合(set)、字典(dict)以及字符串等。

可迭代对象的特点是可以通过 for 循环来遍历其中的元素,或者使用内置的 iter() 函数将其转换为迭代器对象。

示例代码:

代码语言:python
代码运行次数:0
复制
# 列表是可迭代对象
my_list = [1, 2, 3, 4, 5]
for item in my_list:
    print(item)

# 元组也是可迭代对象
my_tuple = (1, 2, 3, 4, 5)
for item in my_tuple:
    print(item)

# 字符串是可迭代对象
my_string = "Hello"
for char in my_string:
    print(char)

上述的示例中,my_listmy_tuplemy_string 都是可迭代对象,因为它们可以通过 for 循环遍历其中的元素。

迭代器(Iterator)

迭代器(Iterator)是一种可以实现惰性计算的对象,可以被用来遍历可迭代对象中的元素。迭代器是一种特殊的对象,它实现了 __iter__()__next__() 方法,这使得它可以被 next() 函数调用,并且可以逐个返回元素,直到没有元素可返回时抛出 StopIteration 异常。

迭代器的主要特点是它只在需要时才生成下一个值,这种延迟计算的方式使得迭代器在处理大数据集时非常高效,因为它不会一次性将所有数据都加载到内存中,而是按需生成和处理数据。

Python 中的很多内置函数和语法都是基于迭代器实现的,例如 for 循环、列表推导式、生成器表达式等都可以使用迭代器进行遍历或生成数据。

示例代码:

代码语言:python
代码运行次数:0
复制
my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)  # 使用iter()函数将列表转换为迭代器

print(next(my_iterator))  # 输出迭代器的下一个元素
print(next(my_iterator))  # 输出迭代器的下一个元素
print(next(my_iterator))  # 输出迭代器的下一个元素
print(next(my_iterator))  # 输出迭代器的下一个元素
print(next(my_iterator))  # 输出迭代器的下一个元素

示例中,my_list 是一个可迭代对象,使用 iter() 函数将其转换为迭代器 my_iterator。然后通过调用 next() 函数逐个获取迭代器中的元素,直到没有元素可获取时抛出 StopIteration 异常。

生成器(Generator)

生成器(Generator)是一种特殊的迭代器,它可以在需要时动态生成值,而不是一次性将所有值存储在内存中。生成器使用 yield 关键字来定义生成值的逻辑,每次调用生成器的 __next__() 方法时,它会从上一次的 yield 语句处继续执行,直到遇到下一个 yield 或者函数结束。

生成器在实现上更加简洁和高效,因为它不需要显式地维护整个序列,而是在每次迭代中动态生成下一个值,这种惰性计算的方式使得生成器非常适合处理大数据集或者无限序列。

  • Python 中有两种定义生成器的方式

生成器函数:

使用 def 关键字定义的函数,其中包含 yield 语句来产生值。

代码语言:python
代码运行次数:0
复制
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(next(gen))  # 输出:1
print(next(gen))  # 输出:2
print(next(gen))  # 输出:3

生成器表达式:

类似于列表推导式,使用圆括号来生成一个生成器。

代码语言:python
代码运行次数:0
复制
gen = (x ** 2 for x in range(5))
print(next(gen))  # 输出:0
print(next(gen))  # 输出:1
print(next(gen))  # 输出:4
print(next(gen))  # 输出:9

生成器在迭代过程中会记住自己的状态,因此可以从上次暂停的地方继续执行,这种特性使得生成器非常灵活和高效。在处理大量数据或者需要逐步生成数据的场景中,生成器是一个非常有用的工具。

扩展 - itertools 库简介

itertools 是 Python 中用于创建和操作迭代器的模块,它提供了许多用于操作迭代器的函数和工具,能够帮助我们更加高效地处理迭代对象。下面是 itertools 库中一些常用函数的简介:

  1. itertools.count(start=0, step=1): 创建一个无限迭代器,从 start 开始,步长为 step,每次生成一个比前一个值大 step 的值。
  2. itertools.cycle(iterable): 创建一个无限迭代器,不断重复 iterable 中的元素。
  3. itertools.repeat(elem, times=None): 创建一个无限迭代器,重复生成 elem 指定的元素,可选参数 times 指定重复的次数。
  4. itertools.chain(*iterables): 将多个迭代器连接成一个迭代器,依次返回每个迭代器中的元素。
  5. itertools.islice(iterable, start, stop, step=1): 返回一个迭代器,生成 iterable 中从 startstop(不包括 stop)的元素,步长为 step
  6. itertools.compress(data, selectors): 返回一个迭代器,生成 data 中对应 selectors 中为 True 的元素。
  7. itertools.filterfalse(predicate, iterable): 返回一个迭代器,生成 iterable 中使 predicate 返回 False 的元素。
  8. itertools.groupby(iterable, key=None): 将 iterable 中连续的相同元素分组,返回一个迭代器,每个元素是一个 (key, group) 对,其中 key 是分组的键,group 是迭代器,包含了分组的元素。
  9. itertools.permutations(iterable, r=None): 返回一个迭代器,生成 iterable 中所有长度为 r 的排列。
  10. itertools.combinations(iterable, r): 返回一个迭代器,生成 iterable 中所有长度为 r 的组合,不考虑元素顺序。
  11. itertools.product(*iterables, repeat=1): 返回一个迭代器,生成多个迭代器的笛卡尔积。
  12. itertools.zip_longest(*iterables, fillvalue=None): 将多个迭代器中的元素依次组合成元组,当其中某个迭代器耗尽时,使用 fillvalue 填充。

以上这些函数提供了灵活和高效地处理迭代器的方式,能够简化很多复杂的迭代任务。通过组合使用这些函数,可以轻松地处理各种迭代场景。

itertools 模块中的一些函数:

代码语言:python
代码运行次数:0
复制
import itertools

# 示例 1: 无限计数器
counter = itertools.count(start=1, step=2)
for _ in range(5):
    print(next(counter))  # 输出:1, 3, 5, 7, 9

# 示例 2: 重复元素
repeater = itertools.repeat('Hello', times=3)
print(list(repeater))  # 输出:['Hello', 'Hello', 'Hello']

# 示例 3: 链接迭代器
iter1 = ['a', 'b', 'c']
iter2 = ['x', 'y', 'z']
chained = itertools.chain(iter1, iter2)
print(list(chained))  # 输出:['a', 'b', 'c', 'x', 'y', 'z']

# 示例 4: 按条件过滤元素
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filtered = itertools.filterfalse(lambda x: x % 2 == 0, data)
print(list(filtered))  # 输出:[1, 3, 5, 7, 9]

# 示例 5: 元素分组
words = ['apple', 'banana', 'blackberry', 'cherry', 'coconut']
grouped = itertools.groupby(words, key=lambda x: x[0])
for key, group in grouped:
    print(key, list(group))  # 输出每个字母开头的单词

# 示例 6: 笛卡尔积
colors = ['red', 'green', 'blue']
numbers = [1, 2, 3]
cartesian_product = itertools.product(colors, numbers)
print(list(cartesian_product))  # 输出:[('red', 1), ('red', 2), ('red', 3), ('green', 1), ('green', 2), ('green', 3), ('blue', 1), ('blue', 2), ('blue', 3)]

这些示例展示了 itertools 模块的强大功能,通过灵活使用这些函数,可以更高效地处理迭代任务。

总结

类型

定义

示例

特点

示例代码

可迭代对象

任何能返回迭代器的对象

列表、元组、集合、字典、字符串等

可重复遍历,占用内存,不一定有明确的结束

for item in iterable_object:

迭代器

用于实际进行迭代的对象

range() 返回的对象、文件对象等

惰性计算,节省内存,一次性消耗

iter_object = iter(iterable_object)

生成器

一种特殊的迭代器,使用 yield 语句生成值

通过函数中包含 yield 关键字创建的生成器函数

惰性计算,节省内存,一次性消耗

def generator_function(): yield item

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 可迭代对象(Iterable)
    • 示例代码:
    • 迭代器(Iterator)
      • 示例代码:
      • 生成器(Generator)
        • 生成器函数:
          • 生成器表达式:
          • 扩展 - itertools 库简介
            • itertools 模块中的一些函数:
            • 总结
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档