Table of Contents

Wiederholungen

Es gibt zwei grundlegende Typen von Wiederholungen:

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

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?

Lösung

Lösung

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

Lösungsvorschläge

Lösungsvorschläge

teiler.py
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)
isprime.py
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)
faktorzerlegung1.py
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
faktorzerlegung2.py
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
primes1.py
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
primes2.py
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
primes3.py
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
eratosthenes.py
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
perfektezahl.py
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)