2009-02-17 14 views
0

Comment créer des boucles imbriquées dans Python (version 3.0)?Quel est le problème avec mes boucles imbriquées en Python?

Je suis en train de faire les boucles pour me montrer les produits de deux nombres:

def PrintProductsBelowNumber(number): 
    number1 = 1 
    number2 = 1 
    while number1 <= number: 
     while number2 <= number: 
      print(number1, "*", number2, "=", number1 * number2) 
      number2 += 1 
     number1 += 1 

PrintProductsBelowNumber(2) 

En conséquence, je reçois:

1 * 1 = 1 
1 * 2 = 2 

Il semble donc la boucle extérieure sur nombre1 fait pas exécuté.

Comment puis-je obtenir la boucle sur nombre1 à courir, et obtenir ainsi:

1 * 1 = 1 
1 * 2 = 2 
2 * 1 = 2 
2 * 2 = 4 

Répondre

8

Parce que vous ne définissez pas number2 à 1 après la boucle intérieure complète la première fois. number1 augmente alors, mais comme number2 est encore trop élevé, la boucle interne ne s'exécute pas à nouveau.

def PrintProductsBelowNumber(number): 
    number1 = 1 
    while number1 <= number: 
     number2 = 1 
     while number2 <= number: 
      print(number1, "*", number2, "=", number1 * number2) 
      number2 += 1 
     number1 += 1 

PrintProductsBelowNumber(2) 

EDIT: La solution d'Adam est beaucoup mieux en général, mais cela est de montrer pourquoi la vôtre ne fonctionnait pas comme vous pensez qu'il devrait en premier lieu.

+1

@Mike Boers: Merci pour votre réponse. Oui, votre exemple montre clairement pourquoi mon morceau de code n'a pas fonctionné comme prévu. –

14

number2 ne s'initialise qu'une fois, vous devez le réinitialiser pour chaque itération de la boucle interne. Cependant, ce code est très C-like et pas très Pythonic. La meilleure façon de le faire serait d'utiliser la construction for number in range(n):

def PrintProductsBelowNumber(number): 
    for number1 in range(1, number+1): 
     for number2 in range(1, number+1): 
      print(number1, "*", number2, "=", number1 * number2) 
+0

@Adam Rosenfield: Merci pour la réponse; et merci de me montrer le chemin Python ... –

0

Vous pouvez modifier la solution d'Adam avec une compréhension de la liste:

def PrintProductsBelowNumber(number): 

    results = [(i, j, i * j) for i in range(1, number + 1) 
          for j in range(1, number + 1)] 

    for number1, number2, result in results: 
     print(number1, "*", number2, "=", result) 

ou une variante de celui-ci.