2012-03-31 70 views
3

我是Python新手。 我這個簡單的代碼爲什麼只有這些嵌套的while循環的最內層工作?

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 

而努力,而僅使用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 

爲什麼?如何解決它? 謝謝!

+4

這不是你應該如何在Python中編寫循環。使用'範圍(6)'。 – georg 2012-03-31 13:37:16

+0

@Ignacio不知道標題有什麼意義嗎? – agf 2012-03-31 13:43:52

+0

@agf:修正它。 – 2012-03-31 14:02:19

回答

7

第一種方式

你的方式將工作,但你必須記住要重置在每次迭代循環計數器。

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 

方式二(Python化)

第一種方法涉及到很多簿記。在Python中,指定了號碼範圍的循環更簡單的方法是通過一個xrange *迭代器使用for循環:

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 
  • 注:在Python 3,xrange現在被稱爲range。 (或者更準確地說,Python 3中range取代的Python 2.x的的rangexrange。)

第三方式(最佳)

的第二種方法可以通過應用itertools.product(),這需要在若干被簡化迭代(列表)並返回每個列表中每個元素的每個可能的組合。

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

對於這些技巧和更多,請閱讀Dan Goodger's "Code Like a Pythonista: Idiomatic Python"

+0

值得一提的是''的xrange()''是內建在Python 3.x的,在這之後,只要使用''範圍()''。雖然,由於使用了'print''語法,很明顯OP使用Python 2.x,所以爲其他人提供它仍然是一個好主意。 – 2012-03-31 13:42:05

+0

@Lattyware:沒錯。我會讓你的評論成爲Py3k用戶的通知。 ;) – 2012-03-31 13:43:27

+0

第三種方式也是Pythonic! :D Hehehe即時通訊只是在和你打交道...... – jamylak 2012-03-31 13:43:40

6

您忘記了分別在ab的迴路頂部重置bc。這就是爲什麼我們使用for循環代替。

2

雖然c <= 8得到循環,而c <= 8所以c得到8,因此程序再也不必執行該循環。

嘗試在循環結束時設置c = 0,並在其循環後將ba設置爲0,或者更好地使用itertools或for循環。

0

第一次while循環後,c將等於9.您從不重置c,所以c <= 8永遠不會在a或b循環中成立。

如果你重置他們每個人之前他們的循環,它會正常工作。

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