2015-03-12 3 views
1

Я хочу иметь генератор, который может иметь или не иметь ничего, чтобы его получить, и если используется .next() или аналогичный, он не будет иметь ошибки StopIteration, если не будет выполнено ни одного из условий для выхода.генератор, который не обязательно дает что-либо

Пример:

def A(iterable): 
    for x in iterable: 
     if x == 1: 
      yield True 

Который работает так:

>>> list(A([1,2])) 
[True] 
>>> A([1]).next() 
True 
>>> A([2]).next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

Но то, что я хотел бы для A([2]).next() вернуться в None.

ответ

2

в целом, в этих условиях нужно использовать встроенную функцию next:

my_iterator = A([2]) 
value = next(my_iterator, None) 

В дополнение к возможности пройти дополнительное значение «по умолчанию», когда итератор пуст, next имеет то преимущество, что работает на python2.x и python3.x, где имя метода изменяется на __next__.

1

Как об этом:

def A(iterable): 
    for x in iterable: 
     yield True if x == 1 else None 
+0

Скопированный фрагмент кода недостаточно ... – peterh

+0

Или просто используйте отдельные инструкции '' 'yield''' в каждом наборе оператора if/else *. – wwii

Смежные вопросы