Expressions that can be looped over
Can be collections e.g. list, tuples, str, bytes
Can be generators e.g. range(), file objects, enumerate(), zip(), reversed()
Python has many builtin iterables - a file object, for instance, which allows iterating through many lines in a file
All builtin collections (lists, tuples, str, bytes) are iterables. They keep all their values in memory. Many other builtin iterables are generators.
A generator does not keep all it's values in memory - it creates them one at a time as needed, and feeds them to the for-in loop. This is a good thing, because it saves memory.
>>> colors = {'crimson': 0xdc143c, 'coral': 0xff7f50, 'teal': 0x008080}
>>> for color in colors:
>>> print(color, colors[color])
crimson 14423100
coral 16744272
teal 32896