The challenge

The make_looper() function takes a string (of non-zero length) as an argument. It returns a function. The function it returns will return successive characters of the string on successive invocations. It will start back at the beginning of the string once it reaches the end.

Examples:

1
2
3
4
5
abc = make_looper('abc')
abc() # should return 'a' on this first call
abc() # should return 'b' on this second call
abc() # should return 'c' on this third call
abc() # should return 'a' again on this fourth call

The solution in Python code

Option 1:

1
2
3
4
5
from itertools import cycle

def make_looper(s):
    g = cycle(s)
    return lambda: next(g)

Option 2:

1
2
3
4
5
6
def make_looper(string):
    def generator():
        while True:
            for char in string:
                yield char
    return generator().next

Option 3:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def make_looper(string):
    global i
    i = 0
    def inner_function():
        global i
        if i == len(string):
            i = 0
        output = string[i]
        i += 1
        return output
    return inner_function

Test cases to validate our solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
test.describe("Sample Tests")

abc = make_looper("abc")

test.assert_equals(abc(), 'a')
test.assert_equals(abc(), 'b')
test.assert_equals(abc(), 'c')

test.assert_equals(abc(), 'a')
test.assert_equals(abc(), 'b')
test.assert_equals(abc(), 'c')