fork download
  1. from itertools import imap
  2. from functools import partial
  3.  
  4. def func(num, state):
  5. if num == 5: state['seen_5'] = True
  6. elif num&1==0: state['even_seen'] +=1
  7. else: num*=20
  8. print '[?] seen_5 = {}, even_seen = {}'.format(state['seen_5'],
  9. state['even_seen'])
  10. return num
  11.  
  12. def rec_func(it, newit, idx=0, seen_5=False, even_seen=0):
  13. num = next(it, None)
  14. if num is None:
  15. return newit
  16. elif num == 5: seen_5 = True
  17. elif num&1==0: even_seen +=1
  18. else: num*=20
  19. newit.append(num)
  20. print '[{}] seen_5 = {}, even_seen = {}'.format(idx, seen_5, even_seen)
  21. return rec_func(it, newit, idx+1, seen_5, even_seen)
  22.  
  23. if __name__ == '__main__':
  24. _state = {'seen_5': False, 'even_seen': 0}
  25. print 'tuple(imap(partial(func, state=_state), xrange(10))) =', tuple(imap(partial(func, state=_state), xrange(10)))
  26. a = []
  27. print '-'*15
  28. print 'rec_func(iter(xrange(10)), a) =', rec_func(iter(xrange(10)), a)
  29. print 'a =', a
Success #stdin #stdout 0.01s 47720KB
stdin
Standard input is empty
stdout
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]