2010-08-19 18 views
5

Si quiero repetir n veces en Java, escribo:¿Hay alguna manera de iterar un número específico de veces sin introducir una variable innecesaria?

for (i = 0; i < n; i++) { 
    // do stuff 
} 

En Python, parece que la manera estándar de hacer esto es:

for x in range(n): 
    # do stuff 

Como siempre, Python es más concisa y más legible Pero el x me molesta, ya que no es necesario, y PyDev genera una advertencia, ya que x nunca se utiliza.

¿Hay alguna manera de hacer esto que no genere advertencias y no introduzca variables innecesarias?

+1

¿Por qué el 'î' en Java que se molestan por innecesaria? –

+0

@ S.Lott No dije que el 'i' no me molesta. Me gusta mejor la sintaxis de Python, como de costumbre. Pero está el hecho de que el 'i' en Java parece usarse, y no me regañan por no usarlo en el ciclo. –

+0

El 'i' puede que no se use realmente. Entonces, ¿es el "regaño"? ¿Ese es el problema? –

Respuesta

6

Idiomatic Python (y muchos otros idiomas) harían que usara _ como la variable temporal, que generalmente indica a los lectores que la variable no se usa intencionalmente.

Aparte de esa convención, la construcción de bucles in en Python siempre requiere que itere sobre algo y asigne ese valor a una variable.

(Los comentarios en la respuesta aceptada de this question sugieren que PyDev no creará una advertencia para _).

2

En Python, no crea una variable adicional en el tipo de situación que describió.

for i in range(10): 

Crea un objeto de rango sobre el cual itera el ciclo. El objeto rango mantiene su valor actual en cualquier momento dado. i es simplemente un nombre creado y vinculado a este valor.

La variable existe ya sea que tenga un nombre o no, ya que el objeto rango debe saber su valor actual.

Si se piensa en un bucle en términos de instrucciones de la CPU, se ve por qué debe ser una variable:

push x 
loop: 
    do something 
    increment x 
    jump if x > y 
    goto loop 

No es una instalación en algunos idiomas JIT compilado que a veces detecta un bucle de ser sólo una pequeña cantidad de repeticiones del mismo código y optimiza el código para que sea una serie de las mismas instrucciones. Pero, hasta donde yo sé, Python no hace tal cosa.

Aquí hay un ciclo for en código de bytes:

4   0 SETUP_LOOP    20 (to 23) 
       3 LOAD_GLOBAL    0 (range) 
       6 LOAD_FAST    0 (x) 
       9 CALL_FUNCTION   1 
      12 GET_ITER    
     >> 13 FOR_ITER     6 (to 22) 
      16 STORE_FAST    1 (i) 

    5   19 JUMP_ABSOLUTE   13 
     >> 22 POP_BLOCK    

en cuenta que no hay comparación. El ciclo se cierra por el objeto de iteración que levanta StopIteration, el intérprete busca la configuración del ciclo y salta al final del ciclo (23 en este caso).

Por supuesto, puede evitar todo esto simplemente repitiendo su código x número de veces. Tan pronto como este número pueda variar, debe haber algún tipo de facilidad para proporcionar next() y StopIteration para que funcione el bucle for. Recuerde, el bucle for de python es en todo caso comparable a un bucle for-each en Java. Realmente no hay un bucle for tradicional disponible en absoluto.

Solo como un lado: Siempre uso i, j y k para iterar variables. Usar el guión bajo de alguna manera me parece poco elegante.

Cuestiones relacionadas