Как кроме работает для итераторов в Python? - PullRequest
0 голосов
/ 06 декабря 2018

Можете ли вы объяснить мне, почему предложение исключений никогда не выполнялось, и 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 голосов
/ 06 декабря 2018

StopIteration выбрасывается next, а не 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 также имеет второй аргумент, который позволяет предоставить значение по умолчанию вместо StopIteration:

>>> t = h([1,2])
>>> next(t, 'ST')
1
>>> next(t, 'ST')
2
>>> next(t, 'ST')
ST
0 голосов
/ 06 декабря 2018
def h(lst):
  try:
    yield from lst
  except StopIteration:
    print('ST')
t = h([1, 2])
>>> print(t)
<generator object h at 0x7fbf6f08aa40>

Функция "h" возвращает генератор.Утверждение «yield» как «возврат» ничего не делает, только возвращает генератор.Исключение не будет в этой части кода.

Исключение необходимо перенести в другую часть кода, где оно будет работать.

def h(lst):
    yield from lst
t = h([1, 2])
next(t)
next(t)
try:
    next(t)
except StopIteration:
    print('ST')
ST
0 голосов
/ 06 декабря 2018

Ваши 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'
...
...