¿Por qué a continuación se genera una 'StopIteration', pero 'for' hace un retorno normal?

En este fragmento de código, ¿por qué el uso de 'for' no produce 'StopIteration' o el bucle 'for' atrapa todas las excepciones y luego sale silenciosamente? ¿En qué caso, por qué tenemos el 'retorno' extraño? O es elraise StopIteration causado por:return None?

#!/usr/bin/python3.1
def countdown(n):
    print("counting down")
    while n >= 9:
        yield n
        n -= 1
    return

for x in countdown(10):
    print(x)

c = countdown(10)
next(c)
next(c)
next(c)

AsumiendoStopIteration está siendo activado por:return None. ¿Cuándo se genera GeneratorExit?

def countdown(n):
    print("Counting down from %d" % n)
    try:
        while n > 0:
            yield n
            n = n - 1
    except GeneratorExit:
        print("Only made it to %d" % n)

Si hago manualmente un:

c = countdown(10)
c.close() #generates GeneratorExit??

¿En qué caso, por qué no veo una traza?

Respuestas a la pregunta(1)

Su respuesta a la pregunta