strings

14. STRINGS (ZEICHENKETTEN)

 

 

DU LERNST HIER...

 

mit Strings umzugeben. Die Zeichen eines Texts (Buchstaben, Satzzeichen, Leerschläge, Zeilenumbrüche, usw.) werden im Computer als eine Zahl zwischen 0 und 127 im ASCII-Code dargestellt. Will man auch die Umlaute und Akzente berücksichtigen, so braucht es bereits die Zahlen 0..255, für eine Erweiterung auf Sprachen mit ganz anderen Zeichen (kyrillisch, chinesisch, usw.) braucht man den Unicode mit Zahlen 0..65535.

 

 

MUSTERBEISPIEL

  Wörter und Sätze sind aneinander gefügte Zeichen und werden als String bezeichnet.

Zur Definition verwendet man ein einfaches oder doppeltes Anführungszeichenpaar (Gänsefüsschen), also beispielsweise name = 'Maya' oder name = "Maya". Wir verwenden meist das doppelte Anführungszeichen.

Ein String lässt sich wie eine Liste auffassen, deren Elemente einzelne Zeichen sind. Wie bei Listen kannst du ein einzelnes Zeichen mit einem Index herausholen. Im Programm wird der String auf zwei verschiedene Arten mit einer for-Schleife "durchlaufen". Was findest du eleganter?

 




from gturtle import *

makeTurtle()
right(90)
name = "Maya Bircher"
for c in name:
    forward(20)
    label(c)
right(90)    
for i in range(len(name)):
    forward(20)
    label(name[i])
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Wie du bereits weisst, kannst du zwei Strings mit dem Additionsoperator + zusammenfügen (konkatenieren).  Dabei musst du aber darauf achten, dass links und rechts vom Pluszeichen auch wirklich Strings stehen. Willst du also eine Zahl z hinzufügen, so musst du diese zuerst mit str(z) in einen String umwandeln. Es gibt auch einen leeren String leer = "". Unterscheide ihn gut von einem String mit einem Leerzeichen luecke = "  ".

Im Gegensatz zu Listen kannst du ein einzelnes Zeichen in einem String nicht ändern, da Strings wie Tupels unveränderlich sind. Um beispielsweise in "Maya" den ersten Buchstaben zu ändern, musst du den ganzen String neu zuweisen: name = "Kaya".

 

 

 

PROGRAMMCODE INTERAKTIV AUSFÜHREN

 

Ein Programm kannst du auch als einen String auffassen, der vom Laufzeitsystem, dem Python-Interpreter, gelesen und als Programm ausgeführt wird. Darum ist es in Python möglich, Programmzeilen in einem Eingabedialog einzulesen und direkt auszuführen. Dazu verwendest du die Funktion exec().

 



from gturtle import *

makeTurtle()
repeat:
    s = inputString("Gib einen Turtlebefehl ein:")
    exec(s)
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Du kannst auch mehrere Befehle mit Strichpunkten getrennt miteinander eingeben. Dein Programm benimmt sich aber leider sehr schlecht, wenn du eine fehlerhafte Eingabe machst, da exec() dann eine sogenannte Exception auslöst (man sagt auch: "eine Exception wirft"). Dies führt zum Abbruch des Programms, also zu einem Crash! Es ist aber leicht, dieses böse Fehlverhalten zu korrigieren, wenn du die Exception in einem try-except-Block "fängst".

from gturtle import *

makeTurtle()
repeat:
    s = inputString("Gib einen Turtlebefehl ein")
    try:
        exec(s)
    except:
        msgDlg("Illegale Eingabe")

 

 

ZUM SELBST LÖSEN

 
1a.

Ein String, den du mit einem Eingabedialog inputString("Gib ein Wort/einen Satz ein") einliest, soll von von hinten gelesen ausgeschrieben werden.

Das Programm soll solange laufen, bis man den Abbrechen-Button klickt.

 

1b.

Modifiziere das Programm, dass es herausfindet, ob das Eingabewort ein Palindrom ist, also von hinten gelesen gleich bleibt. Du kannst Strings mit == oder != miteinander vergleichen.

 

 

1c*.

Bei einem Palindrom beachtet man in der Regel die Gross-/Kleinschreibung, sowie die Leerzeichen nicht. Verbessere das Programm sinngemäss.

Anleitung: Wie eine Liste, ist auch ein String ein Objekt. Mit der String-Funktion lower() wird der String zurückgegeben, der aus kleigeschriebenen Buchstaben besteht. Die String-Funktion replace(a, b) gibt einen String zurück, in dem alle Vorkommnisse von a durch b ersetzt sind. Der ursprüngliche String wird dabei nicht verändert!

 

 

2a.

Verbessere das Programm zur interaktiven Ausführung von Turtlebefehlen so, dass bei Eingabe des Befehls "exit" in beliebiger Gross-/Kleinschreibung das Programm beendet wird und das Turtlefenster schliesst. (Zum Schliessen des Fensters wird dispose() aufgerufen.)


2b. Mache das Programm noch robuster, indem du mit der Stringfunktion strip() Leerzeichen vor und nach dem Eingabebefehl entfernst.

 

   

 

14-1
Fachlicher Hinweis:

Tabelle der ASCII-Codes:

14-2
Fachlicher Hinweis:

In Python heisst der String-Datentyp str.

14-3
Fachlicher Hinweis:

Es gibt ein paar Spezialzeichen, die mit einem vorangestellten Rückwärtsbruchstrich als Escape-Sequenz geschrieben werden. 

Escape-Sequenz

Bedeutung

\\

Backslash

\'

Einfaches Anführungszeichen

\"

Doppeltes Anführungszeichen

\a

Bell

\b

Backspace

\f

Formfeed

\n

Linefeed (new line)

\r

Carriage return

\t

Tab

\uxxxx

16-bit hex unicode xxxx

\xhh

8-bit hex hh

Beispiel: "\x41\x42\x43" ist dasselbe wie "ABC"

 

14-4
Fachlicher Hinweis:

Im Gegensatz zu Listen kannst du ein einzelnes Zeichen des Strings nicht durch eine Zuweisung verändern, da Strings unveränderlich sind. Mit

name = "Maya Bircher"

führt

name[0] = "K"

also nicht zum Erfolg, sondern zu einer Fehlermeldung. Willst du einen String verändern, so musst du ihn als Ganzes neu zuweisen, also:

name = "Kaya Bircher"

14-5
Fachlicher Hinweis:

In Python gibt es keinen Datentyp char für ein einzelnes Zeichen. Diese werden als String mit der Länge 1 dargestellt.

14-6
Didaktische Hinweise:

Auf den ersten Blick scheint es überrissen, in einem Einführungslehrgang Exceptions zu behandeln. Es ist aber wichtig, schon zu Beginn die Programmierkultur zu pflegen, dass Programme sich auch bei falschen Eingaben vernünftig verhalten müssen und nicht mit einem Crash abbrechen sollten.
Defensives und robustes Programmieren gehören zum Verhaltenskodex des exakten und serösen Arbeitens, der weit über die Informatik hinaus grosse Bedeutung hat.
Defensives Programmieren: Wenn es eine sichere und eine weniger sichere, aber kürzere oder trickreiche Variante gibt, so wählt man die sichere.

Robustes Programmieren: Ein Programm darf auch bei ausserordentichen Umständen nicht abbrechen.  Spezielle Umstände erfordern spezielle Lösungen, auch wenn die Behandlung von seltenen Spezialfällen mühsam und aufwändig ist.

Beides gehört zum Mission Critical Programming.

14-7
Fachlicher Hinweis:

Nur in Interpretersprachen ist es möglich, Programme die erst zur Laufzeit entstehen, direkt auszuführen. Dies ist ein besonders hübsches Feature von Python.