Pythonic: rango vs enumerar en python para bucle

¿Podría decirme por qué se considera “no python” cuando necesito el índice y el valor cuando se repite en una lista y se usa:

a = [1,2,3] for i in range(len(a)): # i is the idx # a[i] is the value 

sino que se recomienda usar

 for idx, val in enumerate(a): print idx, val 

¿Quién define a “pythonic” y por qué es mejor esta última? Quiero decir que no es mucho mejor con respecto a la legibilidad, ¿verdad?

Gracias por adelantado

En primer lugar, la primera forma es fea: o bien necesita una asignación de variable separada para obtener el elemento o use a[i] todo el tiempo, lo que en teoría podría ser una operación costosa. Imagine a a ser un cursor de base de datos: cuando lo itera (se llama a a.__iter__ ) el objeto puede asumir con seguridad que va a iterar sobre todos sus elementos. Así que todas o al menos múltiples filas se pueden recuperar a la vez. Sin embargo, al obtener la longitud, tal optimización sería estúpida, ya que seguramente no querrá recuperar datos solo porque desea la cantidad de elementos. Además, al recuperar un elemento específico, no puede asumir que otros elementos también se recuperarán.

Además, el uso de enumerate() funciona con cualquier iterable mientras que range(len()) solo funciona con objetos contables e indexables .