首页 > 编程语言 >Python 迭代器与生成器

Python 迭代器与生成器

时间:2024-06-19 19:31:29浏览次数:13  
标签:__ 迭代 Python self 生成器 next 对象

迭代器

迭代器(Iterator)是一个可以记住遍历的位置的对象,该对象包含值的可计数数字,在Python当中:迭代器是实现迭代器协议的对象,它包含方法__iter__() 和 __next__()

__iter__()方法

  • 作用:返回迭代器对象本身

__next__()方法

  • 作用:返回迭代器的下一个元素,如果没有元素了则就会触发StopIteration异常

可迭代对象

如果一个对象/类中,有__iter__()方法并且返回一个迭代器对象,则我们称以这个对象/类创建的对象为可迭代对象。

列表、元组、字典、集合都可以是可迭代的对象。它们都是可迭代的容器,可以从中获取到迭代器

 可以通过dir函数可以列出对象方法

My_list = [1, 2, 3, 4, 5]
a = dir(My_list)
print(a)

实例

My_list = [1, 2, 3, 4, 5]
it = iter(My_list)  # 创建迭代器的对象
print(next(it))  # 输出迭代器的下一个对象
print(next(it))

遍历可迭代对象

我们可以使用for循环来遍历可迭代的对象

my_count = ("one", "tow", "three")

for i in my_count:
  print(i)

创建迭代器

要把对象或者类创建成为迭代器,必须为对象实现__iter__() 方法 和  __next__() 方法

在面向对象编程中类都有一个构造函数,Python的构造函数为__init__(),它会在对象进行初始化的时候执行。

__iter__()方法返回一个特殊的迭代器对象,这个迭代器对象实现了__next__()方法,可以执行操作,但必须返回迭代器对象本身

__next__()方法会返回下一个迭代器对象

实例

class AddOneIterator:
    def __init__(self, start=0):
        self.current = start  # 初始化起始值

    def __iter__(self):
        return self

    def __next__(self):
        self.current += 1
        return self.current
# 创建一个加1的迭代器,从0开始
iterator = AddOneIterator()

# 使用迭代器获取前几个加1后的值
print(next(iterator))  # 输出:1
print(next(iterator))  # 输出:2
print(next(iterator))  # 输出:3
print(next(iterator))  # 输出:4

StopIteration

当我们执行上面代码的时候,可以发现如果有足够的next,或者我们在for循环里面使用,则上面的实例将会一直执行下去。

所以为了防止迭代永远进行,我们可以使用 StopIteration 语句

实例:在next()方法中,我们可以添加一个终止的条件来引发错误

class AddOneIterator:
    def __init__(self, start=0):
        self.current = start  # 初始化起始值

    def __iter__(self):
        return self

    def __next__(self):
        if self.current <= 10:  # 添加一个if语句
            x = self.current
            self.current += 1
            return x
        else:  # 当大于10的时候终止程序
            raise StopIteration

# 创建一个加1的迭代器,从0开始
iterator = AddOneIterator()

for i in iterator:
    print(i)
输出结果: 1 2 3 4 5 6 7 8 9 10

使用迭代器的好处

  • 节省内存:迭代器允许按需要来生成数据,而不是一次性的将所有数据都加载到内存当中,这对于处理大型数据集非常有效
  • 延迟计算:可以在需要的时候按照需要计算下一个元素,而不是提前计算所有的元素

生成器

生成器是一种特殊的迭代器,它用于创建迭代器

生成器允许你逐个产生值,而不是一次性创建并存储所有值

生成器通过在函数中使用 yield 语句来实现。yield是一个关键字,用于定义生成器函数每次调用生成器函数时,它都会返回一个生成器对象,这个对象可以记住函数执行的位置

当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。

然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果

实例

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
for value in gen:
    print(value)
输出结果:1 2 3

实例

def count():
    for i in range(1, 6):  # range的结束索引是不包含的,所以使用6
        yield i

# 使用生成器
c = count()

for number in c:
    print(number)
输出结果:1 2 3 4 5

下面实例为使用yield实现斐波那契数列

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()
输出结果:0 1 1 2 3 5 8 13 21 34 55

使用生成器的好处

  • 节省内存:因为生成器不需要一次性存储所有值
  • 延迟计算:只有在需要时才计算下一个值

迭代器与生成器的区别

  • 内存使用:生成器通常比迭代器更节省内存,因为它们是按需生成值的。
  • 可迭代性:所有生成器都是迭代器,但不是所有迭代器都是生成器。例如,列表是一个迭代器,但不是生成器。
  • 一次性:迭代器可以多次遍历,而生成器在遍历完成后就不能再次使用了,除非你重新创建它。

生成器提供了一种优雅的方式来处理数据流,特别是当数据集很大或者数据是按需生成的时候。而迭代器则提供了一种通用的方式来遍历任何可迭代对象。

标签:__,迭代,Python,self,生成器,next,对象
From: https://blog.csdn.net/m0_74995879/article/details/139810414

相关文章

  • 【任务分配】基于粒子群算法多无人机任务分配附python代码
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • Python武器库 - 科研中常用的python图像操作 - 图像显示
    应用场景:在科研中,使用python(opencv)对图像进行操作后,通常需要实时查看操作结果并实施调整,而每次都在文件夹中打开查看是很麻烦的,这就需要我们能够直接通过代码对图像进行可视化展示。这里主要用到cv2中的**imshow(),waitKey()和destroyWindow()/destroyAllWindows()**函数,......
  • Python 遍历文件每一行判断是否只有一个换行符详解
    前言在文件处理过程中,判断文件每一行是否只有一个换行符是一个常见需求。作为测试工程师,我们经常需要对文件的格式进行验证,确保数据的完整性和规范性。本文将详细介绍如何使用Python遍历文件的每一行,并判断每一行是否只有一个换行符。需求分析我们需要编写一个Python程序,......
  • Python 抽奖程序限定次数详解
    前言在开发抽奖程序时,限定用户的抽奖次数是一个常见需求。Python提供了灵活的工具和数据结构,可以轻松实现这个功能。本文将详细介绍如何编写一个限定抽奖次数的Python程序,包括设置抽奖次数限制、记录用户抽奖次数以及实现抽奖逻辑。需求分析我们需要一个抽奖程序,该程序可以......
  • 24年新版!这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来
     前⾔微软在UserVoice上运营着⼀个反馈论坛,每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将Python作为Excel的⼀门脚本语⾔”,其得票数差不多是第⼆名的两倍。尽管⾃2015年这个点⼦发布以来并没有什么实质性进展,但在2020年年末,Python之⽗Guidov......
  • python学习3
    所花时间(包括上课): 2h代码量(行): 150左右搏客量(篇): 1了解到的知识点:python备注(其他): 破解百度翻译importrequestsimportjsonif__name__=='__main__':#UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器header......
  • Python最常见的语句、函数,想学好Python必须要懂得!
    1.函数的概念概念写了一段代码实现了某个小功能;然后把这些代码集中到一块,起一个名字,下一次就可以根据这个名字再次使用这个代码,这就是函数。作用方便代码的重复使用。分解任务,简化程序逻辑使代码更加模块化函数分类内建函数三方函数自定义函数2.函数的基本使用简单定......
  • 【Python背记手册】强烈建议!所有Python基础差的同学,死磕这本64页的背记手册!!
    写在前面在数字化飞速发展的今天,掌握一门编程语言成为了许多人的追求。而Python,以其简洁易读、功能强大的特点,成为了编程初学者和资深开发者都青睐的首选。然而,面对众多的学习资源,如何高效、系统地学习Python,成为了许多人面临的难题。今天,我要向大家推荐一本神奇的书籍——《P......
  • 深入理解Python类中的各种方法,非常实用!
    本文将详细介绍Python类中的各种方法,包括实例方法、类方法、静态方法、特殊方法等,并通过示例展示它们的用法和区别。1.实例方法(InstanceMethods)实例方法是最常见的方法,其第一个参数总是self,指向当前实例。实例方法用于操作实例数据和属性。python复制代码classMy......
  • Python 3 list sort All In One
    Python3listsortAllInOnePythonsortfunctionListsortlist.sort(key=None,reverse=False)sort()函数用于对原列表进行排序,如果指定参数,则使用指定的比较函数进行比较。key:主要是用来指定进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,......