Problème d'utilisation de la commande break dans le didacticiel Python
Question
Je suis le tutoriel sur Python sur leur site et je suis actuellement à la section pause continue. Je viens d'essayer cet exemple de code.
>>> 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
Et au lieu de cracher ce qui est dit plus haut, je reçois
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
Il me semble qu'il continue à fonctionner en boucle intérieure, mais pourquoi le didacticiel n'en tient-il pas compte? Est-il obsolète pour la dernière version de l’interprète (j’utilise Xubuntu jaunty)?
J'ai pu résoudre ce problème en ajoutant la ligne
else:
... if n != y:
... print n, 'is a prime number'
... y = n
mais je crains que cela ne soit une mauvaise pratique de codage. Merci pour votre aide.
La solution
La sortie que vous affichez contient dix fois la chaîne " x est un nombre premier". Cependant, cette chaîne est imprimée dans la clause else
de la boucle interne et est en tant que telle exécutée au plus une fois pour chaque exécution de la boucle interne.
La boucle externe effectuant huit itérations, " x est un nombre premier" ne peut pas être imprimé plus de huit fois. Ainsi, la sortie que vous affichez ne peut pas être générée par le code affiché.
Conclusion : quelque chose est louche. Pouvez-vous afficher le code tel que vous l'avez exécuté?
Edit: résolu!
Vous avez indenté de manière incorrecte la clause else, de sorte que Python l'a interprétée comme appartenant à l'instruction if
. Python considère un onglet comme des 8 espaces. Peut-être que votre éditeur affiche les onglets sous forme d’espaces 4 . De cette façon, vous avez peut-être manqué ce bogue. Conformément à PEP 8 , veuillez ne pas mélanger les onglets et les espaces, et Utilisez de préférence quatre espaces pour indenter votre code.
>>> 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
Autres conseils
Ma meilleure hypothèse est que votre déclaration 'else:' n'est pas correctement indentée et que votre résultat est logique. Vérifiez que l'indentation de votre autre utilisateur est au même niveau que 'pour x'.
I.e. vous utilisez:
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')
au lieu 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')
Vous devrez peut-être mettre à jour votre interpréteur Python.
Ce code fonctionne correctement pour moi (remarquez le numéro de version 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
Je pense que vous vous trompez d'indentés. Si je prends votre code et indente le reste pour qu'il soit sous l'instruction if, je reçois exactement le résultat obtenu.
Le code ci-dessous reproduit votre sortie,
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'
pendant
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'
Fait ce que vous voulez qu'il fasse.
Notez la différence dans l'indentation de l'autre.
Je pensais que else
devrait toujours être aligné sur si
. C'est ce que j'ai lu. Mais dans ce code générateur de nombres premiers, le seul moyen d’écrire les nombres premiers une fois est d’aligner else
avec pour x
. Donc, je n'ai aucune explication pour une telle identité. Bien que je commence tout juste à apprendre le python.