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

enumerate()是否产生一个生成器对象?

琴俊人
2023-03-14
问题内容

作为一个完整的Python新手,它肯定是这样。运行以下…

x = enumerate(['fee', 'fie', 'foe'])
x.next()
# Out[1]: (0, 'fee')

list(x)
# Out[2]: [(1, 'fie'), (2, 'foe')]

list(x)
# Out[3]: []

…我注意到:(a)x确实有一种next方法,这似乎是生成器所必需的,并且(b)x只能迭代一次,这是著名python标记答案中所强调的生成器的特征。

另一方面, 关于如何确定对象是否为生成器的这个问题,两个最受好评的答案似乎表明enumerate()没有 返回生成器。

import types
import inspect

x = enumerate(['fee', 'fie', 'foe'])

isinstance(x, types.GeneratorType)
# Out[4]: False

inspect.isgenerator(x)
# Out[5]: False

…虽然对该问题的第三次不良评价似乎表明实际上enumerate()
确实 返回了一个生成器:

def isgenerator(iterable):
    return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__')

isgenerator(x)
# Out[8]: True

发生什么了?是x发电机吗?从某种意义上说,它是否类似于“发电机”,而不是实际的发电机?Python对鸭子的使用是否意味着上面最后一个代码块中概述的测试实际上是最好的测试

与其继续写下我脑海中的可能性,不如将其抛给那些立即知道答案的人。


问题答案:

虽然Python文档说这enumerate功能上等同于:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1

enumerate函数返回 迭代器 ,但不返回实际生成器。help(x)创建enumerate对象后调用可以看到以下内容:

>>> x = enumerate([1,2])
>>> help(x)
class enumerate(object)
 |  enumerate(iterable[, start]) -> iterator for index, value of iterable
 |  
 |  Return an enumerate object.  iterable must be another object that supports
 |  iteration.  The enumerate object yields pairs containing a count (from
 |  start, which defaults to zero) and a value yielded by the iterable argument.
 |  enumerate is useful for obtaining an indexed list:
 |      (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
 |  
 |  Methods defined here:
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |  
 |  __iter__(...)
 |      x.__iter__() <==> iter(x)
 |  
 |  next(...)
 |      x.next() -> the next value, or raise StopIteration
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __new__ = <built-in method __new__ of type object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T

在Python中,生成器基本上是一种特定类型的迭代器,通过使用ayield从函数返回数据来实现。但是,enumerate实际上是用C而不是纯Python实现的,因此没有yield涉及。您可以在此处找到源:http
:
//hg.python.org/cpython/file/2.7/Objects/enumobject.c



 类似资料:
  • 问题内容: 在python中,如何检查对象是否为生成器对象? 试试这个- 给出错误- (我知道我可以检查对象是否具有将其用作生成器的方法,但是我想以某种方式可以确定任何对象的类型,而不仅仅是生成器。) 问题答案: 您可以从以下类型使用GeneratorType:

  • 因为我想旋转多个虚拟机,LXD似乎是一个有效的选择 但作为docker,LXD似乎没有那么活跃, 最初的想法是,我使用LXC创建了一个启动测试容器,并安装了mongodb数据库,在重新启动容器后,mongodb中的数据至少是持久的。(这里我可能错了)和lxc容器交互就像登录到物理服务器一样简单。 有谁能提到LXD的优点、缺点和痛苦之处,就像本文提到的使用docker的个人体验一样? 喜欢回答的问题

  • 我正在编写一个通用组件,该组件封装了一个生成器并执行常规操作: 按键筛选 转换值 等等 为了尽可能接近地模拟包装生成器,如果生成器使用引用,我想使用引用。 当我尝试使用 构造的情况下迭代生成器对引用完全不起作用:

  • 我正在编写一个通用组件,该组件封装了一个生成器并执行常规操作: 按键筛选 转换值 等等 为了尽可能接近地模拟包装生成器,如果生成器使用引用,我想使用引用。 当我尝试使用 构造的情况下迭代生成器对引用完全不起作用:

  • 问题内容: 目前,我正在这样做: 但是我想要一个可以放在简单语句中的表达式。是否有内置的东西可以使这段代码显得不太笨拙? 如果iterable为空,则返回,但如果不是,则可能会遍历所有项目。我只需要检查第一项即可。 有人问我要做什么。我编写了一个函数,该函数执行SQL查询并产生其结果。有时,当我调用此函数时,我只是想知道查询是否返回了任何内容,并据此做出决定。 问题答案: 如果为True,则不会超

  • 问题内容: 这可能是一个愚蠢的问题,但是我还是会问。我有一个生成器对象: 我可以测量它的大小: 据说发电机会被消耗掉: …但保持不变。 使用字符串可以按我的预期工作: 如果有人能启发我,我将不胜感激。 问题答案: 不按照您的想法去做。该方法返回给定对象的内部大小(以字节为单位),而不是生成器将要返回的项目数。 Python无法事先知道生成器的大小。以下面的无限生成器为例(例如,有更好的方法来创建计