当前位置: 首页 > 面试题库 >

Python空生成器函数

田巴英
2023-03-14
问题内容

在python中,可以通过将yield关键字放在函数主体中来轻松定义迭代器函数,例如:

def gen():
    for i in range(100):
        yield i

我如何定义不产生任何值的生成器函数(生成0个值),以下代码不起作用,因为python无法知道它应该是生成器而不是普通函数:

def empty():
    pass

我可以做类似的事情

def empty():
    if False:
        yield None

但这将是非常丑陋的。有什么好的方法可以实现空的迭代器功能?


问题答案:

您可以return在生成器中使用一次;它会停止迭代而不会产生任何结果,因此提供了一种使函数超出范围的明确选择。因此,用于yield将函数转换为生成器,但在return产生任何内容之前先终止该生成器。

>>> def f():
...     return
...     yield
... 
>>> list(f())
[]

我不确定这是否比您拥有的要好得多-它只是将无操作if语句替换为无操作yield语句。但这更惯用了。请注意,仅使用yield不起作用。

>>> def f():
...     yield
... 
>>> list(f())
[None]

为什么不只是使用iter(())

这个问题专门询问一个空的 生成器函数 。因此,我将其视为关于Python语法的内部一致性的问题,而不是一般而言有关创建空迭代器的最佳方法的问题。

如果问题实际上是关于创建一个空迭代器的最佳方法,那么您可能同意Zectbumo关于使用它的iter(())替代方法。但是,请务必注意iter(())不要返回函数!它直接返回一个空的Iterable。假设您正在使用一个期望可调用的API,该API在每次调用时都会
返回 一个可迭代对象,就像普通的生成器函数一样。您将必须执行以下操作:

def empty():
    return iter(())

现在,您可能会发现上面的内容更加清晰,但是我可以想象一下情况不太清楚的情况。考虑以下(伪造的)生成器函数定义列表的示例:

def zeros():
    while True:
        yield 0

def ones():
    while True:
        yield 1

...

在那长列表的末尾,我宁愿看到其中包含yield的内容,如下所示:

def empty():
    return
    yield

或者,在Python
3.3及更高版本中(如DSM所建议的那样):

def empty():
    yield from ()

对存在yield关键字清楚地在最短的一瞥,这只是另一个发生器功能,所有其他的一模一样。要花更多的时间才能看到iter(())版本正在执行相同的操作。

这是一个细微的差异,但是老实说,我认为yield基于功能的函数更具可读性和可维护性。

另请参阅user3840170的一个很好的答案,该答案dis用来显示此方法可取的另一个原因:编译时它发出最少的指令。



 类似资料:
  • 前面章节中,已经详细介绍了什么是迭代器。生成器本质上也是迭代器,不过它比较特殊。 以 list 容器为例,在使用该容器迭代一组数据时,必须事先将所有数据存储到容器中,才能开始迭代;而生成器却不同,它可以实现在迭代的同时生成元素。 也就是说,对于可以用某种算法推算得到的多个数据,生成器并不会一次性生成它们,而是什么时候需要,才什么时候生成。 不仅如此,生成器的创建方式也比迭代器简单很多,大体分为以下

  • 问题内容: 我正在寻找一个易于实现的python html生成器。我找到了这个 但是无法为表添加CSS元素(ID,类)。 谢谢 问题答案: 如果您希望通过程序生成而不是模板生成,那么Karrigell的HTMLTags模块是一种可能。它可以通过大写其首字母的技巧(例如,引用我刚刚给出的doc URL)来包括例如属性(在Python中为保留字)。 与Python关键字(类,类型)同名的属性必须大写:

  • 本文向大家介绍Python函数生成器原理及使用详解,包括了Python函数生成器原理及使用详解的使用技巧和注意事项,需要的朋友参考一下 1.python函数运行原理 python中函数的调用就是创建栈帧的过程,而这些创建的栈帧都是存放在堆上面,不释放就永久存在,所以我们拿到每个函数对应的栈帧,就可以调用这个函数. java就不行了,函数执行完毕,直接弹栈完蛋. 2.生成器执行原理 测试代码 看看测

  • 本文向大家介绍深入理解python函数递归和生成器,包括了深入理解python函数递归和生成器的使用技巧和注意事项,需要的朋友参考一下 一、什么是递归 如果函数包含了对其自身的调用,该函数就是递归的。递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代

  • 问题内容: 我开始学习Python,并且遇到过生成器函数,这些函数中包含yield语句。我想知道这些功能确实可以解决哪些类型的问题。 问题答案: 生成器为您提供懒惰的评估。您可以通过遍历它们来使用它们,可以显式地使用“ for”,也可以隐式地将其传递给任何迭代的函数或构造。您可以将生成器视为返回多个项目,就像它们返回一个列表一样,但是与其一次一次返回它们而不是一次全部返回它们,而是将生成器功能暂停

  • 本文向大家介绍Python生成器(Generator)详解,包括了Python生成器(Generator)详解的使用技巧和注意事项,需要的朋友参考一下 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以