Document Details

LuxuriantLyric512

Uploaded by LuxuriantLyric512

IU Internationale Hochschule Bad Honnef

Tags

python programming computer programming collections sets

Summary

This document is a Python lesson about collections, specifically sets. It covers different types of sets and methods for working with them, demonstrating how to create and modify sets using code examples.

Full Transcript

## 2.2 Collections Wir sind nun in der Lage, Variablen für Ganzzahlen, Gleitkommazahlen, andere numerische Datentypen und jede denkbare Art von String zu erstellen. Wie wir gesehen haben, ist dieses Know-how nutzbringend anwendbar, wenn es um die Speicherung des Namens, der Trikotnummer, der Größe,...

## 2.2 Collections Wir sind nun in der Lage, Variablen für Ganzzahlen, Gleitkommazahlen, andere numerische Datentypen und jede denkbare Art von String zu erstellen. Wie wir gesehen haben, ist dieses Know-how nutzbringend anwendbar, wenn es um die Speicherung des Namens, der Trikotnummer, der Größe, des Gewichts und diverser anderer Merkmale einzelner Spieler:innen geht. Doch angesichts der Tatsache, dass ein Fußballteam üblicherweise aus mindestens elf Personen besteht, droht hier ein enormer Arbeitsaufwand. Wenn wir beispielsweise alle Mitglieder eines Teams erfassen, müssten wir allein 11 verschiedene Variablen für deren Namen anlegen - und diesen Vorgang dann für jede relevante Eigenschaft wiederholen. Das ist ziemlich umständlich. Zum Glück bietet Python verschiedene Möglichkeiten, zusammengehörige Daten in sogenannten Collections zu speichern. In diesem Zusammenhang interessieren uns zunächst einmal Collections des Typs „Set“. Der Datentyp „Set“ bezeichnet in Python eine Datenstruktur zur Verwaltung unsortierter Daten. Zur Erstellung eines Sets geben Sie zunächst einen Variablennamen ein, gefolgt von einem Gleichheitszeichen und einer Reihe von durch Kommata getrennten Daten in geschweiften Klammern {}: ### Abbildung 29: Python - Sets - an_empty_set = set() - a_string_set = {"Red", "Yellow", "Blue"} - a_number_set = {5, 0, -2, 991} - a_mixed_set = {"Hi!", -8, 4.52, 4+9.2J} Wie der obige Screenshot zeigt, lassen sich auf diese Weise verschiedenartige Sets definieren: - Das erste Set wird mit dem Befehl set() als leeres Set erzeugt. - Im Gegensatz dazu beinhaltet das zweite Set drei Strings, das dritte verschiedene Zahlen. - Das vierte enthält schließlich einen Mix aus verschiedenen Datentypen (eine ganze Zahl, einen String, eine Gleitkomma- und eine komplexe Zahl). Hier zeigt sich einmal mehr die enorme Flexibilität von Python! Wenn Sie bereits Erfahrungen mit anderen, in dieser Hinsicht restriktiveren Programmiersprachen gesammelt haben, werden Sie es sicherlich zu schätzen wissen, dass Python die Speicherung verschiedener Datentypen in ein und derselben Collection unterstützt. Zugleich ist zu beachten, dass die mithilfe der print-Funktion ausgegebenen Set-Inhalte durch Kommata getrennt und in geschweifte Klammern eingeschlossen sind. Außerdem sei erwähnt, dass ein leeres Set von der print-Funktion als set() dargestellt wird, nicht aber mit leeren geschweiften Klammern. Darüber hinaus erleichtert Python die effektive Nutzung von Sets durch die Bereitstellung von sogenannten Methoden, mit denen Sie bestimmte Operationen auf dem Set durchführen und beispielsweise einzelne Elemente hinzufügen oder entfernen können. Einige besonders nützliche Methoden werden in der nachstehenden Aufstellung näher erläutert: ### Tabelle 1: Python - Methoden für Sets | Methode | Verwendungszweck | |---|---| | add(element) | Hinzufügung eines Elements zum Set | | remove(element) | Entfernung eines spezifischen Elements aus dem Set | | clear() | Entfernung aller Elemente aus dem Set | Weiteren Aufschluss über die korrekte Verwendung dieser Funktionen bietet das folgende Beispiel: ### Abbildung 30: Python - Verwendung der Set-Methoden - player_names = {"Franz Beckenbauer", "Gerd Muller", "Lothar Matthaus"} - player_names.add("Manuel Neuer") - player_names.remove("Lothar Matthaus") - player_names.clear() In dem Beispiel-Code wird zunächst ein Set mit der Bezeichnung player_names erstellt, das anfangs die Namen von drei bekannten Fußballspielern enthält. In Zeile 11 wird die Liste mithilfe der Methode add um den Eintrag „Manuel Neuer" erweitert, bevor in Zeile 12 der Name „Lothar Matthäus" mithilfe der Methode remove aus dem Set entfernt wird. Danach wird der Inhalt des Sets mithilfe der print-Funktion angezeigt, damit die Richtigkeit der vorgenommenen Änderungen überprüft werden kann. Anschließend werden in Zeile 14 mithilfe der Methode clear alle Elemente aus dem Set entfernt (was daraufhin ebenfalls mit der print-Funktion überprüft wird). Es ist zu beachten, dass Sets keine Duplikate desselben Werts enthalten können. Wenn Sie versuchen, ein bereits vorhandenes Element erneut in ein Set einzufügen, wird keine zweite Instanz angelegt, obwohl Sie keine Fehlermeldung erhalten. Das liegt schlicht und ergreifend daran, dass jedes Element nur einmal im Set vorkommen kann und das betreffende Element bereits enthalten ist. Sie können sich mit der Funktionsweise der verschiedenen Methoden vertraut machen, indem Sie diese mit unterschiedlichen Datentypen verwenden. In bestimmten Fällen kann es sinnvoll sein, alle weiteren Modifikationen eines einmal angelegten Sets auszuschließen und dieses gewissermaßen einzufrieren. Tatsächlich können Sie in Python solche unveränderlichen Sets erstellen, indem Sie die in geschweifte Klammern gefasste Aufzählung der Elemente nochmals in runde Klammern einschließen und ihr dann das Schlüsselwort frozenset voranstellen: ### Abbildung 31: Python - Unveränderliches Set - my_frozen_set = frozenset({1, 92.5, "Frozen!!!"}) - my_frozen_set.add("Let me in!") Wie Sie sehen, gibt der Interpreter eine Fehlermeldung aus, wenn einem auf diese Weise „eingefrorenen" Set ein neues Element hinzugefügt werden soll. Deshalb eignet sich ein unveränderliches Set insbesondere dann, wenn Sie in Ihrem Programm mit Daten arbeiten, die über den gesamten Programmablauf nicht verändert werden dürfen. Als weiterer Datentyp zum Verwalten mehrerer Elemente steht Ihnen in Python der Collection-Typ Liste zur Verfügung. Listen unterscheiden sich in zweierlei Hinsicht von einem Set: 1) eine Liste kann mehrere Instanzen desselben Elements umfassen und 2) Listen sind geordnet, d.h. jedes Element hat eine ganz bestimmte Position in der Liste. Des Weiteren müssen die in einer Liste enthaltenen Elemente - anders als bei der Erstellung eines Sets - nicht in geschweifte, sondern in eckige Klammern [] eingeschlossen werden. Wegen dieser abweichenden Charakteristika gibt es eigene Methoden für Listen, darunter die nachfolgend aufgeführten: ### Tabelle 2: Python – Methoden für Listen | Methode | Verwendungszweck | |---|---| | append(element) | Anfügen eines Elements am Ende der Liste | | insert(i, element) | Einfügung eines Elements am Index i| | remove(element) | Entfernung eines Elements aus der Liste | | clear() | Entfernung aller Elemente aus der Liste | | count(element) | ermittelt, wie häufig ein bestimmtes Element in der Liste enthalten ist | Wenn Sie sich näher mit der Erstellung und Nutzung von Listen vertraut machen möchten, sollten Sie außerdem einen genaueren Blick auf folgende Beispiele werfen: ### Abbildung 32: Python - Listen - my_list = [1, 2.6, "Bob", 5+7.23] - my_list.append("Janet") - my_list.insert(2,99) - my_list.remove(2.6) In diesem Zusammenhang sind zwei Dinge zu beachten: - Erstens können Listen (genau wie Sets) verschiedene Datentypen umfassen. - Zweitens fehlt in der obigen Aufstellung die add-Methode, weil die in einer Liste enthaltenen Daten geordnet sind. Dementsprechend können neue Einträge entweder mit der append-Methode an das Ende der Liste angehängt oder mit der insert-Methode an einem festgelegten Index eingefügt werden. Möglicherweise wundern Sie sich jetzt trotz der aufgezeigten Unterschiede darüber, dass es in Python sowohl Sets als auch Listen gibt. Der wichtigste Grund für diese vermeintliche Doppelung rührt von der Tatsache her, dass Sets darauf ausgelegt sind, möglichst effektiv und schnell herauszufinden, ob ein bestimmtes Element in dem Set enthalten ist, während die Struktur einer Liste ein sehr viel effizienteres Durchlaufen aller Elemente ermöglicht (z.B. um diese anzuzeigen oder zu verändern). Es kommt also vor allem auf das jeweilige Einsatzszenario an, ob ein Set oder eine Liste besser geeignet ist. Die richtige Entscheidung kann Ihnen entscheidende Vorteile in puncto Geschwindigkeit bescheren. Dieser Aspekt wird uns in späteren Kapiteln noch ausführlicher beschäftigen, wenn wir tiefer in die Verwendung von Listen und Sets einsteigen. Neben unveränderlichen Sets gibt es auch unveränderliche Listen: die sogenannten Tupel. Um ein solches Tupel zu erstellen, müssen Sie die aufgezählten Elemente in runde Klammern (statt in eckige oder geschweifte) einschließen, wie auf dem folgenden Screenshot abgebildet: ### Abbildung 33: Python - Tupel - my_tuple = (7, 4.5+2.17, -991.71, "What a great tuple!") Eine weiterer wichtiger Collection-Typ in Python ist das Dictionary. Collections dieser Art sind veränderlich und umfassen ungeordnete Elemente, die jeweils aus einem Schlüssel-Wert-Paar bestehen. Ihre Erstellung erfolgt weitgehend analog zur Erstellung von Sets mit dem zentralen Unterschied, dass bei einem Dictionary zwischen dem Schlüssel und Wert jedes Elements ein Doppelpunkt (:) stehen muss, wie im Folgenden dargestellt: ### Abbildung 34: Python - Dictionarys - my_dictionary = {"Hair color": "Brown", "Eye color": "Hazel", "Age" : 31} Der Befehl {} erzeugt ein leeres Dictionary (nicht ein leeres Set, wie oben angemerkt). Nach der erfolgreichen Erstellung eines Dictionarys können Sie durch die Eingabe eines Schlüssels den dazugehörigen Wert abfragen. Geben Sie hierzu in der Eingabezeile den Namen des Dictionarys ein und fügen Sie diesem die Bezeichnung des Schlüssels in eckigen Klammern hinzu []. Wahlweise können Sie auch die auf dem nachstehenden Screenshot illustrierte get-Methode benutzen: ### Abbildung 35: Python - Verwendung von Dictionarys - my_dictionary = {"Hair color": "Brown", "Eye color": "Hazel", "Age" : 31} - my_dictionary ["Eye color"] - my_dictionary.get("Age") Das waren ziemlich viele Informationen auf einmal! Machen Sie sich keine Sorgen, wenn Sie noch nicht alle Einzelheiten zu den Collection-Datentypen verstanden haben. Wichtig ist an dieser Stelle vor allem die Erkenntnis, dass es in Python vielfältige Arten von Collections gibt, die beim Umgang mit großen Datenmengen und zur Erstellung leistungsfähiger Software-Anwendungen äußerst nützlich sind. ## 2.3 Zahlen In den vorangegangenen Beispielen und Übungen haben wir verschiedene Variablen zur Speicherung von Gewichtsangaben erstellt und ihnen den Wert 73 (stellvertretend für 73 kg) zugewiesen. Für ganzzahlige numerische Werte steht in Python der Datentyp int zur Verfügung, der positive und negative Ganzzahlen (Englisch: integer) sowie den Wert 0 umfasst. In vielen anderen Sprachen werden hier nur Zahlen innerhalb eines bestimmten Intervalls unterstützt und auch Python 2 unterlag in dieser Hinsicht noch gewissen Beschränkungen. Doch in Python 3 können Ganzzahlen beliebig lang sein. Als Programmierer:innen können wir also int-Variablen nutzen, um beliebig große ganzzahlige Werte darzustellen. So weit, so gut. Aber wie sieht es aus, wenn wir genauere Angaben verarbeiten und beispielsweise ein Gewicht von 73,6 kg erfassen möchten? Diese und andere Dezimalzahlen mit Nachkommastellen werden in Python als Gleitkommazahl (Englisch: floating-point number) oder float abgebildet. Auch Gleitkommazahlen können über den Zuweisungs-operator einer Variablen zugewiesen werden. Außerdem können Gleitkommazahlen genau wie Ganzzahlen – beliebige positive oder negative Werte haben. Im Folgenden finden Sie einige Beispiele, die die Zuweisung von Gleitkommazahlen zu verschiedenen Variablen demonstrieren: ### Abbildung 36: Python - Zuweisung und Ausgabe von Gleitkommazahlen - player_weight = 73.6 - another_variable = 0.05 - yet_another_variable = -15.82715 Bei Bedarf können Sie alternativ den Buchstaben e oder E benutzen, um Gleitkommazah-len in wissenschaftlicher Schreibweise darzustellen. Dabei gibt die auf e oder E folgende Ganzzahl den Exponenten zur Basis 10 an, das heißt die Zehnerpotenz, mit der die e oder E vorausgehende Gleitkommazahl multipliziert werden soll. Dementsprechend ist 4,5e7 identisch mit 4,5 * 10⁷ oder 45.000.000. Detailliertere Beispiele zur Nutzung von Gleitkommazahlen in wissenschaftlicher Schreibweise finden Sie auf dem folgenden Screenshot: ### Abbildung 37: Python - Gleitkommazahlen in wissenschaftlicher Schreibweise - scientific_float = 4.5e7 - another_scientific_float = 4.5e-7 Abgesehen davon können in Python mithilfe des Datentyps complex auch komplexe und imaginäre Zahlen abgebildet werden. Das entsprechende Zahlenformat hat die Form a + bJ, wobei es sich bei a und b um Gleitkommazahlen handelt und der Buchstabe J für die Quadratwurzel aus -1 (die sogenannte imaginäre Einheit) steht. ### Abbildung 38: Python - Zuweisung und Ausgabe von komplexen Zahlen - complex_number = 1 + 6J - another_complex_number = -5.6+8.913 Neben der Darstellung von Dezimalzahlen können in Python auch Hexadezimal- und Oktalzahlen als Literale dargestellt werden. Für das Hexadezimalsystem gilt die Notation 0x<hex>, wobei <hex> ein Platzhalter für die jeweils gewünschte hexadezimale Zahl ist. Analog werden Oktalzahlen im Format 00<octal> angegeben. Auch dazu finden Sie nachstehend wieder einige Beispiele: ### Abbildung 39: Python - Zuweisung und Ausgabe von Oktal- und Hexadezimalzahlen - octal_value = 0071 - hex_value = 0x71 Bitte beachten Sie, dass Sie Zahlen aller gängigen Datentypen mithilfe der gängigen Rechensymbole zu mehrgliedrigen arithmetischen Ausdrücken kombinieren können. Unter anderem stehen hier das Pluszeichen (+) für die Addition, das Minuszeichen (-) für die Subtraktion, der Schrägstrich (/) für die Division und das Sternchen (*) für die Multiplikation zur Verfügung. Dabei lassen sich all diese (und viele weitere) Operatoren auch auf Kombinationen aus verschiedenartigen Datentypen anwenden, sodass beispielsweise eine ganze Zahl mit einer Gleitkommazahl multipliziert werden kann. Im letzteren Fall ist das Ergebnis ebenfalls eine Gleitkommazahl, wie das Produkt 5 * 6.5 mit dem Ergebnis 32.5 zeigt. Sollten Sie sich nur für den ganzzahligen Wert des Resultats interessieren, so können Sie alle Nachkommastellen abschneiden, indem Sie den arithmetischen Ausdruck in Klammern einschließen und ihm das Schlüsselwort „int" voranstellen. Die Zeile int (5 * 6.5) liefert den ganzzahligen Wert des Ergebnisses, also 32. Ähnliches gilt für Divisionen. Betrachten wir den Ausdruck 15 / 6, der als Ergebnis eine Gleitkommazahl (mit dem Wert 2,5) liefert. Auch hier können Sie wieder alle Nachkommastellen abschneiden, indem Sie das Schlüsselwort „int“ auf die oben beschriebene Weise benutzen. Und falls Sie nur am Rest der ganzzahligen Division von 15 durch 6 interessiert sind, können Sie einfach den Modulo-Operator (%) verwenden und durch die Eingabe von 15 % 6 das Ergebnis 3 erhalten. Diese und weitere Operationen werden im Folgenden anhand verschiedener Beispiele demonstriert: ### Abbildung 40: Python - Einfache Rechenoperationen - my_float = 20.5 - my_int = 5 Im vorigen Abschnitt haben wir uns mit verschiedenen numerischen Datentypen befasst, die sich für Gewicht, Größe, Geburtsjahr, Trikotnummer, Summe der geschossenen Tore, Anzahl der vorhandenen Haustiere und andere personenbezogene Zahlenangaben eignen. Doch wie verfahren wir mit Informationen wie etwa den Namen der Spieler:innen? Hierfür benötigen wir eine Möglichkeit, Textelemente in unser Programm aufzunehmen. Dies geschieht in Python - wie in anderen gängigen Programmiersprachen - mithilfe des Datentyps „String" (kurz: str). Grundsätzlich handelt es sich bei Strings um Zeichenketten, die nicht nur aus Groß- und Kleinbuchstaben, sondern auch aus Zahlen sowie Satz- und Leerzeichen zusammengesetzt sein können. Um eine String-Variable zu erstellen, wählen Sie einfach einen neuen Variablennamen und weisen diesem einen in Anführungszeichen eingeschlossenen String-Wert zu. Dieser Vorgang wird auf dem folgenden Screenshot anhand von Beispielen illustriert: ### Abbildung 41: Python - Einfache Strings - player_name = "Franz Beckenbauer" - another_string = "This is a string! I love it!" Dabei ist zu beachten, dass Strings in Python unveränderlich sind und nach ihrer Zuweisung zu einer Variable nicht mehr modifiziert werden können. Allerdings ist es möglich, eine bereits vorhandene String-Variable mit einem neuen String zu belegen. Beispielsweise wird der Variablen another_string im obigen Screenshot der String „This is a string! I love it!" zugewiesen. Dieser Text kann nun nicht mehr verändert, sondern nur durch die Zuweisung eines neuen Werts abgelöst werden. Mit anderen Worten: String-Variablen wie another_string sind veränderlich, weil wir sie durch die Zuweisung neuer Werte modifizieren können. Der jeweils zugewiesene String ist jedoch unveränderlich, weil er nach der Zuweisung nicht mehr geändert werden kann. In Python können sowohl einfache als auch doppelte Anführungszeichen zur Kennzeichnung eines Strings verwendet werden können. Sie müssen lediglich darauf achten, dass Sie am Anfang und am Ende des Strings dieselbe Art von Hochkomma setzen: ### Abbildung 42: Python - Strings in einfachen und doppelten Anführungszeichen - print("A string in double quotes is sublime.") - print('But a string in single quotes is just fine.') - print("Mixing quotes is not a good idea.') Es gibt einige wichtige Zeichen, die nicht Teil eines normalen Strings sein können. Dazu zählen zum Beispiel die Anführungszeichen, da die Hinzufügung eines einfachen oder doppelten Hochkommas in der Mitte eines Strings vom Interpreter als Ende-Markierung des Strings gelesen wird. Um dies zu vermeiden, müssen wir das sogenannte „Escape-Zeichen" benutzen: den Backslash (\). Wenn Sie dem Zitat in der Mitte Ihres Strings dieses Zeichen voranstellen (\"), erscheint an der entsprechenden Stelle der Ausgabe das gewünschte doppelte Anführungszeichen. Diese Kombinationen aus dem Backslash und dem Anführungszeichen wird als Escape-Sequenz bezeichnet. Näheren Aufschluss über ihre korrekte Verwendung bietet das folgende Beispiel: ### Abbildung 43: Python - Strings mit maskierten Anführungszeichen - my_string = "Bob said, "All your base are belong to us!"" - my_string = "Bob said, \"All your base are belong to us!\"" Darüber hinaus gibt es noch zahlreiche weitere Escape-Sequenzen, von denen einige in der nachstehenden Tabelle aufgeführt sind: ### Tabelle 3: Python -Escape-Sequenzen | Escape-Sequenz | Ausgabe | |---|---| | \\ | einfacher Backslash | | \' | einfaches Hochkomma | | \" | doppeltes Hochkomma | | \n | ASCII-Steuerzeichen für Zeilenvorschub (neue Zeile) | | \r | ASCII-Steuerzeichen für Wagenrücklauf (Sprung zum Anfang der aktuellen Zeile) | | \t | ASCII-Steuerzeichen für horizontalen Tabulator | Wenn Sie den Interpreter anweisen wollen, alle Escape-Zeichen in einem String zu ignorieren, können Sie diesen als sogenannte Rohzeichenfolge auszeichnen. Dazu stellen Sie dem einführenden Anführungszeichen Ihres Strings einfach den Buchstaben r voran, wie im folgenden Beispiel zu sehen: ### Abbildung 44: Python - Kennzeichnung eines Strings als Rohzeichenfolge - my_string = "This is an escaped string.\nIt's really \"nice!\"" - my_string = r"This is an escaped string.\nIt's really \"nice!\"" Außerdem haben Sie die Möglichkeit, dreifache Anführungszeichen (""" oder ''') zu benutzen, um einen String zu kennzeichnen, der sich über mehrere Zeilen erstreckt: ### Abbildung 45: Python - Strings in dreifachen Anführungszeichen - my_string= """This text goes on.... and on... and on.... Daneben gibt es noch einige wichtige String-Operationen, deren Syntax und Funktion in der nachstehenden Tabelle beschrieben und anhand von Beispielen demonstriert wird: ### Tabelle 4: Python - String-Operationen | Zweck | Beispiel | Ausgabe | |---|---|---| | Ermittlung der Länge eines Strings | len("Hello, World!") | 13 | | Ermittlung des Indexwerts eines im String enthaltenen Zeichens | my_string = "Hello, World!" my_string.index('e') | 1 | | Zählen der Instanzen eines bestimmten Zeichens im String |my_string = "Hello, World!" my_string.count('o') | 2 | | Umwandlung sämtlicher Zeichen in Kleinbuchstaben | my_string = "Hello, World!" my_string.lower() | 'hello, world!' | | Umwandlung sämtlicher Zeichen in Großbuchstaben | my_string = "Hello, World!" my_string.upper() | 'HELLO, WORLD!' | Zusätzlich können Sie durch die Verwendung des Pluszeichens (+) zwei Strings aneinanderfügen, wie hier dargestellt: ### Abbildung 46: Python - Zusammenfügen von Strings - string_one = "Hello," - string_two = " World!" - string_three = string_one + string_two Eine weitere Möglichkeit zur Zusammenführung von Strings bietet die Funktion „format". Hierfür definieren Sie zunächst einen String mit eingebetteten temporären Variablen. Die Variablen werden dazu in geschweifte Klammern {} gefasst. Mithilfe der format-Funktion können diesen Variablen anschließend bestimmte Werte aus anderen Variablen oder in Form von Literalen zugewiesen werden. Das entsprechende Verfahren wird im Folgenden am Beispiel erläutert: ### Abbildung 47: Python - Konkatenation mit der format-Funktion - age_var = 28 - my_str = "My name is {name} and I'm {age} years old.".format(name="Joe", age=age_var) Falls Sie einen String mehrmals nacheinander ausgeben möchten, steht Ihnen das Sternchen (*) als Multiplikationsoperator zur Verfügung, wie im folgenden Beispiel dargestellt: ### Abbildung 48: Python - Vervielfachen eines Strings - greeting = "Hello! - print(greeting * 4) Darüber hinaus ist es manchmal erforderlich, einen Teil bzw. ein Segment eines längeren Strings abzurufen. Zu diesem Zweck gibt es in Python einen aus zwei eckigen Klammern bestehenden Operator [], der an den Originalstring angefügt wird. Dabei lassen sich Art und Umfang der String-Operation durch die Eingabe von bis zu drei Parametern innerhalb der Klammern genau bestimmen. So bezeichnet der erste dort angegebene Wert die Position, an dem die Erfassung des Teilstrings beginnen soll. Falls Sie keine weiteren Parameter spezifizieren, wird nur das Zeichen mit diesem Index ausgegeben. Die in einem String enthaltenen Zeichen werden beginnend mit dem Index 0 vom ersten bis zum letzten Zeichen durchnummeriert (indiziert). Der Zugriff auf das zweite Zeichen eines Strings erfolgt dann also über den Index 1: ### Abbildung 49: Python - Abrufen eines Teilstrings (1) - my_string = "Hello, World!" - print(my_string[1]) Der zweite Teilstring-Parameter bezeichnet den Index des Zeichens, an dem die Abfrage enden soll. Er wird vom ersten Parameter durch einen Doppelpunkt (:) getrennt. Bitte beachten Sie, dass das Zeichen mit dem angegebenen Ende-Index nicht in den Teilstring eingefügt wird. Wenn Sie nach dem ersten Parameter einen Doppelpunkt einfügen, ohne einen zweiten Parameter zu spezifizieren, wird der gesamte Teilstring ab dem durch den ersten Parameter bezeichneten Index ausgegeben. Auch dazu finden Sie im Folgenden verschiedene Beispiele: ### Abbildung 50: Python - Abrufen eines Teilstrings (2) - my_string = "Hello, World!" - print(my_string[0:5]) - print(my_string[2:4]) - print(my_string[7:]) Der dritte Teilstring-Parameter gibt schließlich die Zugriffs-Schrittweite an und bietet Ihnen damit die Möglichkeit', statt des gesamten Teilstrings zwischen dem zuvor spezifizierten Anfangs- und Endpunkt nur jedes n-te Zeichen abzurufen. Sofern Sie hier keinen Eintrag vornehmen, wird dieser Wert standardmäßig auf 1 gesetzt, was bewirkt, dass der fertige Teilstring sämtliche Zeichen aus dem festgelegten Bereich des Originalstrings enthält. Wenn Sie dagegen 2 als dritten Parameter eingeben, wird nur jedes zweite Zeichen ausgegeben; wenn Sie 3 eingeben, nur jedes dritte - und so weiter. Näheren Aufschluss bieten hier die folgenden Beispiele: ### Abbildung 51: Python - Abrufen eines Teilstrings (3) - my_string = "Hello, World!" - print(my_string[0::]) - print(my_string[0::2]) - print(my_string[0::3]) - print(my_string [0::4]) Darüber hinaus gibt es noch zahlreiche weitere Methoden zur Bearbeitung von Strings, darunter join(), split(), lower() und replace(). Mit join() können Sie veranlassen, dass ein von Ihnen festgelegter String zwischen die einzelnen Zeichen eines anderen Strings eingefügt wird. Die split()-Funktion teilt einen String in verschiedene Segmente, wobei ein festgelegtes Zeichen oder eine festgelegte Zeichenfolge als Trennzeichen dient. Und die Funktionen upper() und lower() wandeln einen String in Groß- bzw. Kleinbuchstaben um, während die replace()-Funktion ein bestimmtes Zeichen oder eine bestimmte Zeichenfolge durch ein anderes Zeichen oder einen String ersetzt. Der Einsatz dieser Funktionen wird in den folgenden Beispielen illustriert: ### Abbildung 52: Python - Funktionen zur Bearbeitung von Strings - print(("-").join("TEST")) - print("This is a string".split(" ")) - print("I love Python".upper()) - print("I love Python".lower()) - print("Python is amazing".replace("is", " == ")) ## 2.5 Dateien Nachdem wir in den vorangegangenen Abschnitten die Notation und Eigenschaften verschiedener Python-Datentypen kennengelernt und uns grundlegendes Wissen über Collections angeeignet haben, können wir nun einige interessante Aspekte anschneiden, die Ihnen die Erstellung robuster Python-Anwendungen erleichtern werden. Das erste einschlägige Thema, mit dem wir uns im Folgenden beschäftigen, ist die Datenpersistenz. Was ist darunter zu verstehen? Stellen Sie sich einmal vor, Sie möchten ein Schriftdokument erstellen und nutzen dafür ein Textverarbeitungsprogramm, das Ihnen bei jedem Neustart ein neues leeres Blatt präsentiert und keine gespeicherten Dateien laden kann. In diesem Fall müssten Sie Ihr Dokument bei jeder Änderung komplett neu aufsetzen. Um Ihnen diesen unnötigen Arbeitsaufwand zu ersparen, bieten moderne Textverarbeitungsprogramme die Möglichkeit, Daten in Form von Textdokumenten auf der Festplatte oder anderen Medien zu speichern und später erneut aufzurufen. Damit erweisen sich Funktionen zur dateigestützten (oder anderweitigen) Speicherung und Bereitstellung von Daten als wichtige Komponente der meisten Anwendungen. Sehen wir uns also an, wie Sie Daten in eine Datei schreiben können. In Python müssen Sie dafür zunächst einmal die vorgesehene Datei mit der Funktion open öffnen, wobei neben der Angabe des Dateinamens auch die Wahl des Bearbeitungsmodus erforderlich ist. In Bezug auf den Letzteren haben Sie die Wahl zwischen den Optionen "x" (Erstellungsmodus), "a" (Anfügemodus), "w" (Schreibmodus) und "r" (Lesemodus): - Die Option "r" (Read) öffnet die angegebene Datei im Lesemodus. Da es sich hier um die Standardeinstellung handelt, muss sie nicht explizit angegeben werden. - Die Option "x" (Create) veranlasst die Erstellung einer neuen Datei mit dem angegebenen Namen. Falls bereits eine Datei mit dieser Bezeichnung existiert, wird eine Fehlermeldung ausgegeben. - Die Option "a" (Append) bewirkt die Erstellung einer neuen Datei, falls der angegebene Dateiname nicht existiert. Wenn bereits eine Datei mit der genannten Bezeichnung vorhanden ist, wird diese Datei geöffnet - ohne Ausgabe einer Fehlermeldung. Anschließend werden alle neuen Einträge am Ende der Datei angefügt, sodass die bereits bestehenden Dateiinhalte erhalten bleiben. - Die Option "w" (Write) bewirkt ebenfalls die Erstellung einer neuen Datei, falls der angegebene Dateiname nicht existiert. Wenn bereits eine Datei mit der genannten Bezeichnung vorhanden ist, wird diese Datei geöffnet (wiederum ohne Ausgabe einer Fehlermeldung). Allerdings werden in letzterem Fall - anders als im Anfügemodus - alle vorherigen Inhalte der bereits bestehenden Datei gelöscht. Das bedeutet auch, dass alle neuen Einträge am Dateianfang eingefügt werden. In jedem der vier Fälle gibt die open-Funktion eine Referenz auf ein Dateiobjekt aus, die Sie für alle folgenden Zugriffsoperationen benötigen. Deshalb müssen Sie den Zuweisungsoperator (=) benutzen, um den Ausgabewert der open-Funktion in einer Variablen zu speichern: ### Abbildung 53: Python - Öffnen einer Datei - my_file = open("myfile.txt", "w") Nach der Ausführung der obigen Anweisung ist die angegebene Datei im Schreibmodus geöffnet und kann mit beliebigen Inhalten gefüllt werden (Methode write). Sobald Sie alle erforderlichen Eintragungen vorgenommen haben, schließen Sie die Datei mit der Methode close(), wie im Folgenden dargestellt: ### Abbildung 54: Python - Beschreiben einer Datei - my_file = open("myfile.txt", "w") - my_file.write("I'm writing to a file in Python!!!") - my_file.close() Herzlichen Glückwunsch, Sie haben soeben Ihren ersten Dateieintrag in Python vorgenommen! Wie Sie sehen, gibt die write-Methode (in Zeile 35) den Wert 34 aus. Dieser Wert gibt an, dass im Rahmen des Schreibvorgangs insgesamt 34 Zeichen erfolgreich in die angegebene Datei eingetragen wurden. Wenn Sie einmal die Länge des in der Klammer der write-Methode enthaltenen Strings überprüfen, werden Sie feststellen, dass er exakt 34 Zeichen umfasst. Anscheinend hat der Vorgang also bestens funktioniert! Dennoch kann es natürlich auch in Python vorkommen, dass ein Schreibprozess fehlschlägt. Haben Sie beispielsweise schon einmal beim Speichern Ihrer Änderungen in einem Textverarbeitungsprogramm eine Fehlermeldung erhalten, weil die fragliche Datei bereits in einer anderen Anwendung geöffnet war? Diese sogenannte Dateisperre wurde speziell zu dem Zweck entwickelt, parallele Schreibzugriffe auf ein und dieselbe Datei durch zwei (oder mehr) Anwendungen zu verhindern. Sie ist ein möglicher Grund dafür, dass ein Eintrag in einer geöffneten Datei nicht wie vorgesehen vorgenommen werden kann. Hier zeigt sich, dass Sie letztlich nur die Funktionsweise Ihres eigenen Codes in der Hand haben. Sie können dafür sorgen, dass Ihre eigenen Programme sicher und robust sind und den Benutzer:innen keine schlaflosen Nächte bereiten. Doch das Dateisystem stammt nicht von Ihnen - und lässt sich daher nur innerhalb der vorgegebenen Grenzen von Ihnen kontrollieren. Obwohl wir also in diesem einfachen Beispiel lediglich eine Datei öffnen, beschreiben und dann wieder schließen, können trotzdem Probleme auftreten, die sich unserem Einfluss entziehen. Deshalb werden Sie in einem späteren Kapitel mehr über Ausnahmen und die Handhabung potenzieller Probleme im Zusammenhang mit der Nutzung externer Ressourcen erfahren. An dieser Stelle lassen wir das Thema noch außen vor und nehmen ganz einfach an, dass wir ohne Hindernisse auf alle gewünschten Dateien zugreifen können! Dies bedeutet, dass wir nun versuchen können, die eben beschriebene Datei auszulesen. Zu diesem Zweck müssen Sie die betreffende Datei zunächst öffnen, genau wie bei dem oben dargestellten Schreibvorgang. Allerdings geben wir hier die Option "r" (für „Read" bzw. den Lesemodus) an, wie auf dem folgenden Screenshot zu sehen: ### Abbildung 55: Python - Öffnen einer Datei im Lesemodus - my_file = open("myfile.txt", "r") Nachdem die Datei nun im Lesemodus geöffnet ist, können Sie mithilfe der read-Methode ihre Inhalte abrufen. Danach schließen Sie die Datei wie gehabt mit der close-Methode. Beide Vorgänge werden nachstehend an einem Beispiel illustriert: ### Abbildung 56: Python - Auslesen einer Datei - my_file = open("myfile.txt", "r") - print(my_file.read()) - my_file.close() Gute Arbeit! Sie wissen jetzt, wie Sie eine Datei lesen und beschreiben, und sind damit bestens für die nächsten Schritte dieses Python-Einführungskurses gewappnet. Generell wurden im Rahmen dieses Kapitels viele Themen besprochen, die für Python-Entwickler:innen von größter Wichtigkeit sind. Deshalb ist es mehr als lobenswert, dass Sie bis zum Schluss durchgehalten haben. ## ZUSAMMENFASSUNG Python ist eine ebenso funktionsreiche wie dynamische Programmiersprache, die ein breites Spektrum an Datentypen wie Strings, Ganz-, Gleitkomma- und sogar komplexe Zahlen unterstützt. Derartige Werte können mithilfe des Zuweisungsoperators (=) in Variablen abgelegt werden, wobei die Zuweisung stets von rechts nach links erfolgt. Das bedeutet, dass zunächst der Ausdruck auf der rechten Seite des Gleichheitszeichens ausgewertet und der so errechnete Wert dann der Variablen auf der linken Seite des Operators zugewiesen wird. Darüber hinaus gibt es in Python nicht nur diverse Operatoren für Rechenoperationen und die Bearbeitung von Strings, sondern auch Datentypen wie Sets, Listen und Dictionaries, die speziell für die Erstellung robuster Datensätze konzipiert wurden. Außerdem stellt Python unkomplizierte, einfach zu bedienende Funktionen bereit, mit denen Sie Dateien öffnen, beschreiben und auslesen können. Allerdings treten hier möglicherweise unvorhergesehene Herausforderungen auf, wenn sich externe Ressourcen wie beispielsweise das Dateisystem als Fehler- und Störungsquelle erweisen.

Use Quizgecko on...
Browser
Browser