2008-12-15 18 views
7

Napisałem while loop w funkcji, ale nie wiem jak to zatrzymać. Kiedy nie spełnia swojego ostatecznego warunku, pętla po prostu trwa wiecznie. Jak mogę to zatrzymać?Jak zatrzymać pętlę While?

def determine_period(universe_array): 
    period=0 
    tmp=universe_array 
    while True: 
     tmp=apply_rules(tmp)#aplly_rules is a another function 
     period+=1 
     if numpy.array_equal(tmp,universe_array) is True: 
      break #i want the loop to stop and return 0 if the 
        #period is bigger than 12 
     if period>12: #i wrote this line to stop it..but seems it 
         #doesnt work....help.. 
      return 0 
     else: 
      return period 
+2

problem jest w swoim pytaniu. "kiedy nie spełnia swojego ostatecznego warunku ..". Nie testujesz ostatecznego warunku, mówisz "while true:". Prawda zawsze będzie prawdziwa. –

+0

dziękuję za komentarz, jestem tylko o połowę znany z pętli while .. tak naprawdę nie wiem jak zadać dobre pytanie .. – NONEenglisher

Odpowiedz

12

tylko wcięcia kodu poprawnie:

def determine_period(universe_array): 
    period=0 
    tmp=universe_array 
    while True: 
     tmp=apply_rules(tmp)#aplly_rules is a another function 
     period+=1 
     if numpy.array_equal(tmp,universe_array) is True: 
      return period 
     if period>12: #i wrote this line to stop it..but seems its doesnt work....help.. 
      return 0 
     else: 
      return period 

Musisz zrozumieć, że oświadczenie w swoim przykładzie break wyjdzie z nieskończoną utworzoną z while True pętlę. Tak więc, gdy warunek przerwania ma wartość True, program opuści nieskończoną pętlę i przejdzie do następnego wciętego bloku. Ponieważ w twoim kodzie nie ma następującego bloku, funkcja kończy się i nic nie zwraca. Naprawiłem Twój kod, zastępując oświadczenie break oświadczeniem return.

obserwuję swój pomysł do wykorzystania w nieskończoną pętlę, jest to najlepszy sposób, żeby to napisać:

def determine_period(universe_array): 
    period=0 
    tmp=universe_array 
    while True: 
     tmp=apply_rules(tmp)#aplly_rules is a another function 
     period+=1 
     if numpy.array_equal(tmp,universe_array) is True: 
      break 
     if period>12: #i wrote this line to stop it..but seems its doesnt work....help.. 
      period = 0 
      break 

    return period 
+0

Próbowałem tego również. Ale daje to źle rusult ... – NONEenglisher

+0

tak, ponieważ miałeś kolejny błąd w twoim kodzie: instrukcja break, która uniemożliwiła twojej funkcji zwracanie czegoś. Usunąłem to teraz. – Mapad

+0

..powoduje to, że zawsze zwraca 1 – NONEenglisher

8
def determine_period(universe_array): 
    period=0 
    tmp=universe_array 
    while period<12: 
     tmp=apply_rules(tmp)#aplly_rules is a another function 
     if numpy.array_equal(tmp,universe_array) is True: 
      break 
     period+=1 

    return period 
+0

+1, ale byłoby miło wskazać, co + dlaczego," podczas gdy prawda "eeek – annakata

+0

nie działa .... wracają złe reslut .. zawsze wraca 13 – NONEenglisher

+0

Joel pętli kodu, aż okres 12 niż przestać zapętlać i zwracać okres ... to jest normalne ... Kod Joela nie jest tym, czego potrzebujesz –

2

Operator w Pythonie is prawdopodobnie nie robi tego, co można się spodziewać. Zamiast tego:

if numpy.array_equal(tmp,universe_array) is True: 
     break 

chciałbym napisać to tak:

if numpy.array_equal(tmp,universe_array): 
     break 

W is testy operator obiektu tożsamość, która jest zupełnie inna od równości.

0

Chciałbym zrobić to za pomocą pętli for jak pokazano poniżej:

def determine_period(universe_array): 
    tmp = universe_array 
    for period in xrange(1, 13): 
     tmp = apply_rules(tmp) 
     if numpy.array_equal(tmp, universe_array): 
      return period 
    return 0 
Powiązane problemy