2016-12-29 1 views
-13

Il ya quelques jours, j'ai acheté un livre intitulé "Python for Kids (For Dummies)". À la page 47, il est un exemple d'un simple bloc de code:malentendu du code fondamental

a = 2 
while a < 10: 
    a = a + 1 
    print (a) 

Il en résulte la séquence:

3 4 5 6 7 8 9 10 

Je pense que ce résultat est incorrect parce que:

  • ' 2 'n'est pas imprimé en dépit d'être déclaré dans la première ligne du code.
  • '10' est imprimé, même si 10 est égal à lui-même (en violation de la condition a < 10).

Même si je fais la condition 'while' a <= 10, il imprime les nombres 3 à 11, ce qui est encore incorrect.

Ce que je pense, devrait être le bon code est la suivante:

a = 2 
while a < 10: 
    print (a) 
    a = a + 1 

Résultant dans:

2 3 4 5 6 7 8 9 

Voici ce que j'attendais du code. J'ai joué un petit peu avec le code et assez intéressant, Python permet d'étranges arrangements qui sont exécutables sans erreur mais totalement incorrects! Par exemple:

a = 2 
while a < 30: 
    a = a + 5 
print (a) 

Il en résulte uniquement le nombre '32', ce qui semble être incorrect.

Si j'indenter print (a) par 4 espaces, je reçois:

7 12 17 22 27 32 

Cela semble également être incorrect. Pouvez-vous m'expliquer pourquoi je reçois ces sorties?

+3

Le code est exécuté ligne par ligne. Déballez la boucle while, et vous verrez facilement l'incrément et l'impression sont effectués avant que la condition suivante ne soit vérifiée. –

+7

Vous ne devriez pas supposer que tout le monde, sauf vous, a tort. – user2357112

+1

bienvenue dans le monde étrange de la programmation informatique :) –

Répondre

2

Dans le premier code, notez la ligne avant l'instruction print: elle ajoute 1 à a avant toute impression. Bien sûr, si vous changez le code, le résultat peut être différent. Donc, à moins que votre livre affirme que la production qui devrait être produite est différente de ce qui est réellement produit, le livre n'est pas faux. Au lieu de supposer que Python est mauvais, peut-être vous devriez considérer la possibilité que vous ne comprenez pas comment fonctionne Python.

4

C'est exactement ce qui est supposé arriver. La condition tandis que la boucle ou pour est testée seulement en haut de la boucle; il n'y a pas de test pendant l'opération en boucle. Ainsi, vous pouvez modifier la variable de contrôle de boucle (un dans ce cas) autant que vous le souhaitez dans le corps de la boucle et la clause tandis que ne réagira pas tant que vous ne retournerez pas en haut de la boucle.code équivalent à votre dernier exemple serait quelque chose comme ceci:

a = 2 
while True: 
    if not a < 30: 
     break 
    a = a + 5 

print (a) 

La boucle ne sort pas jusqu'à ce que un reçoit une valeur qui viole la en condition. Si vous imprimez après un est mis à jour, vous garantie que la dernière valeur de un violera cette condition.

1

Je marcherai à travers l'exécution de cet exemple, une instruction à la fois afin que vous puissiez voir

(1) a = 2 
(2) while a < 10: 
(3)  a = a + 1 
(4)  print (a) 
  • Ligne 1: Set a à 2.
  • Ligne 2: Test si a est inférieur à 10. C'est! Donc, nous entrons dans le corps de la boucle while:
  • Ligne 3: Augmenter a par 1. a est maintenant 3.
  • Ligne 4: Imprimer a (ce qui est 3).
  • Ligne 2: Retour en haut de la boucle pour tester la condition de boucle: Teste si a est inférieur à 10. C'est le cas! Entrez le corps de la boucle while pour la deuxième fois.
  • Ligne 3: Augmentation a par 1. a est maintenant 4.
  • Ligne 4: Imprimer a (ce qui est 4).
  • Ligne 2: Test de la condition de boucle: a est toujours inférieur à 10. Continuez à exécuter le corps de la boucle.
  • Ligne 3: Augmenter a par 1. a est maintenant 5.
  • Ligne 4: Imprimer a (ce qui est 5).
  • Ligne 2: Test de la condition de boucle: a est toujours inférieur à 10. Continuez à exécuter le corps de la boucle.
  • Ligne 3: Augmentation a par 1. a est maintenant 6.
  • Ligne 4: Imprimer a (ce qui est 6).
  • Ligne 2: Test de la condition de boucle: a est toujours inférieur à 10. Continuez à exécuter le corps de la boucle.
  • Ligne 3: Augmenter a par 1. a est maintenant 7.
  • Ligne 4: Imprimer a (ce qui est 7).
  • Ligne 2: Test de la condition de boucle: a est toujours inférieur à 10. Continuez à exécuter le corps de la boucle.
  • Ligne 3: Augmentation a par 1. a est maintenant 8.
  • Ligne 4: Imprimer a (ce qui est 8).
  • Ligne 2: Test de la condition de boucle: a est toujours inférieur à 10. Continuez à exécuter le corps de la boucle.
  • Ligne 3: Augmentation a par 1. a est maintenant 9.
  • Ligne 4: Imprimer a (ce qui est 9).
  • Ligne 2: Test de la condition de boucle: a est toujours inférieur à 10. Continuez à exécuter le corps de la boucle.
  • Ligne 3: Augmenter a par 1. a est maintenant 10.
  • Ligne 4: Imprimer a (qui est de 10).
  • Ligne 2: Test de la condition de boucle: a n'est pas inférieure à 10. La boucle est terminée. L'exécution continue avec la déclaration suivante après la boucle. S'il n'y a rien de plus, le programme se termine.

J'espère que vous pouvez voir à partir de cela que Python fonctionne correctement et que la sortie n'est pas étrange.

Si vous déplacez print (a) ci-dessus a = a + 1 il imprime la juste valeur avant de l'augmenter, donc pourquoi il donne une sortie de 2 à 9 au lieu de 3 à 10.

Python permet des arrangements étranges qui sont exécutable sans erreurs mais totalement incorrect! Par exemple:

a = 2 
    while a < 30: 
     a = a + 5 
    print (a) 

Il en résulte uniquement le nombre '32', ce qui semble être incorrect.

Les ordinateurs font exactement ce que vous leur dites, c'est leur force et leur faiblesse. Dans votre code modifié, a est augmenté de 5 alors qu'il est inférieur à 30. Donc il augmente de 2 → 7 → 12 → 17 → 22 → 27 → 32. Puis il sort de cette boucle, puisque 32 n'est pas inférieur à 30. Puis il imprime a, ce qui est 32. Parce que l'instruction d'impression n'est pas indentée, elle est en dehors de la boucle, elle n'est donc pas exécutée tant que la boucle n'est pas terminée.