I am aware of this question:
Difference between Python's Generators and Iterators
It is more broadly and less technically based. And none of the answers have been selected. I also read through those answers and with one possible exception did not find what I was looking for. I wish to ask a more precise question to help me understand some details.
I asked this question earlier:
What is the difference between a python itterator and a python generator?
Perhaps the title or the way I asked the question was misleading, since the response I did get was not on target to my intentions and the question was closed within seconds.
So I will try to clarify here.
Consider the following code:
p = [k for k in range(1,1000)]
i = iter(p)
g = (k for k in p)
Is there some operation that can be done on i and g that will distinguish between these two constructions. Something that I can do with i that I can't do with g, that sort of thing. Their type comes out as list iterator versus generator object, but it is unclear to me that this has any pragmatic impact on what one can do with it, or its efficiency. I deliberately have constructed the list first to emphasize that the issue of generating the list up front or on demand is not what the question is about.
At the moment, I suspect that the answer to the more general question is this - generators are a special case of iterators and whatever you can do with generator construction using either comprehensions or yield can be done by explicitly writing the corresponding iterator. The justification for using a generator rather than an iterator is that sometimes it is easier to write.
Later I found this question that lead to some good exposition on the topic.