Python中的迭代器和生成器介绍

2023-09-12 08:07:41 浏览数 (1)

一、迭代器(Iterators)

迭代器是Python中用于遍历数据集合的一种机制。它是一个实现了迭代协议的对象,可以通过iter()函数来获得迭代器。迭代器需要实现两个方法:__iter__()和__next__()。其中,__iter__()返回迭代器自身,而__next__()返回序列中的下一个元素。当没有元素可以返回时,__next__()应该引发StopIteration异常,表示迭代结束。当我们处理数据集合时,往往需要逐个访问其中的元素,这时就需要用到迭代器(Iterators)。

  • __iter__() 方法:这个方法应该返回迭代器对象自身。它表示对象可以被迭代,可以用在 for 循环中。一般来说,__iter__() 方法只需返回 self 即可。
  • __next__() 方法:这个方法返回序列中的下一个元素。如果没有元素可供返回,它应该引发 StopIteration 异常来表示迭代结束。每次调用 __next__() 方法,迭代器会返回序列中的下一个元素,直到所有元素都被访问完毕。

下面是一个简单的示例来展示如何创建一个迭代器:

代码语言:javascript复制
class MyIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.end:
            self.current  = 1
            return self.current - 1
        else:
            raise StopIteration


my_iter = MyIterator(0, 10)

for num in my_iter:

    print(num)

二、生成器(Generators)

生成器(Generator)是 Python 中一种特殊的迭代器,它可以在函数中使用 yield 关键字来返回一个值,而不是使用 return。当函数被再次调用时,它会从上次 yield 的位置继续执行,而不是从头开始。这使得生成器在处理大量数据或需要按需生成数据的场景中非常有用。

生成器的创建有两种方式:一种是使用生成器表达式,另一种是使用带有 yield 关键字的函数。

使用yield关键字:

代码语言:javascript复制
def my_generator(start, end):
    current = start
    while current < end:
        yield current
        current  = 1

# 使用生成器遍历序列
gen = my_generator(0, 9)
for num in gen:
    print(num)

生成器表达式:

代码语言:javascript复制
# 使用生成器表达式生成一个包含平方数的生成器
squares_gen = (x ** 2 for x in range(10))

# 遍历生成器并打印每个平方数
for square in squares_gen:
    print(square)

生成器表达式是一种紧凑的语法形式,允许你在一行代码中创建生成器。与列表推导类似,生成器表达式也是一种用于创建序列的方式,但不会立即生成整个序列,而是按需生成元素。这在处理大数据集时非常有用,可以节省内存。生成器表达式的语法和列表推导式很相似,只需将方括号 [] 替换为圆括号 (),并使用 yield 关键字或普通的表达式来生成元素。

三、生成器的优点

生成器按需生成数据,而不是一次性生成整个序列。这意味着只有在需要时才会在内存中存储一个元素,从而避免了大量数据占用内存的问题。这对于处理大型数据集尤其有用,可以避免内存溢出。而且生成器采用惰性计算策略,即只在需要时计算值。这在处理复杂计算或涉及耗时操作的情况下很有用,可以避免不必要的计算。

四、生成器常见的一些使用场景

1、文件的逐行读取

2、大数据量的处理

3、数据清洗

往期精彩回顾

如何打造一篇优秀的简历

混迹职场多年的你,面试真的准备好了吗?

你还在抱怨职场的不公吗?

职场篇-初入职场如何选择行业和公司 面试逻辑题分享--字母数字映射关系推算题

非技术性的面试中的技巧性回答集锦(建议收藏)

你的求职简历中招了吗?

测试编程笔试题No.1-输入表格列的英文名称,返回其对应的数字序号

软件测试面试题分享-No.1

软件测试面试题分享-No.2

软件测试面试题分享-No.3

软件测试面试题分享-No.4

软件测试面试题分享-No.5

软件测试面试题分享-No.6(某某某公司面试题)

软件测试面试题分享-No.7(接口自动化面试题)

xxx公司测试岗位企业面试题

0 人点赞