迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 自定义迭代器

作者:迹忆客 最近更新:2023/06/26 浏览次数:

在本文中,我们将了解什么是迭代器以及如何借助 __iter____next__ 类方法创建自定义迭代器。 我们还将学习如何在 Python 生成器的帮助下创建自定义迭代器。


借助 Python 中的类方法 __iter____next__ 创建自定义迭代器

现在,当您说迭代器时,顾名思义,它将用于迭代。

如果您来自 C、C++ 和 Java 等语言,我们有一个共同的概念:++。 当我们谈论迭代时,还知道了一个概念:for 循环。

假设我们有一个包含 5 个元素的列表。 使用循环,我们可以从第一个元素迭代到最后一个元素。

这样,我们就有了一个包含一些值的列表,如果我们想使用索引号一一打印它们。

如果我们传递索引 0,它将为我们提供第一个元素 2。如果我们使用索引值 1,它将为我们提供第二个元素 5。

Numbers=[2,5,10,3,1]

print(Numbers[0])
print(Numbers[1])

输出:

2
5

打印值的另一种方法是使用循环。 我们可以迭代列表并打印所有值。

Numbers=[2,5,10,3,1]

for i in Numbers:
    print(i)

输出:

2
5
10
3
1

现在我们还有另一种方法:使用迭代器。 一般来说,迭代器在 for 循环的幕后工作。

我们将使用 iter() 函数来理解迭代器,它将我们的列表转换为迭代器。 这个迭代器不会给我们所有的值; 它一次只会给出一个值。

Numbers=[2,5,10,3,1]

ITR=iter(Numbers)
print(ITR)

我们可以看到它正在打印迭代器的对象。

<list_iterator object at 0x000001FEDCFF7310>

但是,如果您想要该值,可以设置 ITR.__next__(),这是一个内置方法。 它将在第一次调用特定对象的 __next__() 方法时为我们提供第一个值; 这与我们使用索引值的方式相同,但优点是我们不必使用索引值。

umbers=[2,5,10,3,1]

ITR=iter(Numbers)
print(ITR.__next__())

输出:

2

当我们在下一个执行行执行 ITR.__next__() 时,它将给出下一个值。 在这一场景的背后,迭代器将有多个值,因此当我们调用 __next__() 方法时,它将获取一个值。

同样,当我们调用 __next__() 时,它知道 i 的最后一个值,这意味着它将保留最后一个值的状态。 这就是迭代器的美妙之处; 当我们再次调用该函数时,它将保留旧值。

我们可以使用类创建迭代器。 使用该类,我们可以单独打印前 10 个值。

为了实现这一点,我们将有一个名为 TopValues 的类,在这个类中,我们将指定一个计数器。

为此,我们将使用 __init__ 函数,在其中定义计数器变量 self.N=1; 显然,计数器将从 1 开始初始化。我们需要两个重要的方法来创建自定义迭代器。

第一个是 iter() 方法,它将为我们提供迭代器的对象,然后 next() 方法将提供下一个值或对象。 在 __next__ 方法中,我们不返回 self.N,而是使用一个名为 VALUE 的变量,在其中分配 self.N,并在下一行中将 self.N 加一。

这样它将在每次下一次迭代中递增,然后返回 VALUE 而不是 self.N,因为 self.N 在下一次迭代中递增。

class TopValues:
    def __init__(self):
        self.N=1

    def __iter__(self):
        return self
    def __next__(self):
        VALUE=self.N
        self.N+=1
        return VALUE

我们的迭代器现在已准备就绪,以便我们可以创建 TopValues 类的对象。 让我们使用循环,因为通常当你有迭代器时,我们可以使用循环。

T_Val=TopValues()

for i in T_Val:
    print(i)

现在,当我们执行这段代码时,我们会得到数千个值。

1
2
3
4
5
....
1000

让我们尝试了解发生了什么。 要检查迭代器是否正常工作,我们将使用 __next__()

print(T_Val.__next__())

该行将打印第一个迭代值 1,但是循环出了什么问题? 问题是循环将从头到尾进行; 我们假设终点是 10,但我们没有提到应该在哪里停止。

当我们使用循环时,它会调用 next() 函数,这就是它的工作原理。 for循环内部使用 next() 函数; 因此,它会一次又一次地调用这个 next() 函数。

我们必须在 __next__ 方法中应用一个条件。

我们还必须设置 else 块; 在这个块中,我们将引发一个异常。 否则,在打印 10 个值后,循环将打印 None 值。

class TopValues:
    def __init__(self):
        self.N=1

    def __iter__(self):
        return self
    def __next__(self):
        if self.N<=10:
            VALUE=self.N
            self.N+=1
            return VALUE
        else:
            raise StopIteration


T_Val=TopValues()

for i in T_Val:
    print(i)

输出:

1
2
3
4
5
6
7
8
9
10

在 Python 生成器的帮助下创建自定义迭代器

现在让我们尝试创建一个执行相同操作的生成器函数。 生成器要简单得多,因为它们为我们处理 __iter__()__next__() 方法。

如果我们尝试编写一个名为 Our_Gen() 的生成器函数,我们将在该函数内传递参数。

由于我们循环遍历列表,因此我们一次生成一项。 而且,当没有更多的项目可以循环时,它将自动处理该问题并引发停止迭代的异常。

现在我们正在循环 Our_Gen() 函数,因此它应该一次打印一项。 如果我们运行它,我们可以看到我们一次得到一个。

def Our_Gen(n_list):
    for i in n_list:
        yield i

Func=Our_Gen([2,5,10,3,1])

for i in Func:
    print(i)

输出:

2
5
10
3
1

确保我们的 next() 函数仍然有效。 执行后,我们得到五个元素,我们得到一个停止迭代异常。

def Our_Gen(n_list):
    for i in n_list:
        yield i

Func=Our_Gen([2,5,10,3,1])

print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())

输出:

2
5
10
3
1
Traceback (most recent call last):
  File "c:\Users\Dell\Desktop\demo\demo.py", line 56, in <module>
    print(Func.__next__())
StopIteration

生成器比类更容易编写。 但根据您的用例,您可能需要知道如何在类中执行 __iter__() 方法和 __next__() 方法。

上一篇:Python 高斯核

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 高斯核

发布时间:2023/06/26 浏览次数:161 分类:Python

高斯核是一种高通滤波器,是图像处理中最常用的滤波器之一。 它也用于机器学习。 本博客将介绍该内核以及如何使用它。

Python 脚本中的 FFmpeg

发布时间:2023/06/26 浏览次数:167 分类:Python

本篇文章将介绍在Python中使用FFMPEG命令。安装 FFmpeg Python 包 首先,您必须在系统上安装 FFmpeg。 以管理员身份打开命令提示符并运行以下命令以使用 choco 安装 FFmpeg。

Python 中的 DNS 查找

发布时间:2023/06/25 浏览次数:118 分类:Python

本文将讨论 DNS 和 DNS 查找的概念。 之后,我们讨论使用 Python 进行 DNS 查找的方法。什么是 DNS DNS(域名系统)将域名转换为公共IP地址。

了解 Python 中的槽

发布时间:2023/06/25 浏览次数:167 分类:Python

本文将讨论槽常量变量在 Python 中的工作原理以及它如何比使用字典更好。了解 Python 中的槽

在 Python 中设置 HTTP 代理设置

发布时间:2023/06/25 浏览次数:141 分类:Python

在本文中,我们将讨论如何在我们的计算机和Python中设置HTTP代理设置。使用export命令在Python中设置HTTP代理设置

Pipenv 指定Python版本

发布时间:2023/06/25 浏览次数:88 分类:Python

本文讨论了使用 Pipenv 创建具有特定 Python 版本的虚拟环境的几种方法。 我们将列出先决条件并解释如何使用 pipelinev 所需的命令在虚拟环境中安装特定版本的 Python。

Python 验证 IP 地址

发布时间:2023/06/25 浏览次数:66 分类:Python

冒号分隔组 (:)。 在本指南中,我们将验证 IPv4 地址。在 Python 中验证 IP 地址验证IP地址意味着检查输入的IP是否有效。

Python 中的随机 IP 地址生成器

发布时间:2023/06/22 浏览次数:56 分类:Python

Python 提供了多个可用于打印随机 IP 地址的模块。 本教程将教您在 Python 中以字符串形式生成随机 IP 地址。使用 Faker 模块在 Python 中生成随机 IP 地址作为字符串

在 Python 中运行单元测试

发布时间:2023/06/22 浏览次数:139 分类:Python

在称为单元测试的软件开发过程中,检查应用程序中较小的、可独立测试的组件(称为单元)的功能。 Python unittest 模块允许我们运行单元测试。本文将讨论单元测试以及如何在 Python 中进行测

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便