Способ понять yield
состоит в том, чтобы представить, что это просто оператор возврата с добавленным поворотом, что при следующем вызове функции выполнение продолжается с оператора yield. Когда больше не остается урожайности, возникает исключение StopIteration
.
Более простой пример должен прояснить ситуацию:
>>> def foo():
... for i in range(3):
... yield i
...
>>> x = foo()
>>> x
<generator object foo at 0x7f0cd5c30780>
>>> x.next()
0
>>> x.next()
1
>>> x.next()
2
>>> x.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
Вы можете использовать генератор как итеративный, потому что циклы for
просто ловят и обрабатывают это StopIteration
внутреннее исключение:
>>> x = foo()
>>> for i in x:
... print i
...
0
1
2
>>>
Что касается получения подмножеств, есть более простой способ!
Проверьте рецепт ниже:
>>> from itertools import chain, combinations
>>>
>>> def powerset(iterable):
... s = list(iterable)
... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
>>>
>>> S = ['A','B','C']
>>> list(powerset(S))
[(),
('A',),
('B',),
('C',),
('A', 'B'),
('A', 'C'),
('B', 'C'),
('A', 'B', 'C')]