Ian Kelly <ian.g.ke...@gmail.com>: > On Wed, Apr 6, 2016 at 8:14 AM, Marko Rauhamaa <ma...@pacujo.net> wrote: >> Now, if Python had an unlimited range() iterator/iterable, you could use >> a "for" statement to emulate "while". > > You can already do this. > >>>> class While: > ... def __init__(self, predicate): > ... self._predicate = predicate > ... self._exited = False > ... def __iter__(self): > ... return self > ... def __next__(self): > ... if self._exited or not self._predicate(): > ... self._exited = True > ... raise StopIteration > ... >>>> i = 0 >>>> for _ in While(lambda: i < 10): > ... print(i) > ... i += 1 > ... > 0 > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9
Impressive! >> As it stands, Python without "while" could only compute >> primitive-recursive functions. However, you only need "while" a >> maximum of one time in your whole program to perform an arbitrary >> computation. > > So this is wrong. I stand corrected. However, BartC's No-Buzzword Python doesn't have classes... If he allowed for types.SimpleNamespace, we could have: ======================================================================== import types def While(predicate): def __iter__(): return thingy def __next__(): if thingy._exited or not predicate(): thingy._exited = True raise StopIteration thingy = types.SimpleNamespace( _exited=False, __iter__=__iter__, __next__=__next__) return thingy ======================================================================== However, that results in: TypeError: 'types.SimpleNamespace' object is not iterable Where's my bug? Or is CPython buggy? Or is it the documentation: The iterator objects themselves are required to support the following two methods, which together form the iterator protocol: iterator.__iter__() [...] iterator.__next__() <URL: https://docs.python.org/3/library/stdtypes.html#typeiter> Why is a SimpleNamespace object not an iterator even though it provides __iter__ and __next__? Marko -- https://mail.python.org/mailman/listinfo/python-list