Почему работают только самые внутренние из этих вложенных циклов while? - PullRequest
3 голосов
/ 31 марта 2012

Я новичок в Python.У меня есть этот простой код

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 ]

7 голосов
/ 31 марта 2012

Первый путь

Ваш способ будет работать, но вы должны помнить, что нужно сбрасывать счетчики циклов на каждой итерации.

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

Второй способ (Pythonic)

Первый способ включает много бухгалтерии. В Python более простой способ задать цикл для диапазона чисел - использовать цикл for над итератором xrange*:

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 range и xrange.)

Третий способ (лучший)

Второй способ может быть упрощен применением itertools.product(), которое принимает несколько итераций (списков) и возвращает каждую возможную комбинацию каждого элемента из каждого списка.

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

Чтобы узнать об этих приемах и прочем, прочитайте "Код, подобный Pythonista: Idiomatic Python" Дэна Гуджера .

6 голосов
/ 31 марта 2012

Вы забыли сбросить b и c в верхней части цикла для a и b соответственно.Вот почему вместо этого мы используем for петли.

2 голосов
/ 31 марта 2012

когда c <= 8 зацикливается, пока c <= 8, поэтому c достигает 8, и поэтому программе больше не нужно выполнять этот цикл.

Попробуйте установить c = 0 в конце цикла, а также установить b и a на 0 после их циклов или, что еще лучше, использовать itertools или для циклов.

0 голосов
/ 31 марта 2012

После того, как первый цикл 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...