Best way to check that you are at the beginning (the end) of an iterable?

Steven D'Aprano steve+comp.lang.python at pearwood.info
Wed Sep 7 20:24:58 EDT 2011


Laurent wrote:

> Hi there,
> 
> What is the simplest way to check that you are at the beginning or at the
> end of an iterable?


I don't think this question is meaningful. There are basically two
fundamental types of iterables, sequences and iterators.

Sequences have random access and a length, so if the "start" and "end" of
the sequence is important to you, just use indexing:

beginning = sequence[0]
end = sequence[-1]
for i, x in enumerate(sequence):
    if i == 0: print("at the beginning")
    elif i == len(sequence)-1: print("at the end")
    print(x)


Iterators don't have random access, and in general they don't have a
beginning or an end. There may not be any internal sequence to speak of:
the iterator might be getting data from a hardware device that provides
values continuously, or some other series of values without a well-defined
beginning or end. Example:

def time():
    from time import asctime
    while True:
        yield asctime()

it = time()

What would it even mean to say that I am at the beginning or end of it?

Iterators have no memory, so in one sense you are *always* at the beginning
of the iterator: next() always returns the next item, and the previous item
is lost forever. So the answer to the question "Am I at the beginning of an
iterator?" is always "You are now".

For sequences, the question is best handled differently. For iterators, the
question doesn't make sense in general. If you need an iterator that can
report its internal state, write your own:

import random, time
class MyIter(object):
    def __init__(self):
        self.start = True
        self.end = False
    def __next__(self):
        if self.start:
            self.start = False
        if self.end:
            raise StopIteration
        if random.random() < 0.01:
            self.end = True
        return time.asctime()
    def __iter__(self):
        return self



-- 
Steven




More information about the Python-list mailing list