how to make a generator use the last yielded value when it regains control
Ben Cartwright
bencvt at gmail.com
Fri Apr 7 00:13:26 EDT 2006
John Salerno wrote:
> It
> is meant to take a number and generate the next number that follows
> according to the Morris sequence. It works for a single number, but what
> I'd like it to do is either:
>
> 1. repeat indefinitely and have the number of times controlled elsewhere
> in the program (e.g., use the morris() generator in a for loop and use
> that context to tell it when to stop)
>
> 2. just make it a function that takes a second argument, that being the
> number of times you want it to repeat itself and create numbers in the
> sequence
Definitely go for (1). The Morris sequence is a great candidate to
implement as a generator. As a generator, it will be more flexible and
efficient than (2).
def morris(num):
"""Generate the Morris sequence starting at num."""
num = str(num)
yield num
while True:
result, cur, run = [], None, 0
for digit in num+'\n':
if digit == cur:
run += 1
else:
if cur is not None:
result.append(str(run))
result.append(cur)
cur, run = digit, 1
num = ''.join(result)
yield num
# Example usage:
from itertools import islice
for n in islice(morris(1), 10):
print n
# Output:
"""
1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
"""
--Ben
More information about the Python-list
mailing list