Übersicht

  => Python im Vergleich
  => Beispiele

  => Aufgaben

Python im Vergleich

=> Funktionen

Erst das Beispiel:

def menu1():

dann die Erklärung: Eine Funktionsvereinbarung in Python

Nach dem Doppelpunkt wird traditionell eingerückt, und du schreibst ein paar sinnvolle Python-Befehle hin. Der Aufruf der Funktion erfolgt durch Aufruf des Funktionsnamens inklusive der Parameterliste (!), hier also durch den Aufruf:
  menu1()
Hier ein richtiges (?) Beispiel:

# definiert die Funktion menu1
def menu1():

    liste = ['auswahl1', 'auswahl2','auswahl3']
    print 'Du hast die Wahl!'
    for i in range ( len(liste) ):
        print liste[i]
    auswahl = input('Deine Wahl --> ')
    # Umlaute mag Python gar nicht! PS: Statt ä nimm \xe4
    # und schreibe: u'Du hast gew\xe4hlt: Menu'
    print 'Du hast gewählt: Menu', auswahl

# Funktion testen
menu1()

In Java muss man Funktionen ohne Rückgabewert mit void extra kennzeichnen, static und public im folgenden Beispiel kümmern uns erst mal nicht. Dieses Beispiel ist -leider- deutlich länger:


        static public void meinMenue ()
        {
             int n;
             String dummy;
             String auswahlMenue[] = new String[3];
             BufferedReader din = new BufferedReader(
                        new InputStreamReader(System.in));


          auswahlMenue[0] = "Auswahl 1";
          auswahlMenue[1] = "Auswahl 2";
          auswahlMenue[2] = "Auswahl 3";
          for (int i=0;i<=2;i++)
                     System.out.println ( auswahlMenue[i] );

             System.out.print ("Deine Auswahl: ");
             try {
                n  = Integer.parseInt(din.readLine());
                System.out.println ("Du hast gewählt: Menu Nr. " + n );
                System.out.print ("Bitte Taste drücken! ");
                dummy  = din.readLine();

             }
            catch ( IOException e ) {
                        System.out.println ("Fehler bei der Eingabe!");
             }
        } // Ende der Funktion meinMenue

Der Funktionsaufruf erfolgt durch den Aufruf des Funktionsnamens inklusive der in diesem Beispiel leeren Parameterliste:
 menuMenue();
Zur freundlichen Beachtung: Da Java in Klassen "denkt", sind Funktionen nichts anderes als Methoden innerhalb einer Klasse, die irgendetwas mit den Daten in der Klasse anstellen. Insofern ist obige Funktionsvereinbarung klassenfeindlich (!) und alles andere als objektorientiert. Wer diese Passage nicht versteht, der klammere sich bitte an das Prinzip Hoffnung: Wir programmieren ja in Python!

<<<
=> While-Schleife

Die Solange- oder while-Schleife in Python beginnt mit dem Schlüsselwort while, danach kommt ein logischer Ausdruck, und dann der Doppelpunkt, Beispiel (die Funktion menu1() wurde verändert):


    i = 0
    while i < len(liste): # durch liste gehen
        print liste[i]
        i = i + 1

Bitte Beachten: die Variable i, also der Schleifenzähler muss auf einen Anfangswert gesetzt werden, und zwar vor der Schleife, in der Schleife wird die Variable bei jedem Durchgang erhöht oder erniedrigt, und irgendwann sollte der logische Ausdruck, hier: i < len(liste) auch mal falsch werden, sonst hat man eine klassische Endlosschleife!

Die while-Schleife in Java unterscheidet sich kaum von der Python-Version:


  int i=0;
  while (i <= 2) {
            System.out.println ( auswahlMenue[i] );
        i++;
  }

Den Befehl in der vorletzten Zeile: i++; hat Java von C++ bzw. C geerbt, die Wirkung ist die gleiche wie in der Anweisung
i = i+1;
nur soll das ganze platzsparender oder ökonomischer sein. Wer richtige Java-Programme schreibt, kann sich an dieser Stelle nur wundern . . .

<<<
=> Rekursion

Rekursion bedeutet kurz: Ein Programm ruft sich selbst auf, Beispiel:

def fak(n):
   """rekursive Definition der Fakultaet"""
   if (n==0):
      return 1
   else:
      return n * fak(n-1)

Die Fakultätsfunktion löst folgendes (mathematische) Problem: Bestimme das Produkt der ersten n natürlichen Zahlen. Beispiel: Sei n=6, dann rechne 1*2*3*4*5*6 (=720). Unser Python Programm ruft man folgendermaßen auf: fak(6). Will man auch eine Ausgabe sehen, so probiere man: print fak(6). Ein sinnvolleres Beispiel:

def raetsel(wort):
   if (len(wort)==0):
      return wort
   else:
      print wort[-1:],
      return rueck(wort[:-1])

Was dieses Programmstück bewirkt, findest du selbst heraus. Nebenbei: hier wird auf Zeichenketten zugegriffen, weiteres hier: http://www.wspiegel.de/pykurs/python10.htm
Wenn du dieses Beispiel verstanden hast (?), versuche es ohne Rekursion zu lösen! Ein berühmtes Beispiel zum Thema Rekursion sind die Türme von Hanoi. Die Geschichte geht so: In einem tibetanischem Kloster sind Mönche schon seit Jahrhunderten damit beschäftigt, 99 Scheiben, die auf einem Turm der Größe nach geordnet liegen, unter Hilfe eines zweiten Turms auf einen dritten Turm zu schichten. Einschränkende Bedingung: Es darf nie eine größere Scheibe auf einer kleineren liegen! Und wenn die Mönche fertig sind, geht die Welt unter! Lösung:

def scheibe(i,j):
    print "Bewege oberste Scheibe vom Pfeiler %i zum Pfeiler %i" % (i,j)

def hanoi(n,i,j,k):
    if n > 0:
        hanoi(n-1,i,k,j)
        scheibe(i,j)
        hanoi(n-1,k,j,i)

# ausprobieren
# 3 Scheiben, Pfeiler 1,2,3
hanoi(3,1,2,3)

PS: Versuche erst gar nicht den Aufruf hanoi(99,1,2,3)

<<<

Beispiele

findest du auf dem Web-Server "muenchen":
http://192.168.0.33 unter lokal => Informatik

<<<

Aufgaben

  1. Wichtiger Hinweis: KEINE Umlaute, das Python-Skript immer mit der Endung .py abspeichern!!!!


  2. Hole dir das Programm menu1.py, und verändere es so, dass die Liste mit den Menueeinträgen der Funktion als Parameter übergeben wird. Wo muss die Liste vereinbart werden? __________________________________________
    Wie ändert sich hierdurch der Aufruf der Funktion? _____________________________________________
    Abspeichern unter menu2.py


  3. Jetzt basteln wir uns eine richtige Funktion! Nimm dein Programm aus Aufgabe 1 und gib die Auswahl des Benutzers als Wert zurück. Über die return-Anweisung informiert das Python-Tutorial in Abschnitt 4.6 (anspruchsvoll!?), besser finde ich den Abschnitt "Defining Functions" in der guten Einführung für Anfänger, dem Non-Programmers Tutorial For Python von J. Cogliati (URL: http://www.honors.montana.edu/~jjc/easytut/easytut/)
    Abspeichern unter menu3.py


  4. Letzte Menü-Aufgabe: Mache aus deinen bisherigen Programmen Funktionen, die man dann im Menue auswählen kann. Der Rückgabewert soll dann mit if bzw. elif (Kurzform für else if) getestet werden, und es folgt der Aufruf der entsprechenden Funktion.
    " Abspeichern unter menu4.py


  5. Die Rätsel-Aufgabe: abschreiben, verstehen & -ohne Rekursion- lösen.


  6. Suche im Internet unter Google nach den Türmen von Hanoi, Abfrage: "Türme von Hanoi, Java, Applet "


<<<
    W. Spiegel, E-Mail: walter.spiegel@web.de