Wyjątek w pętli while True

0

Jak sformułować kod w pętli while True, żeby program wykonał coś tylko raz? Mój program wypisuje wiele wartości w danym zakresie, ale chcę, żeby wykonał polecenie tylko raz na samym początku, jeśli wartość wynosi 0, a także żeby wykonywał to cyklicznie.

Tzn. mam długi czas wartości równe 0 (wykonuje tylko raz polecenie), później mam wartości w okolicach 300, znowu równe 0 (i znowu wykonuje tylko raz polecenie).

0

Napisz to jeszcze raz, bo szczerze mówiąc nic z tego nie rozumiem.
Pętle (także typu for..while) są właśnie po to, żeby powtarzać dane fragmenty kodu wiele razy - stąd nie rozumiem, o co Ci chodzi, kiedy piszesz o wykonaniu czegoś jeden raz.
Z drugiej strony - może chodzi Ci o to, żeby na początku pętli dać jakiegoś if'a, który sprawdzi warunek i jeśli jest spełniony, to wykona daną operację w tym konkretnym przebiegu pętli, a później pętla się powtórzy i ponownie zostanie sprawdzony warunek if'a....
Napisz jaśniej, bo na razie to jest takie zgadywanie "co autor miał na myśli".

0

Chodzi właśnie o to, że w pętli while True program wypisuje wartości liczbowe. Chciałbym, żeby wykonał polecenie, jeśli wartość jest równa 0 tylko raz. Ale jako, że jest to w pętli while True wypisuje wartość 0 kilkanaście razy i wykonuje polecenie kilkanaście razy. Zastanawiam się czy istnieje jakaś funkcja, żeby program ignorował już wartości 0, jeśli wykona polecenie. Próbowałem napisać funkcję przed pętlą, ale wtedy wykonuje się tylko jedyny raz, a mnie zależy, żeby ta czynność się powtarzała po tym jak wartość się zmieni na np. 100 i jak jest 0 to znowu jeden raz wykonuje polecenie.

0

Wrzuć konkretny kod, bo inaczej chyba nie dojdziemy do porozumienia ;)

0

Kod jest długi, więc podam tylko jego zarys:

while True:
    zmienne

    if zmienna < 100:
        polecenie
    if 200 < zmienna < 300:
        polecenie
    itd.

I tak jak pisałem wcześniej wypisuje 0.0 np. 30 razy na samym początku przez 4 sekundy, później wypisuje >100 podobnie 30-40 razy, a następnie wypisuje znowu 0.0 kilkadziesiąt razy. I polecenia wykonują się tyle razy ile wypisze się wartość.

Wygląda to w ten sposób:

0.0 (wykonuje polecenie)
0.0 (wykonuje polecenie)
0.0 (wykonuje polecenie)
 itd.
120.0 (wykonuje polecenie)
120.0 (wykonuje polecenie)
 itd.
0.0 (wykonuje polecenie)
0.0 (wykonuje polecenie)
 itd.

A mi zależy na:

0.0 (wykonuje polecenie)
0.0
0.0
0.0
 itd.
120.0 (wykonuje polecenie)
120.0
 itd.

Jak coś jeszcze jest niejasne to napisz czego nie rozumiesz.

0

while true - czyli jest to pętla nieskończona. Czy nie lepiej zamiast tego zastosować jakiegoś timera, który co pewien czas (np. co 1/10 sekundy) wywoła określone zdarzenie? Szkoda, że nie napisałeś co ten program ma konkretnie robić. W obecnej postaci on mieli pętlę ogromną ilość razy na sekundę - praktycznie tyle, ile jest w stanie procesor obsłużyć. Czy to na pewno jest Ci potrzebne?

Po drugie - nie piszesz nic o zmianach wartości zmiennej - czy się ona zmienia w wyniku działań wykonywanych w pętli, czy może jest zmieniania z zewnątrz - np. odczyt daty/godziny, albo jakiś inny wątek, który wykonuje jakieś obliczenia i ich wynik wstawia do zmiennej.

Napisz to jeszcze raz, bo nadal za bardzo nie rozumiem w czym jest problem ani co chcesz zrobić/osiągnąć :(

0

Może zrób maszynę stanów na switchu ALE sprecyzuj jeszcze jak kod ma działać bo chciałbym się upewnić czy dobrze rozumiem :)

0

Może coś takiego:

encountered = []
while True:
   if i not in encountered:
       encountered.append(i)
       print(i)
0

How it can help you:
while True:
zmienne

if zmienna < 100:
    polecenie
if 200 < zmienna < 300:
    polecenie
itd.
2

Hej,
zamiast się bawić w rozważania całej pętli i warunkowanie, to wychwyć w odpowiednim momencie unikaty. W Pythonie można to załatwić jedną komendą:

zmienne = set(zmienne)

o ile zmienne są np. listą :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1