18.从入门到精通:Python迭代器与生成器 迭代器 创建一个迭代器 StopIteration 生成器

简介: 18.从入门到精通:Python迭代器与生成器 迭代器 创建一个迭代器 StopIteration 生成器

Python迭代器与生成器


迭代器

在Python中,迭代器是一种用于遍历可迭代对象(如列表、元组、字典、集合等)的对象。迭代器是一种惰性计算的方式,即只有在需要时才会计算下一个元素,这样可以节省内存空间并提高效率。迭代器对象可以使用内置函数iter()来创建,可以使用内置函数next()来获取下一个元素。

下面是一个使用迭代器的例子:

nums = [1, 2, 3, 4, 5]
it = iter(nums)
print(next(it))  # 输出1
print(next(it))  # 输出2
print(next(it))  # 输出3

在这个例子中,我们首先创建了一个列表nums,然后使用iter()函数将其转换为迭代器对象it。接着,我们使用next()函数获取迭代器it的下一个元素,依次输出1、2、3。


需要注意的是,当迭代器遍历到最后一个元素后,再次使用next()函数会抛出StopIteration异常。因此,在使用迭代器遍历时,通常会使用for循环来避免这个问题,例如:

nums = [1, 2, 3, 4, 5]
for num in nums:
    print(num)

在这个例子中,我们使用for循环遍历列表nums,每次迭代都会自动调用next()函数获取下一个元素,直到遍历完所有元素为止。
除了使用for循环外,还可以使用while循环和try-except语句来遍历迭代器,例如:

nums = [1, 2, 3, 4, 5]
it = iter(nums)
while True:
    try:
        num = next(it)
        print(num)
    except StopIteration:
        break

在这个例子中,我们使用while循环和try-except语句遍历迭代器it,每次迭代都会尝试获取下一个元素,直到遍历完所有元素为止。当遍历到最后一个元素后,会抛出StopIteration异常,我们使用break语句跳出循环。


创建一个迭代器

在Python中,我们可以通过定义一个类来创建一个迭代器。该类需要实现两个方法:iter()和__next__()。

  • iter()方法返回迭代器对象本身。在Python中,任何实现了__iter__()方法的对象都是可迭代的。
  • next()方法返回迭代器中的下一个值。如果没有下一个值,它应该引发一个StopIteration异常。

以下是一个示例,展示如何创建一个迭代器,它可以生成从1到5的整数:

class MyIterator:
    def __init__(self):
        self.current = 1
    def __iter__(self):
        return self
    def __next__(self):
        if self.current > 5:
            raise StopIteration
        else:
            value = self.current
            self.current += 1
            return value
# 使用迭代器
it = MyIterator()
for i in it:
    print(i)

输出结果为:

1
2
3
4
5

1.在这个示例中,我们定义了一个名为MyIterator的类,它实现了__iter__()和__next__()方法。在__init__()方法中,我们初始化了迭代器的起始值为1。

2.在__iter__()方法中,我们返回迭代器对象本身。在__next__()方法中,我们检查当前值是否大于5。如果是,我们引发StopIteration异常,否则我们返回当前值并将迭代器的当前值加1。

3.最后,我们创建了一个迭代器对象it,并使用for循环来遍历它。在每次迭代中,我们使用print()函数打印出迭代器中的下一个值。


StopIteration

StopIteration是Python内置异常之一,用于表示迭代器已经到达末尾,无法再返回下一个元素。当使用next()函数获取迭代器的下一个元素时,如果迭代器已经到达末尾,就会抛出StopIteration异常。例如:

nums = [1, 2, 3]
it = iter(nums)
print(next(it))  # 输出1
print(next(it))  # 输出2
print(next(it))  # 输出3
print(next(it))  # 抛出StopIteration异常

在这个例子中,我们首先创建了一个列表nums,并使用iter()函数将其转换为迭代器对象it。接着,我们使用next()函数获取迭代器it的下一个元素,依次输出1、2、3。当再次使用next()函数获取下一个元素时,由于迭代器已经到达末尾,就会抛出StopIteration异常。

在使用迭代器时,通常会使用for循环来避免StopIteration异常的出现。例如:

nums = [1, 2, 3]
for num in nums:
    print(num)

在这个例子中,我们使用for循环遍历列表nums,每次迭代都会自动调用next()函数获取下一个元素,直到遍历完所有元素为止。由于for循环会自动处理StopIteration异常,所以我们不需要担心它的出现。


生成器

在Python中,生成器(generator)是一种特殊的迭代器,它可以在需要时生成值,而不是提前生成所有值并将它们存储在内存中。这使得生成器非常适合处理大量数据或无限序列。

生成器可以通过函数来创建。我们可以使用关键字yield来定义一个生成器函数,它可以在需要时生成值,并可以在下一次调用时从上一次离开的地方继续执行。

以下是一个示例,展示如何使用生成器函数来生成从1到5的整数:

def my_generator():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5
# 使用生成器
gen = my_generator()
for i in gen:
    print(i)

输出结果为:

1
2
3
4
5

在这个示例中,我们定义了一个名为my_generator的生成器函数,它使用yield关键字来生成从1到5的整数。在每次调用生成器函数时,它会生成一个值并暂停执行,直到下一次调用时从上一次离开的地方继续执行。

我们创建了一个生成器对象gen,并使用for循环来遍历它。在每次迭代中,我们使用print()函数打印出生成器中的下一个值。


生成器可以帮助我们在处理大量数据或无限序列时节省内存空间,并可以帮助我们编写更加简洁和优雅的代码。


相关文章
|
1天前
|
数据可视化 API Python
Python零基础“圣经”!300W小白从入门到精通首选!
今天分享的这本书在让你尽快学会 Python基础知识的同时,能够编写并正确的运行程序(游戏、数据可视化、Web应用程序) 最大的特色在于,在为初学者构建完整的 Python 语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是 后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽 又面面俱到。相信这本书能够得到更多 Python 初学者的喜爱。
|
2天前
|
Python
小白入门必备!计科教授的Python精要参考PDF开放下载!
随着互联网产业的高速发展,在网络上早已积累了极其丰富的Python学习资料,任何人都可以基于这些资源,自学掌握 Python。 但实际上,网络上充斥的资源太多、太杂且不成体系,在没有足够的编程/工程经验之前,仅靠“看”线上资源自学,的确是一件非常困难的事。
|
2天前
|
数据可视化 API Python
豆瓣评分9.4!堪称经典的Python入门圣经,你还没看过吗?
最理想的新人入门书应该满足两个特点:第一就是内容通俗易懂;第二就是要有实战,能够让读者在学完之后知道具体怎么用。 今天给小伙伴们分享的这份Python入门手册,在为初学者构建完整的Python语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽又面面俱到。
|
4天前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点)
|
5天前
|
数据采集 SQL 数据可视化
使用Python和Pandas库进行数据分析的入门指南
使用Python和Pandas库进行数据分析的入门指南
68 0
|
5天前
|
Linux iOS开发 MacOS
Python入门指南
Python入门指南
26 0
|
5天前
|
数据采集 前端开发 JavaScript
Python爬虫入门
网络爬虫是自动抓取网页数据的程序,通过URL获取网页源代码并用正则表达式提取所需信息。反爬机制是网站为防止爬取数据设置的障碍,而反反爬是对这些机制的对策。`robots.txt`文件规定了网站可爬取的数据。基础爬虫示例使用Python的`urllib.request`模块。HTTP协议涉及请求和响应,包括状态码、头部和主体。`Requests`模块是Python中常用的HTTP库,能方便地进行GET和POST请求。POST请求常用于隐式提交表单数据,适用于需要发送复杂数据的情况。
15 1
|
8天前
|
存储 数据处理 索引
Python生成器:深入理解与应用
Python生成器:深入理解与应用
|
9天前
|
机器学习/深度学习 人工智能 数据可视化
Python编程入门:从零开始探索编程的奇妙世界
这篇教程引导初学者入门Python编程,从安装Python开始,逐步讲解基本语法,如`print()`、变量、条件判断、循环以及自定义函数。文章强调了Python在数据处理、数据分析、人工智能和机器学习等领域的重要性,并鼓励学习者探索Python的广泛应用,开启编程之旅。
|
10天前
|
数据可视化 API Python
Python零基础“圣经”!300W小白从入门到精通首选!
今天分享的这本书在让你尽快学会 Python基础知识的同时,能够编写并正确的运行程序(游戏、数据可视化、Web应用程序) 最大的特色在于,在为初学者构建完整的 Python 语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是 后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽 又面面俱到。相信这本书能够得到更多 Python 初学者的喜爱。