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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top