【Python基础】Python迭代器与生成器(两种强大工具)

本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢!

文章目录

    • 一、前言
    • 二、迭代器
        • 2.1 创建迭代器
        • 2.2 自定义迭代器
        • 2.3 处理大型文件
    • 三、生成器
    • 四、生成器表达式
    • 五、实际应用案例
        • 5.1 数据库查询
        • 5.2 网络数据流处理
    • 六、总结

一、前言

在Python中,迭代器与生成器是两种非常强大的工具,它们可以帮助我们有效地处理大量数据,特别是在需要逐个访问元素的情况下。

本文将介绍迭代器和生成器的概念、用法以及它们在实际案例中的应用。

  • 什么是Python?

    Python是由荷兰人吉多·范罗苏姆于1990年初设计的一门高级编程语言,该语言应用领域非常广泛,尤其在数据科学、人工智能、游戏开发等领域,它已经成为最受欢迎的程序设计语言之一,非常适合新手学习。

    Python语言标准库官方使用手册:https://docs.python.org/zh-cn/3/library/turtle.html#turtle-methods

  • Python语言有哪些特点?

    1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。

    2.易于阅读:Python代码定义的更清晰。

    3.易于维护:Python的成功在于它的源代码是相当容易维护的。

    4.丰富的库:Python的最大的优势之一具有丰富的标准库,并且跨平台的,在UNIX,Windows和Mac兼容很好。

    5.面向对象:Python支持面向对象编程,在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。

    6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。

    7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。

    8.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。

    【Python基础】Python迭代器与生成器(两种强大工具)_第1张图片

二、迭代器

迭代器是Python中访问集合元素的一种方式。它是一个可以记住遍历位置的对象,通过迭代器,我们可以从集合的第一个元素开始逐个访问,直到所有元素被访问完毕。迭代器有两个基本方法:iter() 和 next()。

2.1 创建迭代器

在Python中,字符串、列表或元组等对象都可以用于创建迭代器。例如:

list = [1,2,3,4]
it = iter(list)  # 创建迭代器对象

# 使用 next() 方法逐个获取元素
print(next(it))  # 输出 1
print(next(it))  # 输出 2

print("*******************")

# 使用 for 循环遍历迭代器
for x in it:
    print(x)  # 输出剩余元素 3 和 4
2.2 自定义迭代器

我们还可以通过在类中实现 iter() 和 next() 方法来创建自定义迭代器。例如,创建一个从1开始逐步递增的迭代器:

# 定义一个迭代器类
class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x

# 创建迭代器对象,输出 1 到 10
myiter = MyNumbers()
for x in myiter:
    if x > 10:  # 限制迭代次数
        break
    print(x)  
2.3 处理大型文件

使用迭代器的一个实际案例是处理大型文件。假如我们有一个包含数百万行文本的日志文件,需要逐行读取并处理。如果一次性将整个文件读入内存,可能会导致内存溢出。这时就可以使用迭代器逐行读取文件内容,例如:

with open('large_log_file.log', 'r') as file:
    for line in file:  # file对象是一个迭代器
        process_line(line)  # 处理每一行

三、生成器

生成器是一种特殊的迭代器,它允许我们使用函数来创建迭代器。生成器函数使用yield关键字来一次生成一个值。当生成器函数被调用时,它会返回一个迭代器对象,这个对象可以用于迭代生成器函数中yield出来的值。

一个常见的使用生成器的案例是斐波那契数列生成。我们可以使用生成器函数来无限生成斐波那契数列中的值,而不需要在内存中维护整个数列,如下:

# 定义斐波那契数列生成类
def fib_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b


# 创建生成类对象,生成若干个斐波那契数
fib_seq = fib_generator()
for fib_num in fib_seq:
    if fib_num > 10:  # 当斐波那契数大于10时停止生成
        break
    print(fib_num)

# 输出 0、1、1、2、3、5、8

PS:斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:0、1、1、2、3、5、8、13、21、34……

四、生成器表达式

生成器表达式是创建生成器的一种简洁方式。它类似于列表推导式,但是使用圆括号()而不是方括号[]。生成器表达式会返回一个生成器,这个生成器可以逐个生成表达式计算出的值,而不需要一次性计算出所有值。

假设我们有一个列表,我们想要筛选出其中的所有偶数并计算它们的平方。这时可以使用生成器表达式来实现如下:

# 定义一个列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 使用生成器表达式,返回一个生成器对象
even_squares = (x**2 for x in numbers if x % 2 == 0)

# 循环生成器,输出结果
for square in even_squares:
    print(square)  
    # 输出4,16,36,64,100

五、实际应用案例

5.1 数据库查询

在使用数据库时,我们经常需要处理大量的查询结果。使用生成器可以逐个获取结果,而不是一次性将全部结果加载到内存中,从而节省了大量内存。

例如:

def db_query_generator(query):
    cursor = connection.cursor()
    cursor.execute(query)
    while True:
        row = cursor.fetchone()
        if row is None:
            break
        yield row

for row in db_query_generator("SELECT * FROM large_table"):
    process_row(row)
5.2 网络数据流处理

在处理网络数据流时,如实时日志分析或流媒体数据,我们可以使用生成器逐个处理数据包,避免一次性加载整个数据流到内存中。

例如:

def stream_data_generator(url):
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        for chunk in r.iter_content(chunk_size=8192):
            yield chunk

for chunk in stream_data_generator("http://example.com/large_data"):
    process_data_chunk(chunk)

六、总结

迭代器和生成器在Python中为我们提供了高效处理数据的工具。在处理大型数据集或需要无限序列的场景中,迭代器和生成器显得尤为重要。通过实际案例的学习,我们可以看到它们在文件处理、无限序列生成以及数据转换等方面的广泛应用。掌握迭代器和生成器的使用,可以让我们写出更加高效的Python的代码。

如果您对文章中内容有疑问,欢迎在评论区进行留言,我会尽量抽时间给您回复。如果文章对您有帮助,欢迎点赞、收藏。您的点赞,是对我最大的支持和鼓励,谢谢 :-)

你可能感兴趣的:(Python编程入门,python,开发语言,python迭代器与生成器)