2012-03-31 4 views
3

Ich bin ein Neuling in Python. Ich habe diesen einfachen CodeWarum funktioniert nur der innerste dieser geschachtelten While-Schleifen?

a = 0 
b = 0 
c = 0 

while a <= 5: 
    while b <=3: 
     while c <= 8: 
      print a , b , c 
      c += 1 
     b += 1 
    a += 1 

Und arbeiten nur während mit C

0 0 0 
0 0 1 
0 0 2 
0 0 3 
0 0 4 
0 0 5 
0 0 6 
0 0 7 
0 0 8 

Warum? Wie man es repariert? Danke!

+4

Dies ist nicht, wie Sie Schleifen in Python schreiben sollten. Verwenden Sie 'für einen in Bereich (6)'. – georg

+0

@Ignacio Nicht sicher, ob der Titel einen Sinn ergibt? – agf

+0

@agf: repariert es. –

Antwort

7

Erster Weg

Ihr Weg wird funktionieren, aber Sie müssen bedenken, die Schleifenzähler bei jeder Iteration zurückgesetzt werden.

a = 0 
b = 0 
c = 0 

while a <= 5: 
    while b <=3: 
     while c <= 8: 
      print a , b , c 
      c += 1 
     b += 1 
     c = 0 # reset 
    a += 1 
    b = 0 # reset 
    c = 0 # reset 

Zweiter Weg (Pythonic)

Der erste Weg beinhaltet eine Menge Buchhaltung. In Python, desto einfacher Weg, um eine Schleife über einen Bereich von Nummern angeben, ist eine for Schleife über einen xrange * Iterator zu verwenden:

for a in xrange(5+1): # Note xrange(n) produces 0,1,2...(n-1) and does not include n. 
    for b in xrange (3+1): 
     for c in xrange (8+1): 
      print a,b,c 
  • Hinweis: In Python 3 xrange jetzt range genannt wird. (Oder genauer gesagt, 3 Python range ersetzt range Python 2.x und xrange.)

Dritter Weg (am besten)

Die zweite Möglichkeit kann durch die Anwendung von itertools.product() vereinfacht werden, was in einer Reihe Takes iteriert (listet) und gibt jede mögliche Kombination jedes Elements aus jeder Liste zurück.

import itertools 
for a,b,c in itertools.product(xrange(5+1),xrange(3+1),xrange(8+1)): 
    print a,b,c 

Für diese Tricks und mehr, lesen Sie Dan Goodger's "Code Like a Pythonista: Idiomatic Python".

+0

Es ist erwähnenswert, dass '' xrange() '' ein eingebauter Pre-Python 3.x ist, danach verwenden Sie '' range() ''. Obwohl es aufgrund der verwendeten '' print''-Syntax klar ist, dass das OP Python 2.x verwendet, ist es immer noch eine gute Idee, es für andere zu erwähnen. –

+0

@Lattyware: Wahr. Ich werde Ihren Kommentar als Hinweis für Py3k-Benutzer dienen lassen. ;) –

+0

Der dritte Weg ist auch das Pythonic! : D Hehe, ich bin nur mit dir beschäftigt ... – jamylak

6

Sie haben vergessen, b und c an der Spitze der Schleifen für a bzw. b zurückzusetzen. Deshalb verwenden wir stattdessen for Loops.

2

whe während c <= 8 wird geloopt während c <= 8 so c bekommt 8 und daher muss das Programm nie diese Schleife erneut ausführen.

Versuchen Sie c = 0 am Ende der Schleife, sowie Einstellung b und a auf 0 nach ihren Schleifen oder noch besser nutzen Sie Itertools oder For-Schleifen.

0

Nach der ersten while-Schleife wird c gleich 9. Sie setzen c nie zurück, c <= 8 wird nie wahr auf den a- oder b-Schleifen sein.

Wenn Sie jeden von ihnen vor ihren Schleifen zurücksetzen, wird es ordnungsgemäß funktionieren.

a = 0 
while a <= 5: 
    b = 0 
    while b <=3: 
     c = 0 
     while c <= 8: 
      print a , b , c 
      c += 1 
     b += 1 
    a += 1 
Verwandte Themen