except在Python中的迭代器如何工作?

时间:2018-12-06 10:49:55

标签: python iterator yield

您能向我解释为什么在示例中从未执行过except子句并且从未调用过print吗?

def h(lst):
  try:
    yield from lst
  except StopIteration:
    print('ST')

t = h([1,2])
next(t)
>>> 1
next(t)
>>> 2
next(t)
>>> Traceback (most recent call last):

File "<ipython-input-77-f843efe259be>", line 1, in <module>
next(t)

StopIteration

3 个答案:

答案 0 :(得分:2)

您的next调用在您的h函数的外部之外,因此try / except子句未涵盖。为了进行比较,请尝试以下操作:

def h(lst):
    yield from lst

t = h([1,2])

然后重复运行:

try:
    print(next(t))
except StopIteration:
    print('ST')

结果:

1
2
'ST'
'ST'
'ST'
...

答案 1 :(得分:2)

StopIterationnext而不是yield from抛出:

  

next(iterator[, default])

     

通过调用其__next__()方法从迭代器中检索下一项。如果给出了 default ,则如果迭代器已耗尽,则返回它,否则引发StopIteration

因此,您可以包装next调用。

def h(lst):
    yield from lst

def next_or_print(it):
    try:
        next(it)
    except StopIteration:
        print('ST')

然后您像这样使用它:

>>> t = h([1,2])
>>> next_or_print(t)
1
>>> next_or_print(t)
2
>>> next_or_print(t)
ST

请注意,next还有一个第二个参数,它允许提供一个 default 而不是StopIteration

>>> t = h([1,2])
>>> next(t, 'ST')
1
>>> next(t, 'ST')
2
>>> next(t, 'ST')
ST

答案 2 :(得分:0)

componentDidMount()

函数“ h”返回一个生成器。语句“ yield”作为“ return”不执行任何操作,仅返回生成器。例外不会出现在代码的那部分。

必须将异常转移到代码的另一部分,然后在该部分起作用。

def h(lst):
  try:
    yield from lst
  except StopIteration:
    print('ST')
t = h([1, 2])
>>> print(t)
<generator object h at 0x7fbf6f08aa40>