【问题标题】:Understanding iterator default value了解迭代器默认值
【发布时间】:2022-01-08 14:57:39
【问题描述】:

我无法理解为什么第三个next(w) 会执行,而StopIteration 异常会在下一个而不是第三个引发。

据我了解,next(w) 应该在其任何表达式用尽时引发StopIteration,并且只要next(y, 'b') 达到默认值'b' 就会发生。

为什么迭代器会两次返回默认值?

x = iter(range(3))
y = iter(range(3))
w = ([next(y, "a"), next(y, "b")] for z in x)
try:
    print(next(w)) # -> prints [0, 1]
    print(next(w)) # -> prints [2, 'b']
    print(next(w)) # -> prints ['a', 'b']
    print(next(w)) # raise StopIteration
    print(next(w))
except:
    print("7") # -> prints '7'

【问题讨论】:

  • 我认为您的异常出现是因为您已经用尽了 w 迭代器,而不是 xy 迭代器(因为您没有 w 的默认值)
  • 你是什么意思“任何它的表达”?当您调用的迭代器决定这样做时,next 将引发 StopIteration。在这种情况下,该迭代器是 w,它是一个生成器表达式,它正在迭代 x,它本身就是一个在大小为 3 的范围内的迭代器......所以毫不奇怪,打印了三件事

标签: python iterator generator


【解决方案1】:

为什么迭代器会两次返回默认值?

迭代器在调用它时返回默认值的次数,而不仅仅是两次。出现此问题是因为您将xw 定义如下:

x = iter(range(3))
y = iter(range(3))
w = ([next(y, "a"), next(y, "b")] for z in x)

您的 w 列表有 3 个条目(它遍历 x 中的 3 个元素),当您第四次调用 next(w) 时,它会引发异常。尝试设置x = iter(range(5)),你会看到你现在可以调用print(next(w)) 5 次。内部 next 调用将返回默认值的次数与调用次数相同。

为了确认这一点,只需在创建后输出w,这样你就可以看到它的内容了:

x = iter(range(3))
y = iter(range(3))
w = ([next(y, "a"), next(y, "b")] for z in x)
list(w)

> [[0, 1], [2, 'b'], ['a', 'b']]

【讨论】:

  • “您的 w 列表有 3 个条目”是什么意思?
  • 试试list(w),这样你就可以看到w的内容了。您将看到有 3 个条目。如果你调用next(w) 4 次,那么你会得到一个异常:你只有 3 个条目。
  • “迭代器在它被调用时返回默认值多次,而不仅仅是两次。”这就是我需要的,不知道。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 2017-11-25
  • 2016-04-18
  • 2012-12-24
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多