Generators can do dangerous things...I'm not sure I'd *want* to have
Python implicitly cache generators without an explicit wrapper to
request it:
I'm sure that I DON'T want it. It would be a terrible change.
(1) Generators are lightweight. Adding overhead to cache the next value
adds value only for a small number of uses, but adds weight to all
generators.
(2) Generators are simple. There is a clear and obvious distinction
between "create the generator object by calling the generator function"
and "call the generated values by iterating over the generator object".
Admittedly the language is a bit clumsy, but the concept is simple -- you
have a generator function that you call, and it returns an iterable
object that yields values. Simple and straightforward. Caching blurs this
distinction -- calling the function also produces the first object,
caching it and hiding any StopIteration.
(3) Generators with side-effects. I know, I know, if you write functions
with side-effects, you're in a state of sin already, but there's no need
for Python to make it worse.
(4) Expensive generators. The beauty of generators is that they produce
values on demand. Making all generators cache their first value means
that you pay that cost even if you end up never needing the first value.
(5) Time dependent output of generators. The values yielded can depend on
the time at which you invoke the generator. Caching plays havoc with that.
None of this is meant to say "Never cache generator output", that would
be a silly thing to say. If you need an iterator with look-ahead, that
knows whether it is empty or not, go right ahead and use one. But don't
try to force it on everyone.