6

Is there a way in Python to automatically add an iteration counter to a while loop?

I'd like to remove the lines count = 0 and count += 1 from the following code snippet but still be able to count the number of iterations and test against the boolean elapsed < timeout:

import time

timeout = 60
start = time.time()

count = 0
while (time.time() - start) < timeout:
    print 'Iteration Count: {0}'.format(count)
    count += 1
    time.sleep(1)
Alan Kavanagh
  • 9,425
  • 7
  • 41
  • 65
  • 3
    You may be thinking of [`enumerate`](https://docs.python.org/2/library/functions.html#enumerate) which does this for `for` loops, but I don't know of any solution for `while` other than what you have. – Two-Bit Alchemist Jul 27 '16 at 18:40
  • Unfortunately, Python [doesn't allow](https://docs.python.org/2/faq/design.html#why-can-t-i-use-an-assignment-in-an-expression) assignment statements in an expression. Otherwise, this could be a lot cleaner. – Alex W Jul 27 '16 at 19:14

2 Answers2

15

The cleanest way is probably to convert this to an infinite for loop and move the loop test to the start of the body:

import itertools

for i in itertools.count():
    if time.time() - start >= timeout:
        break
    ...
user2357112
  • 260,549
  • 28
  • 431
  • 505
3

You could instead move the while loop to a generator and use enumerate:

import time

def iterate_until_timeout(timeout):
    start = time.time()

    while time.time() - start < timeout:
        yield None

for i, _ in enumerate(iterate_until_timeout(10)):
    print "Iteration Count: {0}".format(count)
    time.sleep(1)
Vincent Savard
  • 34,979
  • 10
  • 68
  • 73