On Wed, Jun 7, 2017 at 10:00 AM, Rob Gaddi <rgaddi@highlandtechnology.invalid> wrote: > > On 06/06/2017 11:13 PM, Frank Millman wrote: >> >> Hi all >> >> It would be nice to write a generator in such a way that, in addition to 'yielding' each value, it performs some additional work and then 'returns' a final result at the end. >> >>> From Python 3.3, anything 'returned' becomes the value of the StopIteration >> >> exception, so it is possible, but not pretty. >> >> Instead of - >> my_gen = generator() >> for item in my_gen(): >> do_something(item) >> [how to get the final result?] >> >> you can write - >> my_gen = generator() >> while True: >> try: >> item = next(my_gen()) >> do_something(item) >> except StopIteration as e: >> final_result = e.value >> >> Is this the best way to achieve it, or is there a nicer alternative? >> >> Thanks >> >> Frank Millman > > class MyGeneration: > def __iter__(self): > yield from ('people', 'try', 'to', 'put', 'us', 'down') > self.final = 'talking about' > > mygen = MyGeneration() > for item in mygen: > print(item) > print(mygen.final)
Or as a generic wrapper: class CaptureValue: def __init__(self, iterable): self._iter = iter(iterable) def __iter__(self): return self def __next__(self): try: return next(self._iter) except StopIteration as e: self.value = e.value raise capture = CaptureValue(generator()) print(list(capture)) print(capture.value) -- https://mail.python.org/mailman/listinfo/python-list