An iterable is any Python object capable of returning its members one at a time, permitting it to be iterated over in a for-loop, such as lists, tuples, sets and strings – as well as generators. An iterable object implements the __getitem__ and __len__ methods.
An object can also implement the __iter__ method to return an iterator.
An iterator is any object in Python which has a __next__ method defined.
Consider a string, it is iterable, but it’s not an iterator. To iterate over it, we need to call the iter() function to return an iterator object from an iterable:
name = "fred" for ch in iter(name): print(ch) # outputs: f r e d
Here is an example of an iterable object:
class Members: def __init__(self, members=None): self._members = members or  def __getitem__(self, index): return self._members[index] def __len__(self): return len(self._members) book_club = Members(['Fred', 'Tom', 'Alice', 'Betty', 'Mike']) # create an iterator for our object for member in iter(book_club): print(member) # create a list from our object print(list(book_club)) # outputs: Fred Tom Alice Betty Mike ['Fred', 'Tom', 'Alice', 'Betty', 'Mike']
In this second example, we return an iterator directly:
class Skills: def __init__(self, skills=None): self._skills = skills or  def __iter__(self): return iter(self._skills) personal_skills = Skills(['C#', 'Delphi']) for skill in personal_skills: print(skill) # outputs: C# Delphi
This example demonstrates that a generator can be iterated over directly:
friends = (name for name in ['john', 'peter', 'mary', 'michael']) for friend in friends: print(friend) # outputs: john peter mary michael
Lastly, here is a very neat recipe from the Python Cookbook, it allows you to iterate over a collection of fixed sized records or chunks:
from functools import partial RECORD_SIZE = 32 with open('somefile.data', 'rb') as f: records = iter(partial(f.read, RECORD_SIZE), b'') for r in records: ...