python 迭代器是列表_Python列表迭代器行为和下一个(迭代器)

考虑:

>>> 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似乎没有推进迭代器呢?

你看到的是除了每次迭代打印i之外,解释器回显next()的返回值:

>>> 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()正在按预期工作,但是因为它从迭代器返回下一个值,由交互式解释器回显,所以你会相信循环有某种方式具有自己的迭代器副本。

我从口译员那里不知道这种行为。我很高兴我在解决一些真正的问题之前,在失去了很多时间之前就发现了这一点。

...... *死了*。最糟糕的是,我记得很可能在一周前向某人提及这种解释行为。

有趣。我试着在一个:下一个(a);打印我并认为我会跳到1并打印1,3,5,7,9。但它仍然是0,2,4,6,8。为什么?

i已经分配。 next(a)表示下一次迭代2被分配给i,然后再次移动a,打印i等。

如果n为奇数,则不起作用 - 在列表排除后调用next(a)时会引发StopIteration异常。

这是一个很好的解释。

发生的事情是next(a)返回a的下一个值,它被打印到控制台,因为它不受影响。

您可以做的是使用此值影响变量:

>>> a = iter(list(range(10)))

>>> for i in a:

...    print(i)

...    b=next(a)

...

0

2

4

6

8

我发现现有的答案有点令人困惑,因为它们只间接地表明代码示例中必不可少的神秘事物:"print i"和"next(a)"都会导致打印结果。

由于它们打印原始序列的交替元素,并且出乎意料的是"next(a)"语句正在打印,所以看起来好像"print i"语句正在打印所有值。

在这种情况下,更清楚的是,将"next(a)"的结果分配给变量会禁止打印其"结果",从而只打印"i"循环变量的替代值。同样,使"print"语句发出更具特色的东西也可以消除它的歧义。

(其中一个现有的答案反驳了其他答案,因为答案是将示例代码评估为一个块,以便解释器不报告"next(a)"的中间值。)

一般来说,回答问题时的迷人之处在于,一旦你知道了答案,就会明确一些明显的问题。这可能是难以捉摸的。一旦理解了答案,同样批评答案。这真有趣...

对于那些仍然不理解的人。

>>> a = iter(list(range(10)))

>>> for i in a:

...    print(i)

...    next(a)

...

0 # print(i) printed this

1 # next(a) printed this

2 # print(i) printed this

3 # next(a) printed this

4 # print(i) printed this

5 # next(a) printed this

6 # print(i) printed this

7 # next(a) printed this

8 # print(i) printed this

9 # next(a) printed this

正如其他人已经说过的那样,next按预期将迭代器增加1。将其返回值分配给变量不会神奇地改变其行为。

您的Python /计算机出了问题。

a = iter(list(range(10)))

for i in a:

print(i)

next(a)

>>>

0

2

4

6

8

像预期一样工作。

在Python 2.7和Python 3+中测试过。两者都适用

我得到与@lvc相同的结果(仅在IDLE上,但是当作为脚本执行时我得到了这个))

@Inbar Rose仅当您以脚本身份运行时。

它是通过交互式shell放置代码的行为。如果函数返回值而未使用,则解释器会将其作为调试输出打印到shell

如果作为函数调用它,它的行为方式如下:

>>> def test():

...     a = iter(list(range(10)))

...     for i in a:

...         print(i)

...         next(a)

...

>>> test()

0

2

4

6

8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值