In Python, every data item is a Python object. So whatever is returned to you by open() is an object; specifically, it is a file object, which represents a file handle.
You already know how to do this:
handle = open("some_file.txt, "r")
This is, conceptually, very similar to the equivalent in C:
FILE *handle;
handle = fopen("some_file.txt", "r");
In C, the only useful thing you can do with that handle variable is to pass it to calls like fread(). In Python, the object has method functions associated with it. So, here is C to read 100 bytes from a file and then close it:
FILE *handle;
handle = fopen("some_file.txt", "r");
result = fread(buffer, 1, 100 handle); // read 100 bytes into buffer
fclose(handle);
And here is equivalent Python:
handle = open("some_file.txt", "r");
handle.read(100)
handle.close()
A good way to find out more about Python functions and objects is to use the built-in help() command from the Python prompt. Try help(open) and it doesn't tell you much, but does tell you that it returns a file object. So then try help(file) and now you get a whole lot of information. You can read about the .close() method, .read(), and others such as .readlines().
But the one that confused you was iterating the handle object. Since a very common case is reading lines from a file, Python makes file handles work as an iterator, and when you iterate you get one line at a time from the file.
List objects in Python are both indexable and iterable, so if you have a list named a you can both do a[i] or for x in a:. Looking up an item by position, a[i], is indexing. File handle objects do not support indexing but do support iteration.
In several answers here you will see the with statement. This is best practice in Python. A with statement only works with some kinds of objects in Python; the objects have to support a couple of special method functions. All you really need to know right now about with is that when you can use it, some needed initialization and finalization work can be done for you. In the case of opening a file, the with statement will take care of closing the file for you. The great part is that the with statement guarantees that the finalization will be done even if the code raises an exception.
Here's idiomatic Python for the above example:
with open("some_file.txt") as handle:
buffer = handle.read(100)