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

发电机输出的长度

公冶子安
2023-03-14
问题内容

Python提供了一种很好的方法来获取渴望的迭代的长度len(x)。但是对于以生成器理解和函数表示的惰性可迭代对象,我找不到类似的东西。当然,编写类似以下内容并不难:

def iterlen(x):
  n = 0
  try:
    while True:
      next(x)
      n += 1
  except StopIteration: pass
  return n

但是我无法摆脱自己重新设计自行车的感觉。

(当我键入函数时,我想到了一个想法:也许确实没有这样的函数,因为它“破坏了”其参数。不过,对于我的情况而言,这不是问题)。

PS:关于第一个答案-是的,类似的方法len(list(x))也可以工作,但是会大大增加内存的使用率。

PPS:重新检查…忽略PS,似乎我在尝试时出错,它可以正常工作。抱歉,添麻烦了。


问题答案:

没有一个是因为在一般情况下您无法执行此操作-如果您有一个惰性无限生成器怎么办?例如:

def fib():
    a, b = 0, 1
    while True:
        a, b = b, a + b
        yield a

这永远不会终止,但会生成斐波那契数。您可以通过拨打来获得任意数量的斐波纳契数next()

如果您确实需要知道项的数量,那么无论如何都无法一次线性地遍历它们,因此只能使用其他数据结构,例如常规列表。



 类似资料:
  • JavaScript ES6最令人兴奋的新功能之一是一种新的功能,称为生成器。 在生成器之前,整个脚本通常用于从上到下的顺序执行,没有简单的方法来停止代码执行并在以后使用相同的堆栈重新启动。 生成器是可以退出并稍后重新输入的功能。 他们的上下文(变量绑定)将在重新入口处保存。 生成器允许我们在两者之间停止代码执行。 因此,让我们来看一个简单的生成器。 var generator_func = fu

  • 考虑以下java代码: 此代码输出“”。所以是64字节,而SHA-256是32字节哈希。 我知道我指定了512位(64字节)作为密钥长度 然而,我希望生成的密钥(PBKDF2)将由SHA-256进行散列,这样无论我使用的密钥大小如何,输出都应始终为32字节。 我错过了什么(或者为什么我的期望是错误的)?

  • 我需要一些信息: 我有 2 台带有 TOMCAT 7.0.28 和 JAVA 的 redhat 6.1 Linux 服务器jdk1.7.0_05 在192.168.1.20(TOM04)上,我有一个实例TOMCAT 7,带有MBEAN“Java . lang:type = memory pool,name=Perm Gen” 在 192.168.1.21(TOM01) 上,我有 1 个实例 TOM

  • 来自Azure的DocumentDB(Cosmos db)后台到AWS DynamoDB,用于已经使用dynamo db的应用程序。 我对DynamoDB上的分区键感到困惑。 据我所知,分区键用于在数据增长时将数据隔离到不同的分区,但是许多人建议使用主键作为分区键,例如用户ID、客户ID、订单ID。在这种情况下,我不确定我们如何获得更好的性能,因为我们有很多分区。所以一个查询可能需要在多个服务器上

  • 我有一个DynamoDB表,存储一些程序的执行,这是它的样子: 此表有两种查询方案: 按程序名和执行id查询(简单) 执行第二次查询的正确方法是什么? 我知道我需要创建一个GSI来做到这一点,但这个GSI应该是什么样子? 我正在考虑将属性分成两个,如下所示: 因此,我可以使用StartMonthYear作为分区键,StartDayTime作为排序键来定义GSI。 这种方法唯一的问题是,我必须在我的

  • 在我的项目类中,我使用了java.util.logging。Logger,并在我的代码中添加了各种日志输出,使用了各种日志级别。 src/main/java/Run.java 目前,当我运行时,所有具有,但没有输出任何配置、警告或精细消息。 我已经尝试更新我的build.gradle文件,这样: 我包括: 然后创建/src/main/resource/logging.properties 正在运行