from itertools import imap from functools import partial def func(num, state): if num == 5: state['seen_5'] = True elif num&1==0: state['even_seen'] +=1 else: num*=20 print '[?] seen_5 = {}, even_seen = {}'.format(state['seen_5'], state['even_seen']) return num def rec_func(it, newit, idx=0, seen_5=False, even_seen=0): num = next(it, None) if num is None: return newit elif num == 5: seen_5 = True elif num&1==0: even_seen +=1 else: num*=20 newit.append(num) print '[{}] seen_5 = {}, even_seen = {}'.format(idx, seen_5, even_seen) return rec_func(it, newit, idx+1, seen_5, even_seen) if __name__ == '__main__': _state = {'seen_5': False, 'even_seen': 0} print 'tuple(imap(partial(func, state=_state), xrange(10))) =', tuple(imap(partial(func, state=_state), xrange(10))) a = [] print '-'*15 print 'rec_func(iter(xrange(10)), a) =', rec_func(iter(xrange(10)), a) print 'a =', a
Standard input is empty
tuple(imap(partial(func, state=_state), xrange(10))) = [?] seen_5 = False, even_seen = 1 [?] seen_5 = False, even_seen = 1 [?] seen_5 = False, even_seen = 2 [?] seen_5 = False, even_seen = 2 [?] seen_5 = False, even_seen = 3 [?] seen_5 = True, even_seen = 3 [?] seen_5 = True, even_seen = 4 [?] seen_5 = True, even_seen = 4 [?] seen_5 = True, even_seen = 5 [?] seen_5 = True, even_seen = 5 (0, 20, 2, 60, 4, 5, 6, 140, 8, 180) --------------- rec_func(iter(xrange(10)), a) = [0] seen_5 = False, even_seen = 1 [1] seen_5 = False, even_seen = 1 [2] seen_5 = False, even_seen = 2 [3] seen_5 = False, even_seen = 2 [4] seen_5 = False, even_seen = 3 [5] seen_5 = True, even_seen = 3 [6] seen_5 = True, even_seen = 4 [7] seen_5 = True, even_seen = 4 [8] seen_5 = True, even_seen = 5 [9] seen_5 = True, even_seen = 5 [0, 20, 2, 60, 4, 5, 6, 140, 8, 180] a = [0, 20, 2, 60, 4, 5, 6, 140, 8, 180]