14: Methoden

Bislang haben wir eine Reihe von Datenstrukturen in Python gesehen: strings und Listen. Jede von ihnen unterstützt mehrere Methoden, die Varianten von Funktionen sind.

Zum Beispiel ist eine Methode von Listen die reverse() Methode. Wie der Name schon andeutet, kehrt sie die Liste um (so wird aus dem ersten Element das letzte und umgekehrt). Man ruft eine Methode auf, in dem man ein Periodenzeichen (.) verwendet wie im Folgenden:

«objectName».«methodName»(«list of arguments, if any»)

Zum Vergleich, die Syntax, die wir bereits gesehen haben, um Funktionen aufzurufen, war

«functionName»(«list of arguments, if any»)

Hier ist ein Beispiel für das Aufrufen der Umkehr-Methode in einer Liste.

Beispiel
Listen umkehren.

Ein Beispiel einer Methode, die ein Argument benötigt, ist str.startswith:

Beispiel
Einige Zeichenkettenmethoden.

Viele Methoden

Unten erwähnen wir die häufigsten Methoden für die Zeichenketten- und Listenklassen. Diese erledigen zumeist Aufgaben, die du selbst zu schreiben in der Lage sein solltest, aber das Verwenden von Standardmethoden hat den Vorteil, dass es deinen Code leichter für andere zu lesen und zu bearbeiten macht.

Listen

Diese Methoden verändern die Liste nicht:

  • list.index(X): finde X in der Liste. Genauer gesagt, gibt diese Methode ein i aus, das list[i]==X ergibt, wenn man alle Elemente durchsucht. Das niedrigst mögliche i wird ausgegeben. Wenn X nicht in der Liste vorhanden ist, wird ValueErrorausgelöst.
    • X in list gibt True aus, wenn X ein Element der Liste ist, sonst False. Diese Methode zu verwenden kann helfen, einen ValueError zu vermeiden. (Achtung: in ist ein Operator, keine Methode.)
  • list.count(X): gibt aus, wie oft X in der Liste vorkommt

Beispiel
Listenmethoden.

Diese Methoden verändern die Liste:

  • list.append(X) fügt X am Ende von list ein
  • list.insert(i, X) fügt X an der Stelle i ein
  • list.extend(L) fügt eine Liste L an das Ende an
  • list.remove(X) entfernt das erste Auftreten von X
  • list.pop(i) löscht & gibt Element list[i] zurück, während list.pop() das letzte Element löscht & zurückgibt.
  • del list[i] löscht das ite Element von list (Achtung: dies ist ein "del Statement", keine Methode)
  • list.reverse()kehrt die Liste um
  • list.sort()sortiert die Liste

Alle Methoden oben außer pop geben None aus. Einige dieser Funktionen können außerdem auch mit leicht veränderten Argumenten aufgerufen werden; für mehr Details siehe den Abschnitt über Listenmethoden in der Python Dokumentation. Listen unterstützen auch komplexe Unterbereiche, die „slices“ genannt werden, und die es uns erlauben, ganze Unterlisten einzufügen oder zu löschen, ähnlich wie in der string[x:y:z] Schreibweise, die wir in vorherigen Lektionen gesehen haben.

Programmierübung : The Replacements
Verwende index und andere Listenmethoden um eine Funktion replace(list, X, Y) zu schreiben, die X jedesmal durch Y ersetzt, wenn es in list vorkommt. Zum Beispiel, wenn L = [3, 1, 4, 1, 5, 9], dann würde replace(L, 1, 7) nämlich L durch [3, 7, 4, 7, 5, 9] ersetzen. Damit diese Aufgabe eine Herausforderung ist, ist es dir nicht erlaubt, [], zu verwenden. Hinweis: du brauchst return nicht zu verwenden.
Tipp
Gib Testbefehle wie print(meinefunktion("Test-Argument")) unten ein.

Zeichenketten

Genau wie bei Listen, kannst du in,index und count mit Zeichenketten verwenden. Sie sind sogar noch wirkungsvoller, da sie auch mit Unterketten funktionieren und nicht nur individuelle Zeichen finden:

  • S in T ist ein bool, der angibt, ob Kette S eine Unterkette von Kette T ist.
  • S.index(T) findet den ersten Index von S, wo T eine Unterkette ist
  • S.count(T) gibt die Zahl von sich nicht überschneidenden Ausprägungen von T an als Unterkette von S

Beispiel
index und count für Strings aufrufen.

Hier sind einige der allgemein hilfreichsten str Methoden:

  • Groß- und Kleinschreibung: capitalize, lower, upper, islower, isupper
  • Zeichen: isalpha, isdigit
  • Füllung: center, ljust, rjust; strip löschen Füllzeichen
  • Unterketten: endswith, startswith, find, replace
  • Parsing: split, splitlines

Wir werden diese detaillierter einführen, sofern dies notwendig ist. Eine komplette, detaillierte Liste von Zeichenkettenmethoden findest du in der Python Dokumentation.

Strings sind unveränderlich. Wir erwähnten list.reverse(), welches eine Liste verändert, indem es sie umkehrt, aber es existiert keine str.reverse() Methode. Das ist so, weil Zeichenkettenobjekte nicht mehr verändert werden können, wenn sie einmal entworfen wurden. In Lektion 17 erklären wir dies etwas genauer.

Hier ist ein Beispiel einer Kettenmethode: S.replace(old, new) gibt eine modifizierte Version von S aus, bei der jedes Vorkommen von Unterkette old ersetzt wurde durch new. Dies ruft eine neue Kette hervor, ohne die alte zu verändern:

Beispiel
Example: replace gibt eine neue Kette aus und verändert das Original nicht.

Für die nächste Übung sind die folgenden Methoden hilfreich:

  • str.replace, die wir gerade beschrieben haben
  • die Boolesche Methode str.isalpha(), die True ergibt, wenn str eine Kette (oder Zeichen) ist, die nur aus Buchstaben besteht
  • die Boolesche Methode str.isdigit(), die True ergibt, wenn str eine Kette (oder Zeichen) ist, die nur aus Zahlen besteht
  • str.upper(), die eine Version von str ausgibt, die zu Großbuchstaben konvertiert wurde.

Programmierübung : Exact Postage
Definiere eine Funktion postalValidate(S), die zuerst überprüft, ob S eine Postleitzahl ist, die zulässig ist:

  • zuerst, lösche alle Leerzeichen;
  • der Rest muss die Form L#L#L# haben, bei der L Buchstaben (Groß- oder Kleinbuchstaben) und # Zahlen sind.

Wenn S keine zulässige Postleitzahl ist, gib den Booleschen False aus. Wenn S zulässig ist, gib eine Version der selben Postleitzahl aus in dem schönen Format L#L#L#, in welchem jedes L in Großbuchstaben ist.

Gib Testbefehle wie print(meinefunktion("Test-Argument")) unten ein.

Der Rest dieser Lektion ist ein bisschen technisch und kein nötiges Wissen für die restlichen Lektionen.

Mehr über Objekte

Während du mehr über Python lernst, wirst du mehreren Klassen als nur strings und Listen begegnen.
Andere, die du wohl nützlich finden wirst, sind file objects, sets, und dictionaries.
Sie haben alle viele nützliche Methoden. Du kannst Python nach allen Methoden eines gegebenen Objektes fragen,
indem du die dir-Funktion anwendest:

Beispiel
Die Methoden eines str. Bemerke, dass startswith eines der Ausgaben ist.

Die Eigenschaften eines Objekts anzuschauen wird introspection genannt. Alles in Python darf Methoden haben:

Beispiel
Die Glieder eines int.

Einige der Einträge in dir sind eigentlich member variables statt Methoden, zum Beispiel ist int.denominator eine Zahl und keine Funktion. Technisch sind Funktionen Objekte in Python, so sind member-Funktionen ein Spezialfall von member-Variablen.

Du kannst Introspektion auch an Modulen betreiben. Falls du import math durchführst und dann dir(math) aufrufst, bekommst du eine Liste von allem im math-Modul, die Zahl pi und die Funktion sqrt inklusive.

Warum Objekte?

Warum haben wir Methoden wie S.index(T) anstatt eines einfachen Funktionsaufrufs wie index(S, T)? Warum haben wir eigentlich überhaupt object S und method str.index()?

Die wesentlichen Vorteile der Objekte werden klarer, wenn du anfängst mit komplizierteren und
unterschiedlicheren Typen von Daten zu programmieren. Jeder Typ vom Objekt (z.B. str class)
stellt die untergebrachten Basisdaten (z.B. eine Folge von Zeichen und ihre Länge)
und die Typen der Operationen dar, welche daran ausgeführt werden können (z.B. konvertieren zum Großbuchstaben oder einen substring erstellen).
Ein komplexeres Beispiel sind file objects:
sie repräsentieren den Namen eines zu öffnenden Files, deine aktuelle Position im File und Methoden zum Lesen und Schreiben.
Du kannst sogar deine eigenen Datentypen definieren!

Dieser allgemeine Zugang wird "objektorientierte Programmierung" (OOP) genannt. Einige seiner Leistungen sind:

  • organization: Auf alles vom math-Modul kann mit der math.«name»-Syntax zugegriffen werden; du sparst die Möglichkeit, existierende Variablennamen in deinem Programm zu überschreiben.
  • encapsulation:
    So wie ein Programm mit mehreren strings oder mehreren Files zur gleichen Zeit arbeiten kann, kannst du mit vielen verschiedenen Kopien (instances) des durch irgendeine andere Klasse definierten Datentypen arbeiten.
  • re-use: Sobald du einen Datentypen (wie str) oder eine Library von Methoden (wie math) definiert hast, kannst du ihn wieder und wieder benutzen (re-use) oder ihn anderen Leuten vom benutzen geben.
  • debugging:
    Wir sahen von früher, wie das Schreiben einer Funktion den Gebrauch vieler Kopien gleichen Codes vermeidet,
    was debugging erleichtert. Alle Funktionen verknüpft mit einem Datentypen an einer einzigen Stelle (die Klassendefinition) zu schreiben hat den gleichen Effekt.
  • relations between classes: Python weiß, dass die index-Methode eine Sache für einen string und was anderes für eine Liste bedeuten kann. Ebenso kann Python nicht nur Files auf deinem Computer lesen und schreiben, sondern auch auf dem Internet. In beiden Fällen (Zeichen oder Listenfolgen und lokale oder ferne Files) können die verwandten Klassen durch das Konzept der Vererbung (inheritance) in einer gleichförmigen Weise behandelt werden.

Im Rest der CS Kreise werden wir nur Objekte und Methoden benutzen; du kannst später mehr über
das Erstellen eigener Klassen lernen (siehe Ressourcen-Seite).

Die nächsten drei Lektionen können in beliebiger Reihenfolge durchgearbeitet werden und sie geben eine Vielfalt von Herausforderungen, die teilweise Themen von früheren Lektionen beinhalten.