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

Python列表迭代器行为和next(iterator)

林运浩
2023-03-14
问题内容

考虑:

>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2

因此,按预期方式,通过更改同一对象来处理迭代器。

在这种情况下,我希望:

a = iter(list(range(10)))
for i in a:
   print(i)
   next(a)

跳过每第二个元素:对的调用next应使迭代器前进一次,然后循环进行的隐式调用应使它第二次进行-并将第二次调用的结果分配给i

没有。该循环将打印列表中的 所有 项目,而不会跳过任何项目。

我的第一个想法是可能发生这种情况,因为循环调用iter了它所传递的内容,并且这可能会提供一个独立的迭代器-事实并非如此iter(a) is a

那么,为什么next在这种情况下似乎不推进迭代器呢?


问题答案:

您所看到的是, 解释器next()除了回显i每次迭代外,还回显了返回值:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    next(a)
... 
0
1
2
3
4
5
6
7
8
9

所以0是的输出print(i)1从返回值next(),通过交互式解释回荡,等,有仅5次迭代,产生2行每次迭代被写入到所述终端。

如果您分配next()事物的输出按预期工作:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    _ = next(a)
... 
0
2
4
6
8

或打印 额外的 信息以区分print()输出与交互式解释器回显:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print('Printing: {}'.format(i))
...    next(a)
... 
Printing: 0
1
Printing: 2
3
Printing: 4
5
Printing: 6
7
Printing: 8
9

换句话说,next()它按预期方式工作,但是由于它从迭代器返回下一个值,并由交互式解释器回显,因此您被认为是循环以某种方式拥有自己的迭代器副本。



 类似资料:
  • 问题内容: 我想了解更多有关的信息,所以如果我错了,请纠正我。 迭代器是一个对象,该对象具有指向下一个对象的指针,并作为缓冲区或流(即,链表)读取。它们特别有效,因为它们所做的只是通过引用而不是使用索引来告诉您下一步是什么。 但是我仍然不明白为什么会发生以下行为: 经过迭代器()的第一个循环后,就好像它已被消耗并且留空,因此第二个循环()不输出任何内容。 但是,我从未为变量分配新值。 循环幕后到底

  • 问题内容: 有时我需要在Python中迭代一个列表,以查看“当前”元素和“下一个”元素。到目前为止,我已经使用以下代码完成了此操作: 这行得通,符合我的期望,但是有没有一种更惯用或有效的方式来执行相同的操作? 问题答案: 这是模块文档中的一个相关示例: 对于Python 2,你需要代替: 工作原理: 首先,两个平行的迭代器,a和b被创建(在tee()呼叫),两者都指向原始迭代的第一个元素。第二个迭

  • 问题内容: 我有一个清单: 要从此列表中获取,有两种方法: 1。 2。 我的问题是,哪一个内存效率高且迭代速度快? 问题答案: 他们做同样的事情- 增强的循环对于长版本来说只是语法糖(对于可迭代对象;对于数组,它稍有不同)。除非您明确需要迭代器(例如,调用),否则我将使用第一个版本。 有关编译器执行的准确转换的更多详细信息,请参见Java语言规范的14.14.2节。

  • 问题内容: 这个问题已经在这里有了答案 : 嵌套函数中的局部变量 (4个答案) 5年前关闭。 我在玩Python生成器和模块,并尝试制作无限版的Eratosthenes筛。这是我的代码: 当我对其进行测试时,我得到以下信息: 但是,如果我用这样的函数代替的重新分配: 我得到: 我不知道为什么第一个版本不起作用。据我所知,这两个版本应该等效。有谁知道为什么他们不一样? 问题答案: 在Python中使

  • 我有一个名为的DataFrame想要迭代列表并获得的值,但我得到了以下错误(如预期的那样)。知道我该怎么取消吗?