Abstraktion von Anweisungen durch Prozeduren

Das Programm zur Ausgabe aller Primzahlen bis zu einer Obergrenze legt die Obergrenze im Programmtext fest. Statt alle Primzahlen bis zu einer konkreten Obergrenze auszugeben, können wir auch ein Programm zur Ausgabe aller Primzahlen bis zu einer beliebigen Obergrenze schreiben. Dazu abstrahieren wir die Zählschleife mit Hilfe einer Prozedur primes_up_to mit einem Parameter max.

def primes_up_to(max):
  for i in range(2, max+1):
    if is_prime(i):
      print(i)

Nun können wir z.B. in der interaktiven Python-Shell die Anweisungen primes_up_to(100) und primes_up_to(1000) ausführen, um alle Primzahlen bis 100 bzw. 1000 im Terminal auszugeben.

Prozeduren haben keinen Rückgabewert, enthalten also keine return-Anweisung. Sie können verwendet werden, um mit print-Anweisungen komplexe Ausgaben im Terminal zu erzeugen.

Zum Beispiel gibt die folgende Prozedur den Umriss eines Quadrats aus Sternchen im Terminal aus:

def put_quadrat(size):
  line = ''
  for i in range(0,size):
    line = line + '*'
  
  inside = ''
  for i in range(0, size-2):
    inside = inside + ' '
    
  print(line)
  for i in range(0, size-2):
    print('*' + inside + '*')
  print(line)

Da wir das Quadrat zeilenweise ausgeben müssen, berechnen wir zunächst den oberen Rand als Zeile aus Sternchen gegebener Länge und speichern ihn in der Variable line. Danach berechnen wir das Innere als um zwei Zeichen kürzere Zeile inside aus Leerzeichen. Im Anschluss geben wir den oberen Rand gefolgt von Zeilen, die das Innere mit Sternchen umranden aus. Schließlich geben wir noch einmal line als unteren Rand aus.

Hier sind zwei Beispielausgaben dieser Prozedur in der Python-Shell:

>>> from quadrat import *
>>> put_quadrat(3)
***
* *
***
>>> put_quadrat(5)
*****
*   *
*   *
*   *
*****

Bei der Definition der Prozedur put_quadrat fällt eine Ähnlichkeit des Codes zur Berechnung der oberen und unteren Zeile sowie des inneren des Quadrates auf. Beide Male wird eine gegebene Zeichenkette eine bestimmte Anzahl oft wiederholt. Wir können unser Programm vereinfachen, indem wir diese Berechnung als Funktion abstrahieren und dann innerhalb von put_quadrat verwenden:

def repeat(times, string):
  result = ''
  for i in range(0, times):
    result = result + string
  return result

def put_quadrat(size):
  print(repeat(size, '*'))
  for i in range(0, size-2):
    print('*' + repeat(size-2, ' ') + '*')
  print(repeat(size, '*'))

Der Rückgabewert der Funktion repeat ist eine Zeichenkette. Innerhalb der Prozedur put_quadrat werden verschiedene solcher Zeichenketten berechnet und mit print-Anweisungen im Terminal ausgegeben.