Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Mit der Version 3 wurde Python nochmals klarer und einfacher strukturiert. Weiters bietet Python eine einfache und gut verständliche Syntax, die es Anfängern ermöglicht, schnell in die Programmierung einzusteigen. Dennoch ist Python sehr mächtig und bietet die Möglichkeit auch komplexe Aufgaben zu lösen und sogar in einem gewissen Maß maschinennahe zu programmieren. Das macht diese Sprache zum idealen Allrounder und zur idealen Sprache, um mit der Softwareentwicklung zu beginnen. In diesem Buch lernen Sie die Grundlagen der Softwareentwicklung mit Python 3 und einige fortgeschrittene Themen wie Webentwicklung, GUI-Programmierung und sogar maschinelles Lernen. Kurz und prägnant auf den Punkt gebracht und ohne große Umschweife lernen Sie anhand vieler praktischer Beispiele, wie Sie Ihre eigenen Ideen in Python 3 umsetzen.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 225
Veröffentlichungsjahr: 2018
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Zunächst möchte ich mich an dieser Stelle bei all denjenigen bedanken, die mich während der Arbeit an diesem Buch unterstützt und motiviert haben.
Ganz besonders gilt der Dank meiner Freundin, die mich die gesamte Zeit über motiviert hat und es mir nicht übel nahm, dass ich so viel von unserer gemeinsamen Freizeit in dieses Projekt steckte - danke Schatz!
Außerdem meiner Mutter, die fleißig nach diversen Tipp- und Rechtschreibfehlern gesucht hat und auch so manches Komma an die rechte Stelle rücken musste.
Mit der Version 3 wurde Python nochmals von einigen Ecken und Kanten befreit und noch klarer und einfacher strukturiert. Daher gehört die Zukunft Python 3!
Ich habe versucht die Grundlagen der Softwareentwicklung mit Python 3 und einige fortgeschrittene Themen wie Webentwicklung, GUI-Programmierung und sogar maschinelles Lernen kurz und prägnant auf den Punkt zu bringen ohne große Umschweife. Dabei lernen Sie anhand vieler praktischer Beispiele wie Sie Ihre eigenen Ideen in Python umsetzen können.
Ich habe die hier gezeigten Beispiele unter Python 3.6 entwickelt und getestet. Es kann durchaus sein, dass die ein oder andere Funktion in älteren Python-Versionen etwas anders funktionieren oder, dass das ein- oder andere Modul das mit älteren Versionen geliefert wird unterschiedlich arbeitet.
Daher empfehle ich Ihnen auch mit Python 3.6 zu arbeiten - falls Sie noch eine ältere Version im Einsatz haben und keine zusätzliche Version installieren wollen oder können dann verweise ich Sie an dieser Stelle an die Dokumentation von Python. Als Entwickler werden Sie damit ohnehin sehr häufig arbeiten und immer wieder einige Dinge nachsehen müssen. Ich muss das nach über 12 Jahren Softwareentwicklung auch noch immer wieder. Kein Mensch kann sich mehrere zehntausend Klassen, Methoden, Eigenschaften und Befehle merken!
Ich wünsche Ihnen viel Spaß beim Lesen, Lernen, Durcharbeiten und viel Erfolg! Sie können wir auch gern Ihre Fragen, Wünsche und Anregungen oder Ihr Feedback an [email protected] senden.
Ihr
Mark B.
Danksagung & Vorwort
Was ist Programmieren
Warum Python?
Wir richten eine Arbeitsumgebung ein
Datentypen
None
String
Ganzzahlen
Kommazahlen
Boolean
Listen
Tupel
Dictionary
Set
Operatoren
Mathematische Operatoren
Bitweise Operatoren
Logische Operatoren
Vergleichsoperatoren
Zuweisungsoperator
Typenkonvertierung
Wiederholungen & Verzweigungen
Kommentare
Funktionen
Lambda Funktionen
Arbeiten mit Dateien
XML-Dateien
CSV-Dateien
Exkurs Zeichenkodierung
Objektorientierung
Vererbung
Module
Komplexe Module in einem Ordner
Fehlerbehandlung
Reguläre Ausdrücke
Praktisches Beispiel - Email Validierung
Arbeiten mit Datums- und Zeitangaben
CLI Programme & Kommandozeilenargumente
Webapplikationen in Python
Webseiten mit Python - Abschließende Worte
GUI-Programmierung
GUI - Entwicklung in Aktion
Maschinelles lernen mit Python
Weiterführende Infos & Interessantes
Python Flügel verleihen
Weitere Buchprojekte
Programmieren bedeutet grob gesagt dem Computer den Lösungsweg für eine Aufgabe beizubringen. Dies machen wir mit Programmanweisungen, die in einer speziellen Sprache geschrieben werden.
Die ersten Computer mussten mit sogenannten Lochkarten programmiert werden. Hierbei war es extrem mühsam die Löcher in diesen Karten in der richtigen Anordnung zu stanzen. Diese Art der Programmierung war zwar für den Computer die einzig verständliche Art und Wiese aber für uns Menschen umso schwerer nachvollziehbar und erforderte genaueste Kenntnisse jeder einzelnen Schaltung. Daher wurden mit der Zeit Programmiersprachen entwickelt um den Programmier-Vorgang zu erleichtern.
Die erste war Assembler - eine Sprache mit der weiterhin jeder einzelne Prozessorschritt programmiert wurde. Zur besseren Lesbarkeit für uns Menschen wurden jedoch einfache Abkürzungen wie mov für move (bewegen / verschieben) oder jne für jump when not equal (springen wenn nicht gleich) verwendet. Immer noch war es für den Programmierer unerlässlich sich genauestens mit dem Aufbau des Prozessors auszukennen. Anstatt abstrakter Folgen von Nullen und Einsen waren die leichter verständlichen Abkürzungen eine deutliche Arbeitserleichterung. Problematisch war allerdings, dass ein anderer Rechner durchaus andere Operationen für seinen Prozessor verwenden konnte und daher musste ein Assembler-Programm unter Umständen für einen anderen Rechner komplett umgeschrieben werden.
Darum entwickelte man die sogenannten Hochsprachen. Diese abstrahieren Programmanweisungen von den einzelnen Prozessor-Schritten. Beim Übersetzen (kompilieren) eines solchen Programmcodes werden dann die einzelnen Programmanweisungen in den jeweiligen passenden Maschinencode übersetzt. Das bedeutete dann, dass es endlich möglich wurde, das gleiche Programm ohne Änderungen für verschiedenste Prozessoren zu kompilieren.
Außerdem wurde es deutlich einfacher Programme zu schreiben, denn Programmierer mussten nicht mehr jeden einzelnen Prozessorschritt beschreiben und konnten mit gut verständlichen Anweisungen Programme entwickeln selbst ohne genaue Kenntnisse des Aufbaues der jeweiligen Prozessoren.
Wie wichtig dieser Schritt war und wie sehr es das Programmieren vereinfacht und damit mehr Leuten zugänglich gemacht hat sieht man, wenn man diese zwei Programme vergleicht:
section data
hello db "Hallo Welt!", 0xa
len equ $-hello
section text
global _start
_start:
mov eax, 4
mov ebx, 1
mov ecx, hello
mov edx, len
int 80h
mov eax, 1
mov ebx, 0
int 80h
#!/usr/bin/python3
print("Hallo Welt!")
Wie Sie sehen können, sind Programme in höheren Programmiersprachen deutlich einfacher zu verstehen und zu lesen. Darüber hinaus ist der Quelltext deutlich kompakter und übersichtlicher.
Heutzutage muss man bei den Hochsprachen zwischen interpretierten und kompilierten Sprachen unterscheiden. Beim Kompilieren wird der Quelltext (menschenlesbare Programmieranweisungen) in Maschinencode übersetzt. Zu dieser Kategorie zählen unter anderen C, C++, Delphi, uvm.
Im Gegensatz dazu werden interpretierte Sprachen von einem Programm, dem sogenannten Interpreter, ausgeführt. Hierzu wird der Quellcode direkt oder ein Zwischencode (auch Bytecode genannt) eingelesen, analysiert und ausgeführt. Das Programm wird also erst bei der Ausführung übersetzt. Dies ermöglicht es auch, dass das gleiche Programm unter verschiedenen Betriebssystemen laufen kann. In diese Kategorie fällt auch Python.
Die Vielfalt von Programmiersprachen bringt auch ein Problem mit sich - die Qual der Wahl. Welche Sprache(n) sollte man lernen und wo liegen die Vorteile der jeweiligen Sprachen? Grundsätzlich ist eine Programmiersprache ein Werkzeug und wie bei Werkzeugen üblich hat jedes Werkzeug einen Einsatzzweck sowie Vor- und Nachteile für bestimmte Anwendungen. Daher wollen wir uns im folgenden Abschnitt ansehen was Python so interessant macht.
Obwohl ich Sie nach dem Kauf dieses Buches sicherlich nicht mehr von der Verwendung von Python als Programmiersprache überzeugen muss, will ich Ihnen dennoch die für mich persönlich wichtigsten Vorteile dieser Sprache nicht vorenthalten.
Python bietet eine einfache und gut verständliche Syntax. Dies ermöglicht es Anfängern schnell in die Python-Programmierung einzusteigen. Darüber hinaus ist Python aber sehr mächtig und bietet die Möglichkeit auch komplexe Aufgaben zu lösen und sogar in einem gewissen Maß maschinennahe zu programmieren. Wer also Python beherrscht kann sehr viel damit realisieren bevor er an dessen Grenzen stößt.
Dazu gibt es zahlreiche Zusatzmodule die man in seinen Programmen verwenden kann und die die tägliche Arbeit deutlich erleichtern. Dieser Zugriff auf einen großen Pool an fertigen Code den man nur noch verwenden muss um eine konkrete Aufgabe zu lösen ermöglicht die schnelle Entwicklung von eigenen Anwendungen.
In der Regel wird ein Programmierer nicht gezwungen übersichtlich formatierten und gut lesbaren Code zu schreiben. Dabei ist das ein sehr wichtiger Punkt. Natürlich ist Ihnen morgen und übermorgen noch vollkommen klar was Sie wie und warum gemacht haben - wie sieht es aber aus, wenn Sie alten Code nach Monaten wieder öffnen und daran weiterarbeiten wollen? Noch wichtiger wird es wenn mehrere Personen am gleichen Projekt arbeiten. Hier geht Python einen meiner Meinung nach sehr guten Weg. Python-Code verzichtet auf Anfangs- und Endmarkierungen für Code-Blöcke und verwendet dazu Einrückungen. Damit muss der Entwickler ein Mindestmaß an übersichtlicher Formatierung verwenden damit der Code korrekt ausgeführt werden kann. Das wiederum sorgt dafür, dass Anfänger von Beginn an lernen ordentlichen und übersichtlichen Programmcode zu schreiben.
Python nimmt uns Entwicklern einiges an Arbeit ab - so müssen wir uns nicht um die Reservierung oder die Freigabe von Arbeitsspeicher kümmern. Es werden auch Typenkonvertierungen automatisch vorgenommen sofern diese eindeutig sind. Etc.
Der Code ist plattformunabhängig und kann ohne Änderungen unter Linux, Mac OSX oder Windows laufen sofern wir ein paar Dinge bei der Entwicklung berücksichtigen.
Python ist vielseitig und ermöglicht es verschiedenste Projekte zu entwickeln. Neben richtigen Anwendungen mit oder ohne grafische Benutzeroberfläche kann man in Python Addons bzw. Plugins für diverse Anwendungen schreiben. Darüber hinaus lassen sich einfache kleine Wartungsscripts zur Automatisation wiederkehrender Aufgaben zB für die Systemverwaltung oder für Sicherheitstests schreiben und sogar Webapplikationen sind damit realisierbar.
Auf Grund der PSF-Lizenz, die es erlaubt den Python-Interpreter in kommerzielle Anwendungen einzubetten ist diese Sprache auch sehr attraktiv für kommerzielle Anwendungen.
Python konzentriert sich in den meisten Fällen darauf den Entwickler nur einen Weg anzubieten. Dadurch wird die Sprache noch einfacher und schneller zu lernen. Andere Sprachen bieten oft mehrere Sprachelemente, die für die gleiche Aufgabe einsetzbar wären. Das mag in Ausnahmefällen Sinn machen führt aber auch dazu, dass man nicht nur einen, sondern mehrere Wege erlernen muss um das gleiche Problem zu lösen.
Ich persönlich verwende in der Regel if - elseif - else Konstruktionen bei der PHP-Entwicklung für so gut wie alle Gelegenheiten. Einer meine Freelancer präferiert hingegen switch - case Konstruktionen. Würden wir beide das gleiche Problem lösen, dann würden wir dies mit unterschiedlichen Sprachelementen machen. In Python wird versucht an dieser Stelle die Sprachelemente zu vereinheitlichen und sorgt so dafür, dass man sich auch in den Quelltext von anderen Personen schneller einlesen kann.
Sie können Python-Programme natürlich in jedem Betriebssystem entwickeln. Ich werde Ihnen die Beispiele hier Großteils anhand einer Linux-Distribution erklären und würde Sie einladen, diesem Betriebssystem eine Chance zu geben falls Sie mit Windows oder Mac OSX arbeiten.
Die Gründe hierzu sind vielseitig - vor allem macht das Sinn wegen der einfachen Einrichtung und Installation diverser Dienste und dem offenen Aufbau des Systems. In vielerlei Hinsicht haben Sie die Möglichkeit einem Linux-System und darin laufenden Programmen genau auf die Finger zu schauen. Dadurch werden einige Dinge für uns Entwickler deutlich klarer.
Darüber hinaus laufen die meisten Webserver ebenfalls auf Linux. Daher macht es durchaus Sinn, seine Web-Anwendungen auf eben genau dieser Plattform zu testen und sich mit diesem System zu beschäftigen.
Für diejenigen, die keinen alten Rechner oder Laptop zur Verfügung haben und auch kein Linux-System mit Dual-Boot parallel installieren wollen, gibt es Einplatinencomputer. Für gut 50-60 EUR erhalten Sie einen Raspberry Pi 3 inklusive SD-Karte (als Festplattenersatz), Netzgerät und Gehäuse. Günstiger geht der Einstieg in die Linux-Welt kaum.
Wenn Sie sich für einen Respberry Pi entschieden haben kann ich Ihnen NOOBS ans Herz legen. NOOBS können Sie unter https://www.raspberrypi.org/downloads/noobs/ kostenlos downloaden. Die ZIP-Datei können Sie einfach entpacken und die Dateien auf die SD-Karte kopieren. Wenn Sie nun bei booten des Raspberry die Shift-Taste auf der Tastatur gedrückt halten kommen Sie in den NOOBS Installationsdialog. Dort können Sie Raspian auswählen und installieren. In wenigen Minuten ist Ihr kleiner Linux-Rechner einsatzbereit.
Ich würde Ihnen raten eine Micro-SD Karte mit mindestens 16GB Speicherplatz zu kaufen!
Denjenigen, die Linux auf einem Zweitrechner ausprobieren wollen kann ich Linux Mint ans Herz legen. Dazu muss ich kurz erklären was es mit Linux und den Distributionen auf sich hat...
Linux an sich ist im Grunde nur der Betriebssystemkern, der frei verfügbar ist. Eine Linux-Distribution oder kurz Distro ist eine Softwarezusammenstellung. Hier wird der Kern des Betriebsystems mit einer Sammlung von vorinstallierten Programmen abgeboten. Viele Distros sind kostenlos und wieder andere beinhalten einen kostenpflichtigen Support. Der Grund für die vielen unterschiedlichen Distributionen liegt darin, dass meist eine gewisse Philosophie dahinter steckt.
Manche Distribution ist für den Serverbetrieb ausgelegt, andere richten sich an Pentester und wieder andere an Firmenkunden oder Privatanwender. Der Unterschied liegt hierbei vor allem in der Paketauswahl. Pakete sind Programme bzw. Programmteile, die in einem zentralen Update-Mechanismus enthalten sind.
Firmen suchen in der Regel nach einer Distribution für die langfristig Sicherheitsupdates zur Verfügung gestellt werden (LTS - Long Term Support) und verlangen weiters möglichst hohe Stabilität vom System. Hier wird dann auch gern eine deutlich beschränktere Auswahl an Software, die dafür ausführlicher und länger getestet wurde in Kauf genommen. Daraus ergibt sich ebenfalls, dass die Pakete alle ein paar Versionen hinter der aktuellen Version hinterherhinken.
(zB Debian oder CentOS)
Privatanwender-Distros hingegen bieten meist eine größere Auswahl an Software-Paketen weil es nicht klar ist, was genau die User machen wollen. Hier reicht die Palette von einfachen Office-Anwendungen und Internetsurfen über das Spielen bis hin zu Video- und Photobearbeitung.
(zB Linux Mint)
Softwareentwickler hingegen wollen oftmals Zugriff auf die neuesten Paketversionen (bleeding edge) um diese schnellstmöglich zu testen und nehmen hier auch gern in Kauf, dass eine solche Distro nicht die stabilste Plattform bietet.
(zB Fedora)
Server-Versionen enthalten meist nur die allernötigsten Pakete und keine grafische Benutzeroberfläche. Hier gilt, dass jedes laufende Programm eine Sicherheitslücke enthalten könnte und somit ein Einfallstor für Angriffe darstellen kann. Daher wird hier die Software auf das beschränkt was wirklich benötigt wird.
Meine Empfehlung Linux Mint zu probieren basiert darauf, dass diese Distro einen guten Kompromiss aus Stabilität und Aktualität bietet. Darüber hinaus gibt es eine gute Community, die mit Rat und Tat zur Seite steht und den Einstieg erleichtert.
Eine Anleitung zur Installation und für die ersten Schritte finden Sie unter:
https://linuxmint.com/documentation/user-guide/Cinnamon/german_18.0.pdf
Natürlich können Sie aber auch mit Ihrem gewohnten Betriebssystem arbeiten. Bei der Auswahl der IDE (Integrated Development Environment bzw. integrierte Entwicklungsumgebung auf deutsch) habe ich darauf geachtet, dass diese für Windows, Mac OSX und Linux verfügbar ist. Gleiches ist selbstverständlich auch bei Python der Fall. Die jeweilige Installations-Datei für Ihr System können Sie unter https://www.python.org/downloads/ herunterladen.
Bei Linux Mint 18.3 ist Python in der Version 3.5 bereits vorinstalliert. Allerdings fehlt pip. Dies können wir mit dem Kommando sudo apt-get install python3-pip installieren. Öffnen Sie dazu das Programm Terminal und geben Sie einfach diesen Befehl ein. Falls Sie eine andere Linux-Distribution nutzen, müssen Sie den jeweiligen Paketmanager verwenden.
Achtung Falle!
Wenn Sie im Terminal aufgefordert werden Ihr Passwort einzutippen dann sehen Sie nicht, dass Sie tippen. Lassen Sie sich nicht beirren und schreiben Sie einfach weiter. Nach bestätigen der Eingabe mit Enter wird der Befehl ausgeführt oder eine Fehlermeldung ausgegeben, wenn Sie sich vertippt haben.
Danach werden wir MS Visual Sudio Code von https://code.visualstudio.com/download herunterladen, installieren und einrichten. Für Linux Mint benötigen Sie das .deb-Paket.
Sobald Sie das Programm installiert haben können wir VS Code starten und mit der Einrichtung beginnen. Zuerst müssen wir die Python Erweiterung installieren. Dazu klicken Sie bitte auf das - Symbol ganz links und dann tragen Sie Python in das Suchfeld ein wie Sie es in der Abbildung sehen.
Die Installation von Python 2018.1 (ms-python.python) starten Sie mit einem Klick auf den grünen Installieren-Button.
Sobald das geschehen ist müssen Sie VS Code neu starten. Danach können Sie mit der Tastenkombination Strg + Shift + P die kontextbasierte Befehlszeile aufrufen. Dort tippen Sie Python: Select ein Sie sollten folgendes sehen:
Uns interessiert an dieser Stelle der Befehl Python: Select Interpreter mit dem wir in der Lage sind den gewünschten Interpreter in der gewünschten Version auszuwählen. Damit wird das Starten und Debuggen von Python-Code direkt aus der IDE möglich.
Da ich meine Bücher an einem Mac layoute habe ich aus praktischen Gründen die Screenshots auch an diesem Mac erstellt. Im Gegensatz zu Linux wurde hier zuerst der Python-Interpreter von System automatisch gewählt. Erst beim zweiten Aufruf des Befehles sah ich folgendes:
Hier kann ich nun aus allen gefundenen Python-Versionen die gewünschte auswählen. Ich verwende an dieser Stelle /usr/local/bin/python3. Da dies ein Link (soetwas wie eine Verknüpfung unter Windows) ist der immer auf die aktuellste Version von Python 3 zeigt, wird so nach einem Update immer der neueste Interpreter automatisch verwendet.
Abgesehen von einem unterschiedlichen Pfad funktioniert dieser Mechanismus unter Mac OSX und Linux gleich. Wie Sie so ein Verhalten unter Windows erreichen, müssen Sie selbst recherchieren.
Damit haben wir die Einrichtung soweit abgeschlossen.
Sie könnten Ihre Programme in jedem einfachen Text-Editor erstellen. Der Vorteil einer IDE liegt vor allem darin, dass Ihnen eine Eingabe-Hilfe beim Tippen Befehle und Variablennamen vorschlägt. Damit werden nicht nur Tippfehler reduziert, sondern Sie können auch nach Methoden und Eigenschaften in der Liste suchen. Das erspart oftmals den Blick in die Dokumentation. Außerdem erspart es ein wenig Tipparbeit.
Ein weiterer wichtiger Punkt ist der Debugger, der es erlaubt das Programm schrittweise zu durchlaufen und uns so hilft Fehler zu finden und zu beheben.
In der Programmierung unterscheiden wir zwischen verschiedenen Datentypen. Da ein Rechner intern nur mit den Werten 0 und 1 arbeitet (binär) muss er wissen wie er eine Folge von diesen Nullen und Einsen interpretieren soll. Genau dazu dienen die Datentypen.
Python ist gut darin selbst zu erkennen was genau der Programmierer bezweckt und daher ist es oftmals nicht nötig die benötigten Datentypen zu spezifizieren. Im Gegensatz dazu verlangen es viele Programmiersprachen dies bereits beim Anlegen einer Variable zu machen. Variablen sind übrigens im Arbeitsspeicher abgelegte Daten, die über einen vom Entwickler festgelegten Namen angesprochen werden können.
An dieser Stelle sollten wir kurz daüber Sprechen welche Regeln für die Variablennamen gelten. Ein Variablenname muss mit einem _ oder Buchstaben beginnen und darf keine Leerzeichen oder Sonderzeichen enthalten. In der Regel haben Variablen, die mit _ beginnen eine spezielle Bedeutung. Ab dem zweiten Zeichen sind auch Zahlen erlaubt. Die Verwendung von Umlauten ist zwar unter bestimmten Umständen möglich, aber ich würde Ihnen hiervon abraten.
Außerdem ist der Quellcode meiner Meinung nach besser lesbar wenn wir die Variablennamen auch in Englisch schreiben. Vergleichen Sie selbst...
if number not in numbers
if ziffer not in zahlen
Mich persönlich stört der permanente Wechsel zwischen zwei Sprachen beim lesen.
Besteht ein Variablenname aus mehreren Wörtern dann gibt es zwei Varianten die Lesbarkeit zu erhöhen:
Außerdem müssen Sie darauf achten, dass Sie keine Befehle oder Funktionsnamen von Python als Varaiblenname verwenden!
Variablennamen sollten aussagekräftig sein. Die nichtssagenden Namen wie var, a, b, s, usw., die ich bei den folgenden Beispielen verwende sind in der Praxis eher hinderlich. Solange ein Programm aus nur wenigen Zeilen besteht und man alles gleich im Blick hat stellt das kein großes Problem dar.
Bei einigen hunderten oder gar tausenden Zeilen ist es jedoch sehr mühsam, immer wieder zu suchen was nochmal genau in a, b oder x abgelegt wurde.
Dieser Datentyp wird verwendet wenn eine Variable noch keinen Wert hat oder deren Wert gelöscht werden soll.
Stellen Sie sich ein Programm vor bei dem eine Berechnung vorgenommen werden soll. Jetzt kann es vorkommen, dass diese Berechnung nicht durchführbar ist - also was liefern Sie in so einem Fall zurück?
Wir brauchen also einen Datentyp, der genau dazu da ist Nichts zu repräsentieren. Und so wird eine Variable mit dem Wert None angelegt.
Wichtig ist hierbei, dass der erste Buchstabe groß und die folgenden drei Buchstaben klein geschrieben werden. Alle anderen Schreibweisen würde zu einem Fehler führen:
liefert:
Traceback (most recent call last):
File "demo1.py", line 50, in <module>
NameError: name 'none' is not defined
VS Code weist Sie auch auf den Fehler mit der Farbe hin. So wird beispielsweise das Wort None in blau angezeigt. Falls wir none geschrieben haben bleibt dieses Wort weiß und somit wissen wir, dass wir einen Tippfehler gemacht haben.
Der String oder auch Zeichenkette genannt, ist ein Datentyp um Texte zu speichern und es gibt verschiedenste Möglichkeiten ihn in Python zu definieren und jede davon hat ihre Vor- und Nachteile:
\a
Bell - Erzeugte einen Signalton.
\b
Backspace - setzt die Ausgabeposition um ein Zeichen zurück.
\f
Formfeed - erzeugt einen Seitenvorschub.
\n
Linefeed - setzt die Ausgabeposition in die nächste Zeile.
\r
Carriage Return - setzt die Ausgabeposition an den Anfang der aktuellen Zeile.
\t
Horizontal Tab (TAB) hat die gleiche Bedeutung wie die Tabulatortaste.
\v
Vertikaler Tabulator (VT); dient zur vertikalen Einrückung.
\"
Doppeltes Hochkomma (Nötig falls der Text in " definiert wurde)
\'
Einfaches Hochkomma (Nötig falls der Text in ' definiert wurde)
\\
Backslash, der wirklich als solcher in dem String erscheinen soll
Eine alternative Schreibweise wäre:
Diese bietet sich an wenn der Text " enthalten soll, denn
ist besser lesbar als
Die dritte Variante wäre:
Hallo Welt"""
Damit lassen sich mehrzeilige Texte schnell und einfach definieren. Die Zeilenschaltungen zwischen """ und """ werden hierbei automatisch zum Teil des Strings.
Auf Zeichenketten kann man auch diverse Methoden anwenden.
print(parts)
liefert: ['+43 ', ' 1 ', ' 123 456']
Hierbei erhalten wir eine Liste. Was das ist sehen wir uns noch später an. An dieser Stelle fällt uns aber auf, dass wir zwar Ländervorwahl, Ortsvorwahl und Telefonnummer geteilt haben aber noch störende Leerzeichen in der Liste haben.
print(phone.replace(" ", ""))
liefert: +43/1/123456
Hiermit wird jedes Leerzeichen durch einen leere Zeichenkette ersetzt - also entfernt.
Dabei gilt es zu beachten, dass eine Methode einen Rückgabewerte hat. Dieser wird in dem Fall an Print übergeben und damit auf dem Bildschirm ausgegeben. Hierbei wird der Wert von phone aber nicht verändert! Wollen wir diese Änderung in der Variable vornehmen, müssen wir
print(phone)
schreiben! Dadurch wird der Inhalt der Variable überschrieben bevor diese ausgegeben wird.
print(index)
liefert: 2
Hierbei ist es wichtig zu wissen, dass Python wie alle anderen Programmiersprachen mit 0 zu zählen beginnt. Also stellt 2 den dritten Buchstaben dar! Analog dazu beginnt rfind() von rechts aus zu suchen.
print(var.lower())
print(var.upper())
print(var.capitalize())
print(var.swapcase())
print(var.title())
liefert:
text mit groß- und kleinschreibung
TEXT MIT GROSS- UND KLEINSCHREIBUNG
Text mit groß- und kleinschreibung
tEXT MIT gROSS- UND kLEINSCHREIBUNG
Text Mit Groß- Und Kleinschreibung
print("'" + var.strip() + "'")
Liefert: 'Text mit Groß- und Kleinschreibung'
Whitespaces sind nicht sichtbare Zeichen wie Leerzeichen, Tabulatoren, Zeilenschaltungen, etc. Lesen wir Dateien zeilenweise ein, dann sind die Zeilenschaltungen am Ende der Zeile im String enthalten. Mit strip() werden die Whitespaces links und rechts bis zum Beginn eines Textes gelöscht nicht aber mitten im Text.
Analog dazu arbeiten lstrip() und rstrip() nur auf der linken bzw. rechten Seite des Strings.
print("Die %s kostet %8.2f EUR" % ("Vase", 123.45678))
print("Das %s kostet %8.2f EUR" % ("Auto", 27980))
liefert:
Die Vase kostet 123.46 EUR
Das Auto kostet 27980.00 EUR
Hierbei wird der erste Parameter (%s) durch den ersten Eintrag in der folgenden Liste ("Vase") ersetzt und der zweite Parameter (%8.2f) durch die jeweilige Zahl. Hierbei legt 8.2 fest, dass innsgesamt 8 Stellen inklusive 2 Nachkommastellen verwendet werden. Ist die Zahl kürzer dann wird diese mit Leerzeichen weiter eingerückt.
An dieser Stelle will ich Ihnen die wichtigsten Format-Zeichen nennen:
d
Ganzzahl mit Vorzeichen
o
Oktalzahl ohne Vorzeichen
u
Ganzzahl ohne Vorzeichen
x
Hexadezimalzahl ohne Vorzeichen (
in Kleinbuchstaben
)
e
Fließkommazahl im wissenschaftlichen Format (
kleines e
)
f
Fließkommazahl in Dezimalschreibweise
g
Fließkommazahl in wissenschaftlicher Schreibweise, wenn der Exponent kleiner als –4 ist, sonst in Dezimalschreibweise
c
Zeichen (
Strings der Länge 1 oder Ganzzahlen mit ASCII-Codes umwandeln
)
s
String (
macht aus jeder Instanz einen String mit der Funktion
str())
Weitere Format-Anweisungen entnehmen Sie bitte der Dokumentation.
var.isalnum()
True
, wenn alle Zeichen in
var
Buchstaben oder Ziffern sind
var.isalpha()
True
, wenn alle Zeichen in
var
Buchstaben sind
var.isdigit()
True
, wenn alle Zeichen in
var
Ziffern sind
var.islower()
True
, wenn alle Zeichen in
var
Kleinbuchstaben sind
var.isupper()
True
, wenn alle Zeichen in
var
Großbuchstaben sind
var.isspace()
True
, wenn alle Zeichen in
var
Whitespaces sind
var.startswith("x")
True
, wenn
var
mit
x
beginnt
var.endswith("x")
True
, wenn
var
mit
x
endet
Diese Prüfungen sind vor allem bei der Validierung von Eingaben sehr hilfreich.
Darüber hinaus lässt sich ein String wie eine Liste aus Einzelbuchstaben behandeln. Welche Optionen dieses Verhalten ermöglicht, sehen Sie beim Datentyp Liste.
Wie der Name schon sagt sind dies Zahlen, die keine Kommastellen beinhalten. Es ist essentiell wichtig zu verstehen, dass Kommazahlen und Ganzzahlen von einem Rechner unterschiedlich repräsentiert werden und daher muss der Rechner wissen, ob eine Binäre Kette aus Nullen und Einsen als Ganz- oder Kommazahl zu interpretieren ist.
Eine Ganzzahl kann in der dezimalen (Basis 10) oder hexadezimalen (Basis 16) Schreibweise angelegt werden:
print (str(d) + " " + str(h))
liefert: 255 255
Um den Python-Interpreter kenntlich zu machen um welche Schreibweise es sich handelt, wird bei der Hexadezimalschreibweise ein 0x (Null und kleines x) vorangestellt.
Kommazahlen werden in der englischen Schreibweise (Punkt als Kommatrenner) angegeben. Außerdem ist es wichtig zu wissen dass Kommazahlen immer nur Näherungswerte sind und oftmals nicht unendlich genau sind.
print (f)
print ("%22.20f" % f)
liefert:
0.7
0.69999999999999995559
Das liegt an der binären Arbeitsweise des Rechners. Fließkommazahlen werden als binäre Brüche dargestellt. Das Problem kennen wir, wenn wir 1/3 als Dezimalzahl schreiben wollen dann erhalten wir 0.3333... Dies ist eine Annäherung und wir könnten Seitenweise weitere 3er ergänzen und würden dennoch niemals exakt 1/3 erhalten.
Ähnlich verhält es sich bei den Binärbrüchen nur kommt dies dort deutlich öfter vor als im dezimalen System. In den meisten Fällen sollte dies auch nicht zum Problem werden. Bei einer sehr großen Anzahl an Kommazahlen die Aufsummiert werden kann dies aber zu kleinen Differenzen führen.
Hierzu ein kleines Beispiel:
for i in range(0, 100000000):
f += 0.7
print ("%11.2f" % f)
print ("%11.2f" % f)
Die Ergebnisse sind:
70000000.13
70000000.00
Im ersten Abschnitt habe ich 100.000.000 mal die Zahl 0,7 addiert und das Ergebnis ist wieder erwarten 70.000.000,13 anstatt 70.000.000,00. Bei der einfachen Multiplikation der Werte wurde ein korrektes Ergebnis geliefert.
Das liegt daran, dass der Fehler sich nur bei den Nachkommastellen auswirkt und mit allen Kommastellen intern gerechnet wird. Wenn man nun eine ausreichend große Anzahl dieser falschen Zahlen aufsummiert kommt es unweigerlich zu Fehlern, die mit der Anzahl der Werte immer weiter anwachsen.
Wer also mit sehr großen Zahlenkolonnen arbeiten muss und dennoch keine Rechenfehler akzeptieren kann, muss hier auf eine andere Technik ausweichen. zB:
for i in range(0, 100000001):
f += f2
print ("%31.22f" % (f / 100))
print ("%31.22f" % f2)
liefert:
70000000.7000000029802322387695
70.0000000000000000000000
Als Grundannahme habe ich in dem Fall eine kaufmännische Anwendung unterstellt. In dem Fall reicht es also mit Cent-Beträgen zu arbeiten und eine höhere Genauigkeit wird nicht benötigt.