迹忆客 专注技术分享

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

Python 生成器类

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

本篇文章将讨论使用 yield 语句和 next() 函数在 Python 中创建生成器类。

要了解生成器,我们首先需要了解下面讨论的迭代器。


Python 迭代器

迭代器是用于逐个访问容器中元素的对象。 我们可以使用 for 语句循环遍历容器对象以单独获取值。

示例代码如下所示。

for element in [5, 6, 7]:
    print(element)

在上面的 Python 代码中,我们遍历元素列表并一个一个地打印它们。 让我们了解幕后发生的事情。

for 语句调用给定容器对象的 iter() 函数,该函数包含一个方法 __next__(),它将逐一访问给定容器对象的每个元素。

__next__() 函数引发异常 StopIteration 时,循环将终止,并且仅当给定容器对象内不再存在元素时才会引发异常。

Python 还提供了内置函数 next() ,可用于调用 __next__() 函数。 要在容器对象上使用 next() 函数,我们必须使用 iter() 函数创建一个对象。

例如,让我们使用一个数字列表并调用 next() 函数来逐个获取列表中的每个元素。 请参阅下面的代码和输出。

My_list = [5,6,7]
iter_object = iter(My_list)
print(next(iter_object))
print(next(iter_object))
print(next(iter_object))
print(next(iter_object))

输出:

5
6
7
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-10-aa02bcda701b> in <module>
      4 print(next(iter_object))
      5 print(next(iter_object))
----> 6 print(next(iter_object))

StopIteration:

在上面的代码中,我们调用了 next() 函数四次,分别返回给定列表对象中的三个元素。 当我们第四次调用它时,它返回了 StopIteration 异常,因为列表对象中不再存在元素。

我们还可以使用循环调用 next() 函数。

使用 try-except 语句,我们可以避免错误并使用异常名称来终止循环。 例如,让我们使用循环和 try-except 语句重复上面的代码。

请参阅下面的代码和输出。

My_list = [5,6,7]
iter_object = iter(My_list)

for i in range(len(My_list)):
    try:
        print(next(iter_object))
    except StopIteration:
        break

输出:

5
6
7

在上面的代码中,我们使用异常的名称 StopIteration 来中断循环。 上面的迭代器是按照前向顺序一个一个返回值的,但是我们也可以定义自己的迭代器,它会按照我们的要求返回值。

我们必须定义三个函数,__init__()__iter__()__next__(),以将迭代器行为添加到类中。 例如,让我们创建一个返回斐波那契数列的类。

看下面的代码

class Fibexample:
    def __init__(self):
        self.x, self.y = 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        r_value = self.x
        self.x, self.y = self.y, self.x+self.y
        return r_value

fib = Fibexample()
for i in range(7):
    print(next(fib))

输出:

0
1
1
2
3
5
8

每当调用 next() 函数时,上述类将返回斐波那契数列中的一个数字。 在上面的代码中,我们七次调用了 next() 函数,返回了斐波那契数列的前七个数字。


Python 生成器类

在 Python 中,生成器用于创建迭代器。 它们与常规功能相同; 唯一的区别是使用 yield 语句而不是 return 语句。

yield() 语句将调用 next() 函数,该函数返回一个迭代器对象。 例如,让我们创建一个生成器函数,它返回与上述代码相同的斐波那契数列。

请参阅下面的代码和输出。

def fibexample(data_input):
    x ,y = 0,1
    for index in range(data_input):
        z = x
        x, y = y, x+y
        yield z

obj = fibexample(7)
for i in obj:
    print(i)

输出:

0
1
1
2
3
5
8

在上面的代码中,fibexample() 函数将在迭代器对象中返回所需的斐波那契数列数。 我们可以使用循环遍历对象以获取迭代器对象中存在的每个值。

生成器会记住数据值和 next() 函数的最后一次执行,并会在再次调用 next() 函数时从中断处恢复。

上述函数的结果与我们在迭代器示例中得到的结果相同,但是与我们在迭代器示例中使用的代码相比,上述代码相对较短。 使用生成器的好处是会自动创建 __iter__()__next__() 函数,并且生成器还会处理 StopIteration 异常。

因此,使用生成器编写迭代器很容易,因为使用生成器创建迭代器就像使用 yield 语句编写一个简单的函数。

上一篇:在 Python 中实现多个装饰器

下一篇:没有了

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

本文地址:

相关文章

在 Python 中实现多个装饰器

发布时间:2023/06/17 浏览次数:95 分类:Python

本文重点介绍多个装饰器的概念。 读者将学习装饰器的基础知识,它是如何创建和实现的,以及如何将它与其他装饰器链接到一个函数上。

使用 Python 装饰器重试代码块

发布时间:2023/06/17 浏览次数:94 分类:Python

在这种情况下,修改会在给定情况下多次重试函数,其返回值可能与我们想要的不同。@retry 装饰器的重要性 我们可以使用装饰器来扩展特定函数的行为,我们可以轻松地创建装饰器来修改该函

Python 装饰器顺序

发布时间:2023/06/17 浏览次数:192 分类:Python

在这篇 Python 文章中,我们将了解什么是装饰器、它们的使用方式以及我们如何利用它们来构建代码。 我们将看到装饰器是如何成为一种强大的工具,可以用来为我们的应用程序添加功能,并且

Python 中的 super参数

发布时间:2023/06/17 浏览次数:158 分类:Python

本文的主题是正确使用 Python 超级参数。 我们还将了解超和继承的概念、使用超参数的适当代码示例以及基类的概念。Python 中的 super 参数 在 Python 中,super 调用另一个类的方法。

将 Kwargs 传递给 Python 中的另一个函数

发布时间:2023/06/17 浏览次数:128 分类:Python

Python 将 kwargs 参数表示为关键字参数,可以在参数名称前使用两个星号传递参数数量。 通过这篇文章,我们寻找 Python 如何将 kwargs 传递给另一个函数。

在 Python 中打印度数符号

发布时间:2023/06/17 浏览次数:191 分类:Python

本篇文章将介绍如何用 Python 编写度数符号。度数符号是表示特定区域温度的符号。 例如,假设卡纳塔克邦的气温为 34 摄氏度; 它表明,在印度卡纳塔克邦,温度为 34 度

Python 中的 @ 符号

发布时间:2023/06/17 浏览次数:138 分类:Python

Python 中 @ 符号最常见的用例是装饰器。 装饰器允许您更改函数或类的行为。@ 符号也可以用作数学运算符,因为它可以在 Python 中乘以矩阵。 本教程将教您使用 Python 的 @ 符号。

Python 堆排序

发布时间:2023/06/17 浏览次数:184 分类:Python

本篇文章将介绍堆排序算法在 Python 中的实现。Python中的堆排序算法 堆排序是一种强大的算法,用于在 Python 中对数组和列表进行排序。 它很受欢迎,因为它非常快,并且不像合并排序和快速排

Python 拓扑排序

发布时间:2023/06/17 浏览次数:102 分类:Python

本篇文章将介绍拓扑排序算法在 Python 中的实现。Python 中的拓扑排序算法 拓扑排序算法对有向无环图 (DAG) 进行排序。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便