¿Cuál es el equivalente de Python del bucle estándar de Java?

Estoy escribiendo un algoritmo simple para verificar la primalidad de un número entero y tengo un problema al traducir este código Java a Python:

for (int i = 3; i < Math.sqrt(n); i += 2) { if (n % i == 0) return false; } 

Entonces, he estado tratando de usar esto, pero obviamente estoy saltando la división por 3:

 i = 3 while (i < int(math.sqrt(n))): i += 2 # where do I put this? if (n % i == 0): return False 

El único for -loop en Python es técnicamente un “para-cada”, así que puedes usar algo como

 for i in xrange(3, int(math.sqrt(n)), 2): # use 'range' in Python 3 if n % i == 0: return False 

Por supuesto, Python puede hacerlo mejor que eso:

 all(n % i for i in xrange(3, int(math.sqrt(n)), 2)) 

también sería equivalente (asumiendo que hay un return true al final de ese bucle de Java). De hecho, esta última sería considerada la forma pythonica de abordarla.


Referencia:

  • for declaraciones
  • xrange
  • all

Una traducción directa sería:

 for i in range(3, int(math.sqrt(n)), 2): if n % i == 0: return False 

En un Java for loop, el paso (la parte i += 2 en su ejemplo) ocurre al final del bucle, justo antes de que se repita. Traducido a un tiempo, su bucle for sería equivalente a:

 int i = 3; while (i < Math.sqrt(n)) { if (n % i == 0) { return false; } i += 2; } 

Que en Python es similar:

 i = 3 while i < math.sqrt(n): if n % i == 0: return False i += 2 

Sin embargo, puede hacer esto más "Pythonic" y más fácil de leer utilizando la función xrange de Python, que le permite especificar un parámetro de step :

 for i in xrange(3, math.sqrt(n), 2): if n % i == 0: return False 

Use un Python básico for i in range bucle de for i in range :

 for i in range(3, math.round(math.sqrt(x)), 2): if (n % i == 0): return false