1) That's not a generator (although the for-loop does iterate through a generator that it gets from your list)
2) A string can be iterated through without first converting it to a list.
To expand on 1) a bit, at risk of saying only what you already know, but if there's a small chance I can say something new I'll take it:
A generator expression looks nearly the same as list comprehension, except the square brackets are replaced by parentheses, and these parentheses can be omitted when the generator is the only argument to a function/other callable.
List comprehension comes with an up-front cost (compute the whole list before any of it is put to use), but has less total overhead than a generator.
What a for-loop does is to request a generator from the object that is to be iterated through, something like:
>>> iterator = iter('hello')
And then it asks for next value until there's a StopIteration exception
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
So strings, lists and all other things that can be iterated through with a for-loop has an
__iter__ method (that's what
iter uses, similar to how
len uses an objects
__len__ method, they do some sanity checking as well I believe) which returns a generator.