====== Wiederholungen ====== Es gibt zwei grundlegende Typen von Wiederholungen: * Die Anzahl Wiederholungen ist schon vor der Wiederholung bekannt: **for**-loops * Die Anzahl Wiederholungen ist nicht bekannt: **while**-loops ===== for-loops ===== Ein for-loop besteht aus zwei Elementen: Eine **Laufvariable** und einen Bereich. ==== Typischer Fall ==== for i in range(10): print(i) Gibt die Zahlen von 0 bis 9 aus (10 Wiederholungen). Die **Laufvariable** ist i, der **Bereich** range(10), was den Zahlen von 0 bis und mit 9 entspricht. ==== range-Varianten ==== * range(n): Zahlen von 0 bis und mit n-1 * range(a,b): Zahlen von a bis und mit b-1 * range(a,b,s): Zahlen von a in s-Schritten bis zur grössten Zahl, die kleiner als b ist for i in range(10,20,3): print(i) # Liefert 10,13,16,19 ==== Iteration über Listen und Arrays ==== prim = (2,3,5,7,11,13,17,19) for p in prim: print("%d ist prim" % (p,)) Die Elemente des Arrays könnten auch beliebige Dinge sein. ===== while-loops ===== Ein while-loop wird so lange wiederholt, wie eine Bedingung wahr ist. n=0 k=100 p=1.01 while (k<200): # Wiederhole solange wie k<200 k*=p # Kurzform für k = k*p n+=1 # Kurzform für n = n+1 print(n) Was berechnet das obige Programm? Das Programm berechnet die Anzahl Jahre, die nötig sind, bis das Ausgangskapital $k$ bei einem Zinsatz von $p-1$ auf über 200 angewachsen ist. ==== Endlos-Schleife ==== import time while True: print("immer und immer wieder") time.sleep(0.5) # Ein bisschen Pause, damit die Ausgabe nicht komplett überläuft. ===== break, continue ===== Manchmal ist es wünschenswert, eine ''while''- oder ''for'-Schleife irgendwo innerhalb abzubrechen (**break**) oder direkt zur nächsten Wiederholung (**continue**) zu springen, ohne den Rest des Blocks auszuführen. a = 1 while a<10: a+=1 if a>5: break # Sofort die while-Schlaufe beenden print("Sonst noch was mit %d tun" % a) a = 1 while a<10: if a%2==0: # Wenn der Rest der Divison von a durch 2 Null ist, d.h. wenn a gerade ist. a+=3 continue # Nächste Wiederholung # Was kompliziertes mit a machen a+=1 ===== Verschachtelte loops ===== for i in range(5): for j in range(5): print("%d * %d = %d" %(i,j,i*j)) ===== Zeilenumbrüche ===== Sie können eine print-Ausgabe ohne Zeilenumbruch erreichen, indem Sie nach der schliessenden Klammer ein Komma anfügen: print("Es geht "), print("noch weiter") Leider wird damit auch ein Leerschlag eingefügt. Noch mehr Kontrolle hat man, wen man die ganze Zeile erst in einem String aufbaut und diesen am Schluss ausgibt: zeile = "Die Zahlen 1" for i in range(2,5): zeile += ", %d" % (i*i) print(zeile) # Ausgabe: Die Zahlen 1, 4, 9, 16 ====== Aufgaben ====== Lesen Sie jeweils die Eingabe für das Programm von der Tastatur ein: z = int(raw_input("Zahl = ")) Sie können wie folgt überprüfen, ob eine Zahl a durch eine Zahl b teilbar ist: if a % b == 0: # Wenn der Rest der Division von a durch b gleich Null ist, ist a durch b teilbar # Tu was * Schreiben Sie ein Programm, das sämtliche Teiler der eingegebenen Zahl ausgibt. * Schreiben Sie ein Programm, das überprüft, ob die eingegebene Zahl eine Primzahl ist. * Schreiben Sie ein Programm, das die Primfaktorenzerlegung der eingegeben Zahl ausgibt. In einem der beiden Formate * Primfaktorzerlegung von 123456 = 1 * 2 * 2 * 2 * 2 * 2 * 2 * 3 * 643 * Primfaktorzerlegung von 123456 = 1 * 2^6 * 3 * 643 * Schreiben Sie ein Programm, das eine Primzahl nach der anderen ausgibt. * Schreiben Sie ein Programm, das perfekte Zahlen sucht, d.h. solche, die gleich der Summe Ihrer Teiler (sich selbst ausgenommen) sind. import sys z = int(raw_input("Zahl = ")) sys.stdout.write("Teiler von %d: " % z) for t in range(1,z): if (z % t == 0): sys.stdout.write("%d, " %t) print(z) z = int(raw_input("Zahl = ")) isprime = True for t in range(2,int(z**0.5)+1): if (z%t==0): isprime = False print("%d ist nicht prim, weil durch %d teilbar!" % (z,t)) break if isprime: print("%d ist prim!" % z) import sys z = int(raw_input("Zahl = ")) sys.stdout.write("Primfaktorzerlegung von %d = 1" % z) t =2 while z>1: while (z % t == 0): z/=t sys.stdout.write(" * %d" % (t,)) t+=1 import sys z = int(raw_input("Zahl = ")) sys.stdout.write("Primfaktorzerlegung von %d = 1" % z) t =2 while z>1: e = 0 while (z % t == 0): e+=1 z/=t if e>1: sys.stdout.write(" * %d^%d" % (t,e)) elif e>0: sys.stdout.write(" * %d" % (t,)) t+=1 import sys n = 0 z = 2 while True: prime = True for t in range(2,z): if (z % t==0): prime = False if prime: sys.stdout.write("%d " % z) n+=1 if n%20 == 0: print z+=1 import sys n = 0 z = 2 while True: prime = True for t in range(2,int(z**0.5)+1): if (z % t==0): prime = False if prime: sys.stdout.write("%d " % z) n+=1 if n%20 == 0: print z+=1 import sys n = 0 primes = [2] sys.stdout.write("2 ") z=3 while z<1000000: prime = True for p in primes: if p*p>z: break if (z % p==0): prime = False if prime: sys.stdout.write("%d " % z) n+=1 primes.append(z) if n%20 == 0: print z+=2 import sys n = 1000000 primes = [i>1 for i in range(0,n+1)] p = 2 while (p*p<=n): for i in range(p*p,n+1,p): primes[i]=False p+=1 while (not primes[p]): p+=1 np=0 for i in range(0,n+1): if primes[i]: sys.stdout.write("%d " % i) np+=1 if np%20 == 0: print z = 2 while True: s = 1 t = 2 while t*t<=z: if z%t == 0: s+=t if t!=z/t: s+=z/t t+=1 if s==z: print("Perfekte Zahl %d" % z) z+=1 if (z%100000==0): print("[%d]" % z)