Seite 1 von 1

Problem mit while-Schleife

Verfasst: Freitag 12. April 2013, 20:19
von georgebaker
Hallo,

Wie der Titel schon sagt habe ich ein Problem mit einer while-Schleife. Ich habe erst vor einer Woche mit Python angefangen, also bitte etwas Nachsicht. :)

Zum Programm:
Ich versuche gerade ein Programm zu schreiben das mir Zahlen darauf testet ob sie Primzahlen sind. Zuerst wird eine Textdatei (primzahlen2.txt) geöffnet und alle Zahlen (Primzahlen) die sich darin befinden eingelesen. Danach werden alle ungeraden Zahlen durch die eingelesenen Zahlen dividiert. Schließlich soll bei einem Fund die Primzahl ans Ende der Textdatei geschrieben werden um dann wieder von vorne anzufangen. Leider scheint in der zweiten while-Schleife ein Fehler zu sein, den ich aber einfach nicht finden kann.

Inhalt der Textdatei (primzahlen2.txt):
2, 3, 5, 7,

Zum Problem:
Die zweite while-Schleife sollte eigentlich bei einem Fund nicht mehr ausgeführt werden und die Werte wieder zurückgesetzt werden. Aber sie wird solange ausgeführt bis der Index zu hoch ist und eine Fehlermeldung wird ausgegeben.

Ausgabe des Programms mit Fehlermeldung:

Code: Alles auswählen

9
Traceback (most recent call last):
  File "/home/mathias/Dokumente/Programmieren/Python/neuprim.py", line 11, in <module>
    while (zahlendurchlauf % int(primzahlen[i][0]) != 0):
IndexError: list index out of range

Code: Alles auswählen

zahlendurchlauf = 9
i = 0

while True:
    einlesen = open("primzahlen2.txt", "r")
    for line in einlesen:
        line = line.strip()
        primzahlen = line.split(", ")
    einlesen.close()
    
    while (zahlendurchlauf % int(primzahlen[i][0]) != 0):
        i += 1
        
    zahlendurchlaufstring = str(zahlendurchlauf)
    ausgabe = open("primzahlen2.txt", "a")
    ausgabe.write(zahlendurchlaufstring + ", ")
    ausgabe.close()
    print (zahlendurchlauf)
    i = 0
    zahlendurchlauf += 2
Ich weiß, dass es schnellere Methoden zur Primzahlberechnung gibt, aber fürs Erste reicht mir diese Methode aus.
Kritik und Verbesserungsvorschläge zum Code werden gerne angenommen. Bin schließlich am Lernen. :D

Vielen Dank im Vorraus,
georgebaker

Re: Problem mit while-Schleife

Verfasst: Freitag 12. April 2013, 21:38
von BlackJack
@georgebaker: Das Problem lässt sich ganz einfach umgehen wenn Du den Indexzugriff sein lässt und wie man das in Python macht mit einer ``for``-Schleife über die Zahlen iterierst, statt mit ``while`` und einem manuell hochgezählten Index. Ansonsten schau doch einfach mal welche Werte `i` so annimmt, insbesondere auch im zweiten Durchlauf der Endlosschleife.

Ansonsten sind da aber noch andere Fehler und unsinnige Sachen drin. Zum Beispiel macht es keinen Sinn die Datei *jedes* mal wieder einzulesen, statt das einmal am Anfang zu erledigen. *Dort* sollte man die „Zahlen” aus der Datei auch *einmal* in den Datentyp Zahl umwandeln. Und vielleicht auch die *ganze* Zahl und nicht nur die erste Ziffer von jeder Zahl.

Statt bei 9 zu beginnen, solltest Du bei der ersten ungeraden Zahl nach letzten Zahl aus der Datei anfangen.

Du triffst auch nirgends eine Entscheidung ob `zahlendurchlauf` (komischer Name) denn nun eigentlich eine Primzahl ist oder nicht. *Jede* (ungerade) Zahl landet so in der Datei.

Re: Problem mit while-Schleife

Verfasst: Sonntag 14. April 2013, 09:35
von georgebaker
@BlackJack:
Danke für die Tipps. Das Problem wenn ich über eine for-Schleife iteriere ist, dass ich keinen Zugriff auf die einzelnen Zahlen in der Liste habe. D.h. das immer alle Zahlen in der Textdatei mit der aktuellen Zahl dividiert werden um zu schauen ob ein Rest übrig bleibt. Am Beispiel 9: wird es durch 2 dividiert bleib natürlich ein Rest übrig, obwohl es durch 3 ohne Rest dividierbar ist. Ich könnte zwar mit range(len(primzahlen)) einen Index erzeugen und diesen wieder hochzählen, aber dann habe ich wieder das gleiche.

Oder gibt es eine Möglichkeit, innerhalb einer for-Schleife zu prüfen, ob eine der Bedingungen von allen Zahlen die iteriert wurden, erfüllt wurden?

SG,
george

Re: Problem mit while-Schleife

Verfasst: Sonntag 14. April 2013, 10:03
von Sirius3
@georgebaker: was Du wahrscheinlich suchst ist »break« mit dem man beim ersten Auftreten einer Primzahl, die die zu testende Zahl ohne Rest teilt, die for-Schleife beenden kann.

Alternativ gibt es in Python »all« bzw. »any«:

Code: Alles auswählen

 is_prime = all(zahl % primzahl != 0 for primzahl in primzahlen)

Re: Problem mit while-Schleife

Verfasst: Sonntag 14. April 2013, 10:32
von georgebaker
@Sirius3:

Perfekt! Mit 'all' funktioniert es. Vielen Dank. :D