Pregunta

Estoy siguiendo el tutorial de Python en su sitio y actualmente estoy en la sección de continuación de descanso. Acabo de probar este código de muestra.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x
...             break
...     else:
...         # loop fell through without finding a factor
...         print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

Y en lugar de escupir lo que dice arriba, obtengo

3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

Me parece que continúa ejecutando el bucle for for interno, pero ¿por qué el tutorial no tiene esto en cuenta? ¿Está desactualizado para la última versión del intérprete (estoy ejecutando xubuntu jaunty)?

Pude arreglarlo agregando la línea

     else:
...                     if n != y:
...                             print n, 'is a prime number'
...                             y = n

pero me preocupa que esto pueda ser una mala práctica de codificación. Gracias por su ayuda.

¿Fue útil?

Solución

El resultado que muestra contiene diez veces la cadena " x es un número primo " ;. Sin embargo, esta cadena se imprime en la cláusula else del bucle interno y, como tal, se ejecuta como máximo una vez por cada ejecución del bucle interno.

Dado que el bucle externo realiza ocho iteraciones, " x es un número primo " no se puede imprimir más de ocho veces. Por lo tanto, la salida que muestra no se puede obtener mediante el código que se muestra.

Conclusión : algo es sospechoso. ¿Puedes mostrar el código mientras lo ejecutaste?


Editar: ¡resuelto!

Sangraste incorrectamente la cláusula else, de modo que Python la interpretó como perteneciente a la instrucción if . Python trata una pestaña como espacios 8 . Quizás su editor muestre pestañas como espacios 4 . De esa manera es posible que te hayas perdido este error. Según PEP 8 , no mezcle pestañas y espacios, y preferiblemente use cuatro espacios para sangrar su código.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x 
...             break
...         else:
...             # loop fell through without finding a factor
...             print n, 'is a prime number'
... 
3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

Otros consejos

Mi mejor conjetura es que su declaración 'else:' no está correctamente sangrada, y luego su resultado es lógico, verifique que la sangría de su otra persona esté al nivel de 'for x'.

I.e. usted usa:

for n in range(2,10):
    for x in range(2,n):
        if n%x == 0:
            print(n, '=', x, '*', n/x)
            break
        else:
            print(n, 'is a prime')

en lugar de:

for n in range(2,10):
    for x in range(2,n):
        if n%x == 0:
            print(n, '=', x, '*', n/x)
            break
    else:
        print(n, 'is a prime')

Puede que necesite actualizar su intérprete de Python.

Este código se ejecuta correctamente para mí (observe el número de versión de Python):

Python 2.6.1 (r261:67515, Dec  6 2008, 16:42:21) 
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for n in range(2, 10):
...      for x in range(2, n):
...          if n % x == 0:
...              print n, 'equals', x, '*', n/x
...              break
...      else:
...          # loop fell through without finding a factor
...          print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

Creo que tienes sangrías mal. Si tomo su código y sangro el resto para que esté debajo de la instrucción if, obtengo exactamente el resultado que está obteniendo.

El siguiente código reproduce su salida,

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
        else:
            # loop fell through without finding a factor
            print n, 'is a prime number'

while

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
    else:
        # loop fell through without finding a factor
        print n, 'is a prime number'

Hace lo que quieres que haga.

Tenga en cuenta lo diferente en la sangría de lo demás.

Pensé que else siempre debería estar alineado con if . Eso es lo que he leído. Pero en este código generador de números primos, la única forma de obtener los primos escritos una vez, es alineando else con para x . Así que no tengo explicación para tal ideación. Aunque recién estoy empezando a aprender Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top