Problem mit while-Schleife

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
georgebaker
User
Beiträge: 25
Registriert: Freitag 12. April 2013, 19:53

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
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.
georgebaker
User
Beiträge: 25
Registriert: Freitag 12. April 2013, 19:53

@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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
georgebaker
User
Beiträge: 25
Registriert: Freitag 12. April 2013, 19:53

@Sirius3:

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