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

如果range()是Python 3.3中的生成器,为什么不能在范围上调用next()?

和嘉澍
2023-03-14
问题内容

也许我已成为网络错误信息的受害者,但我认为更可能是我误解了一些信息。根据到目前为止的知识,range()是一个生成器,并且生成器可以用作迭代器。但是,此代码:

myrange = range(10)
print(next(myrange))

给我这个错误:

TypeError: 'range' object is not an iterator

我在这里想念什么?我期望它打印0,并前进到中的下一个值myrange。我是Python的新手,所以请接受我对这个基本问题的歉意,但在其他任何地方都找不到很好的解释。


问题答案:

range是一类不变的可迭代对象。可以将它们的迭代行为与lists进行比较:您不能next直接调用它们;您必须使用来获得迭代器iter

所以不,range不是发电机。

您可能会想,“他们为什么不直接迭代呢?”?好吧,ranges具有一些有用的属性,而这是不可能的:

  • 它们是不可变的,因此可以用作字典键。
  • 他们有startstopstep属性(因为Python 3.3),countindexhtml" target="_blank">方法,它们支持inlen__getitem__操作。
  • 您可以range多次迭代相同的对象。
>>> myrange = range(1, 21, 2)
>>> myrange.start
1
>>> myrange.step
2
>>> myrange.index(17)
8
>>> myrange.index(18)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 18 is not in range
>>> it = iter(myrange)
>>> it
<range_iterator object at 0x7f504a9be960>
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5


 类似资料:
  • 问题内容: 在PHP中,您可以… 也就是说,有一个函数可让您通过传递上下限来获得一定范围的数字或字符。 为此,JavaScript是否内置任何内置功能?如果没有,我将如何实施? 问题答案: 它适用于字符和数字,通过可选步骤前进或后退。 jsFiddle。 如果您想扩展本机类型,则将其分配给。

  • 我刚开始编码。我想对同一个变量使用两次switch语句,我被告知要这样做,变量必须是'inscope'。 作为一个初学者,我不知道那是什么意思。那么在范围内意味着什么呢?而且,如果一个变量不在作用域中,我如何使它在作用域中?

  • 我正在使用forEach循环一个nodeList。我的代码如下 此代码引发错误为 未捕获的TypeError:Array.Foreach不是函数 然而,一些较旧的浏览器还没有实现nodelist.foreach()和array.from()。但是这些限制可以通过使用array.prototype.foreach()来规避(本文档中有更多内容)。 参考:MDN

  • 主要内容:作为序列的范围,实例,实例,作为条件的范围,实例,作为间隔的范围,实例范围(Range)无处不在:a 到 z、 0 到 9、等等。Ruby 支持范围,并允许我们以不同的方式使用范围: 作为序列的范围 作为条件的范围 作为间隔的范围 作为序列的范围 范围的第一个也是最常见的用途是表达序列。序列有一个起点、一个终点和一个在序列产生连续值的方式。 Ruby 使用 ''..'' 和 ''...'' 范围运算符创建这些序列。两点形式创建一个包含指定的最高值的范围,三点形式创建

  • 问题内容: 我对代码块或“作用域”的定义感到困惑。苹果公司的守卫文档说了这一点:守卫声明的else块… “必须转移控制权以退出其中出现保护声明的代码块。” 其他在线消息来源说,警卫声明必须退出其存在的“范围”。 因此,请看下面的示例代码: 根据我目前对“范围”的理解,代码 创建一个新范围,即{}之间。鉴于此假设,后卫只会逃避这一范围。但事实并非如此。在这种情况下,无论是否将其埋在if子句中,gua

  • 问题内容: 我试图了解在多个JavaConfig上下文中放置注释的正确位置在哪里? 考虑以下情形:我在JPAConfig.java和AppConfig.java中具有服务bean集的JPA配置。然后,在RootConfig.java中编写整个应用程序配置。 我在JPAConfig.java中定义事务管理器,并启用对JPA存储库的扫描- 当这些暴露事务行为时,我将其放到JPAConfig上,并且它可

  • 我想知道ApplicationContext何时会在原型范围的bean上调用用@PreDestroy注释的方法? a)每当bean实例变得不可达时(例如。当ApplicationContext关闭时(例如调用close(),stop(),destroy())