Ich habe Dir doch den Tipp gegeben, das ganze erst einmal Schritt für Schritt aufzubauen! Wieso machst Du augenscheinlich schon wieder mit dem Primzahltest rum, wenn Du doch erst einmal das Problem lösen willst, eine Schleife unter einer bestimmten
Bedingung abzubrechen?
Man programmiert Stück für Stück, nicht alles auf einmal!
Also, eine Schleife, die bis 100 zählt:
Wenn ich die Schleife beim 10. Durchlauf verlassen will, muss ich also irgend wie das `break`-Statement hinschreiben:
Code: Alles auswählen
In [67]: for index in range(100):
....: print(index)
....: break
....:
0
Mist! Nach dem ersten Durchlauf ist Schluss. Logisch, da `break` ohne Bedingung angelaufen wird. Die Bedingung ist ja, dass `index` den Wert 10 erreicht hat. Beim Wort
Bedingung sollte es auch bei Dir "schrillen" -> `if`!!!
Aha, wir müssen also eine Bedingung formulieren, die prüft, ob `index == 10` ist. Wenn ja, dann soll die Schleife abgebrochen werden:
Code: Alles auswählen
In [68]: for index in range(100):
....: print(index)
....: if index == 10:
....: break
....:
0
1
2
3
4
5
6
7
8
9
10
Im Teil der Doku, auf den ich Dich verwiesen hatte, steht übrigens auch eine Bedingung mit `if` als Kopf des Blocks, in dem dann `break` aus der Schleife aussteigt. Wäre das nicht selber zu erarbeiten gewesen?
So weit so gut.
Für die Berechnung von Primzahlen wissen wir aber nicht, wie weit wir zählen müssen. Also können wir `range` nicht nutzen. Doof! Aber BlackJack hatte ja mal was von `itertools.count` erwähnt. Also flux in die Doku gucken und sehen was das Teil macht:
Python Doku hat geschrieben:
itertools.count(start=0, step=1)
Make an iterator that returns evenly spaced values starting with n. Often used as an argument to imap() to generate consecutive data points. Also, used with izip() to add sequence numbers. Equivalent to:
Code: Alles auswählen
def count(start=0, step=1):
# count(10) --> 10 11 12 13 14 ...
# count(2.5, 0.5) -> 2.5 3.0 3.5 ...
n = start
while True:
yield n
n += step
When counting with floating point numbers, better accuracy can sometimes be achieved by substituting multiplicative code such as: (start + step * i for i in count()).
Mit anderen Worten zählt `count` von einem bestimmten Startwert ab bis ins Unendliche (theoretisch). Wir können damit also alle Zahlen Schritt für Schritt erzeugen, ohne
vorher (wie bei `range`) die letzte Zahl zu kennen, die wir untersuchen müssen.
Schreiben wir das Snippet aus [68] einfach mal mit `count`:
Code: Alles auswählen
In [69]: from itertools import count
In [70]: for index in count():
....: print(index)
....: if index == 10:
....: break
....:
0
1
2
...
Klappt also ganz einfach.
Du brauchst nun noch eine Funktion `is_prime`, die für einen übergebenen Wert prüft, ob es sich um eine Primzahl handelt. Wenn ja hängst Du diese an die Liste der gefundenen Primzahlen an
und prüfst, ob diese Liste schon 15 Einträge hat. Wenn ja, musst Du dann die Schleife via `break` abbrechen.