Die ProgrammiersprachePython Anwendungen mit PySide2 / Qt V 21.05.25

Inhaltsverzeichnis

Überblick

Merkmal
Grundparadigmaimperativ: strukturiert, objektorientiert
Nebenparadigmenfunktional, reflexiv
Syntaxdistinktive Einrückungen und Zeilenenden
Speicherverwaltungautomatisch – Skriptsprache
Typsystemstark, dynamisch
Übersetzungsmodellinterpretierend
DateiendungenPY, PYC, PYD, PYO, PYW, PYZ
Ersterscheinungsjahr1990
ErfinderGuido van Rossum
HerausgeberPython Software Foundation
VorläuferABC (Syntax), Perl
AbkömmlingeCython, Numba, RPython, Starlark, Xonsh (Befehlssprache)
Standardisierungenkeine – Gemeinschaftsprojekt
ReferenzimplementierungCPython
alternative UmsetzungenCython, IronPython (.Net), MicroPython / CircuitPython, PyPy, Stackless Python
Paketverwalterpip
gängige WerkzeugeAnaconda, IPython, virtualenv / venv, PyInstaller
BibliothekenDjango, Kivy, Numba, NumPy, pandas, PySide, RxPY
empfohlene IDEEclipse + PyDev, Eric, Geany, PyCharm, VS Code
offizielle Webseitepython.org
Dateiendungen
DateiErläuterung
*.pyQuelltext
*.pycVorkompilat des Quelltextes – Bytecode für die virtuelle Maschine
*.pyoVorkompilat des Quelltextes mit Optimierungen
*.pydWindows-spezifisches Format für eine dynamische Programmbibliothek (DLL)
*.pywQuelltext eines Programms, welches über eine Benutzeroberfläche gesteuert wird
*.pyzZIP-Archiv mit allen Dateien einer Konsolenanwendung
*.pyzwZIP-Archiv mit allen Dateien einer grafischen Anwendung
Anmerkungen

Tooling

Die Referenzimplementierung CPython kann von der offiziellen Webseite python.org oder über die jeweilige Paketquelle des Hostsystems bezogen werden:

Windows choco install python pip
Ubuntu sudo apt-get install python3 python3-pip

Verwalten von Abhängigkeiten

Python bietet den eigenen Paketverwalter pip, um Bibliotheken lokal auf dem Hostsystem zu installieren:

> pip install <package>

Mit pip --help wird eine Übersicht aller Befehle ausgegeben.

Anforderungsdateien

In einer Textdatei requirements.txt sind alle benötigten Packages aufzulisten, welche nicht Teil der Standardbibliothek sind:

Die Installation erfolgt im selben Verzeichnis mit:

> pip install -r requirements.txt

Virtuelle Umgebungen

 

> python install <package>

 

 

Erstellen von pip-Paketen

Zum Erstellen von verteilbaren Python-Bibliotheken müssen die folgenden Werkzeuge installiert sein:

 

Grundlagen

Syntax

Statt Schlüsselwörter wie begin … end oder Schweifklammern { … } werden Anweisungsblöcke durch bloßes Einrücken wiedergegeben.

Syntaktisch erfolgt nach dem einleitenden Konstrukt ein Doppelpunkt, um den Beginn des Anweisungsblocks zu markieren.

Ein Befehlsabschluss ; am Zeilenende ist nicht notwendig und wird ignoriert. Sollen jedoch mehrere Anweisungen in einer Zeile stehen, sind diese mittels Strichpunkt voneinander zu trennen:

Verschachtelungen von Konstrukten innerhalb einer Zeile erlaubt Python hingegen nicht.

Zu beachten ist, dass entweder alle Anweisungen noch auf selbiger Zeile zum Konstrukt stehen, oder unter diesem beliebig – aber jeweils gleich – eingerückt erfolgen:

In diesem Beispiel geht der Interpreter davon aus, dass nur print "A" zum Schleifenkonstrukt gehört, da sich diese Anweisung noch auf selbiger Zeile befindet. Demnach verursacht die nachfolgende Anweisung print "B" als unerwartet eingerückt einen Fehler.

Bezeichner

Python unterscheidet zwischen Groß- und Kleinschreibung. Gültige Bezeichner müssen mit einem Buchstaben oder Unterstrich beginnen, gefolgt von selbigem oder einer Zahl.

Kommentare

Tatsächlich weist Python keine eigene Syntax für mehrzeilige Kommentare vor. Jedoch ignoriert der Interpreter unzugewiesene mehrzeilige Zeichenketten.

Operatoren

Benutzereigene Operatoren sind nicht möglich.

Arithmetik
a + b Addition
a - b Subtraktion
a * b Multiplikation
a ** b Exponentiation
a / b Division
a // b abrundende Division
a % b Modulo
Vergleiche
a == b gleich
a != b ungleich
a > b größer
a >= b größer gleich
a < b kleiner
a <= b kleiner gleich

Vergleichsoperatoren lassen sich miteinander verketten:

Identitätsprüfungen
a is b wahr, wenn beide Variablen auf das selbe Objekt verweisen
a is not b wahr, wenn beide Variablen unterschiedliche Objekte referenzieren
Zugehörigkeit
a in b wahr, wenn a in b enthalten ist
a not in b wahr, wenn a nicht in b enthalten ist
Logik
not a wenn a falsch, dann True, sonst False
a and b wenn a falsch, dann a, sonst b
a or b wenn a falsch, dann b, sonst a

Bei Objekten, welche keine Wahrheitswerte darstellen, geben logische Operatoren einen der beiden Operanden zurück:

Seit Version 2.5 bietet Python bedingte Ausdrücke, sodass derartige Zweckentfremdungen logischer Operatoren vermieden werden sollten.

Bitmanipulationen
Operation Name Beschreibung
a & b AND setze Bit auf 1, wenn beide Bits 1 sind
a | b OR setze Bit auf 1, wenn zumindest ein Bit 1 ist
a ^ b XOR setze Bit auf 1, wenn nur ein Bit 1 ist
~a NOT invertiere alle Bits
a << b Linksverschiebung
a >> b Rechtsverschiebung
Zuweisungen
= Zuweisung des rechten Ausdrucks
#= kombinierte Zuweisung
mit # ∈ {+, -, *, /, %, //, **, &, |, ^, >>, <<}

Variablen und Identität

Eine Variable ist ein Name, mit welchem auf ein Objekt zugegriffen werden kann:

Ob zwei Variablen das selbe Objekt referenzieren, lässt sich durch Ermitteln der Identität mit der Funktion id herausfinden:

Diese Identität muss für ein Objekt während der gesamten Lebensdauer eindeutig und konstant sein.

Dynamische Typdeklaration

Jeder Variablen ist eine bestimmte Datenart bzw Klasse zugeordnet, welche sich zur Laufzeit ändern kann:

Kontrollstrukturen

Alle Kontrollstrukturen sind als Anweisungen umgesetzt.

Verzweigungen

Python bietet nur ein allgemeines Konstrukt für bedingte Ausführungen:

Bei Verzweigungen wird lediglich der erste zutreffende Block ausgeführt.

Musterabgleiche wie in anderen Sprachen, zumeist mit switch oder match eingeleitet, sind in Python nicht vorhanden.

Schleifen

Neben kopfgesteuerten Dauerschleifen bestehen auch Zählschleifen, welche zugleich Iteratoren darstellen:

Mit der Sprunganweisung break sind Schleifen vorzeitig beendbar; continue veranlasst den nächsten Durchlauf.

Funkionen

Eine Funktion ist ein Programmabschnitt, welcher nur bei Aufruf ausgeführt wird.

In Python müssen Funktionen nicht zwingend einen Rückgabewert definieren. Fehlt aber die return-Anweisung, wird davon ausgegangen, dass etwaige Ergebnisse keine Rolle spielen und stattdessen None zurückzuliefern ist. Das selbe trifft ebenso auf die leere Anweisung pass zu. Auch kann return ohne Ergebnis verwendet werden, um einen Anweisungsblock vorzeitig zu beenden.

Vorwerte und Schlüsselwortparameter

Innerhalb der Parameterliste können Standardwerte festgelegt werden:

Zu beachten ist, dass zwischen Vorwert, Gleichheitszeichen und Parameternamen keine Leerzeichen stehen dürfen.

Parameter ohne Vorwert müssen stets als erstes erfolgen; def V(r=1, h) würde hingegen einen Fehler verursachen.

Mehrfachrückgaben

Funktionen vermögen stets nur ein Objekt zurückzuliefern; jedoch kann diese Beschränkung inform von zusammengesetzten Objekten wie Tupeln umgangen werden:

Python fasst mehrere durch Komma voneinander getrennte Rückgabewerte automatisch zu eine Tupel zusammengefasst, sodass die umschließenden Rundklammern entfallen dürfen. Über Mehrfachzuweisungen – mittels Kommatrennung vor dem Zuweisungszeichen = – lassen sich einzelne Elemente einer Tupel als unabhängige Variablen binden.

Variable Parameteranzahl

Mit einem vorangestellten Sternchens * am Parameternamen wird ausdrücken, dass beliebig viele Werte entgegenzunehmen sind (→ variadische Funktionen, en variadic functions):

Intern fasst Python die Argumente des variablen Parameters als Tupel zusammen.

Ebenfalls kann eine Liste übergeben werden:

Ohne angefügtes Sternchen * wird die Liste als ein Objekt behandelt.

Schlüsselwortparameter

en kwargs

Bei doppeltem Sternchen ** ist zu jedem Argument auch ein Schlüsselwort mit anzugeben:

Gleich einem Wörterbuch spielt die Reihenfolge beim Durchlaufen der Argumente keine Rolle.

Globale Variablen

Python erlaubt das Verändern von äußeren Werten nur, wenn im Funktionsrumpf der Zugriff auf eine globale Variable explizit angegeben wird:

Ohne die Deklaration mit dem Schlüsselwort global geht Python von einer lokalen Variable aus.

Das neuere Schlüsselwort nonlocal verfolgt den gleichen Zweck, beschränkt sich aber auf die nächsthöherere Ebene innerhalb von Verschachtelungen.  

Ein- und Ausgaben

 

Datentypen

In Python wird alles als Objekt einer Klasse aufgefasst:

Zahlentypen int float complex
Wahrheitstyp bool
Sequenztypen str list tuple range
binäre Sequenztypen bytes bytearray memoryview
Mengentypen set frozenset
Zuordnungstyp dict
Funktionstypen functionbuiltin_function_or_method NoneType
Klassen- / Instanztyp classobj instance

Neben diesen grundlegenden Datenarten zählt die Spezifikation auch Module, Klassen, Instanzen, Funktionen, … zu den vordefinierte Standardtypen.

Mit type() kann der Datentyp – oder genauer gesagt die Klasse – eines Literals bzw Objekts abgefragt werden. Dabei sei zum Verständnis angemerkt, dass Typen und Klassen in Python vereinheitlicht wurden.

Trotz dynamischer Typisierung werden – mit Ausnahme von Ganzzahlen in Gleitkommazahlen – keine automatischen Konvertierungen vorgenommen. Stattdessen bestehen Funktionen wie int(), float() oder auch str() (benannt nach dem Zieldatentypen) für explizite Umwandlungen. Dementsprechend achtet Python streng auf Typverletzungen:

Boolesche Ausdrücke

Ähnlich wie in C werden False und True als 0 und 1 gedeutet:

Die Funktion bool() konvertiert ein Objekt ausdrücklich zu einem Wahrheitswert:

Abgesehen der folgenden Werte gibt bool() stets True zurück:

Listen und Tupeln

 

 

 

 

Wörterbücher

 

 

Mengen

 

 

 

 

Pfade

 

 

Windows

Da Windows den rechten Schrägstrich \ (backslash) als Trennzeichen für Pfade verwendet, tritt eine Verwechslung mit Unicode-Escape-Sequenzen auf:

Die Lösung für dieses Problem besteht entweder im Maskieren mit einem weiteren Schrägstrich oder im Markieren der Zeichenkette als roh (en raw string).

Dateien

 

 

Module

Module bezeichnen in andere Dateien einbindbare Objekte mit beliebig vielen Attributen. Python unterscheidet zwischen Bibliotheken sowie lokalen Modulen; erstere werden zwischen verschiedenen Programmen als Abhängigkeit geteilt, während letztere auf das hiesige Projektverzeichnis beschränkt bleiben.

Importe & Future-Anweisungen

Der Inhalt eines mit import eingebundenen Moduls ist nur über den Modulbezeichner als Namensraumszusatz verfügbar,

sofern nicht mittels from … import … der Namensraum übergangen wird,

oder mit as … umbenannt:

Die Anweisung from … import * übernimmt alles in den lokalen Namensraum.

Future-Anweisung

Zu Unterscheiden von Importen ist die Future-Anweisung (en future statement), um neue Syntax oder Semantik freizuschalten, welche andernfalls erst in zukünftigen Versionen direkt verfügbar ist:

Mit dieser Anweisung kann in PySide6 auf Member und Klasseneigentum in der von Python typischen Weise zugegriffen werden. So wird addWidget zu add_widget und anstelle von Gettern und Settern lassen sich die Attribute direkt aufrufen.

Suchpfade für Module

Beim Import sucht der Interpreter

  1. nach einem gleichnamigen Standardmodul, andernfalls

  2. im aktuellen Verzeichnis, oder in

  3. PYTHONPATH

  4. falls PYTHONPATH nicht gesetzt ist, wird installationsabhängig gesucht,

    unter Linux: /usr/lib/python3.8

Ausgabe aller Modulverzeichnisse
ModulartEndung
– in Python geschriebenes Modulpy, pyc
– dynamisch geladenes C-Moduldll, pyd, so, sl, …
– mit dem Interpreter verlinkte C-Module 
Ausgabe aller verlinkter C-Module

Übersetzungseinheiten

Tatsächlich ist ein Modul in Python nichts anderes als eine gewöhnliche Quelldatei name.py, welche Definitionen und Anweisungen enthält; wobei der Dateinahme zugleich den Modulnamen vorgibt:

Einbinden in lokale Dateien

oder interaktiv:

Modulanweisungen – beispielsweise für etwaige Konfigurationen – werden mit import ausgeführt.

Um ein Modul gleichzeitig als Bibliothek und ausführbares Script zu verwenden, sind die jeweiligen Programmanweisungen in einem bedingten Block zusammenzufassen:

Beim Einlesen eines Scripts setzt der Interpreter den Modulnamen als __main__ fest. Bezieht sich der Vergleich des bedingten Anweisungsblocks hingegen auf den Dateinamen, wird folglich der Blockinhalt immer ausgeführt, jedoch beim Interpretieren des Quelltextes als Skript ignoriert.

Pakete

Als Paket (en package) wird in Python die Gesamtheit aller Module eines Verzeichnisses zusammen mit einer sog Initialisierungsdatei __init__.py bezeichnet. Die Initialisierungsdatei kann im einfachsten Fall leer sein, oder aber Importanweisungen enthalten, sodass sich Module über den Namen des Verzeichnisses in gewohnter Punktnotation aufrufen lassen:

Ohne die Anweisung from test import a in der Initialisierungsdatei würde die Fehlermeldung auftreten:

Gesamtpaket importieren

Über die spezielle Variable __all__ kann in der Initialisierungsdatei genau spezifiziert werden, welche Module gemeinsam importierbar sein sollen:

Ist die Variable __all__ nicht definiert, werden bei Verwenden des Sternchens * alle Module eines Verzeichnisses importiert.

Installationsort

Unter ~/.local/lib/pythonX.X/site-packages/ installierte Pakete sind genauso wie die Standardbibliothek übergreifend verfügbar.

Relative Importe

Absolute Importe können unter Umstände äußerst lang sein:

from package.subpackage.subsubpackage.module import …

Module des selben Packages lassen sich aber auch vereinfacht aufrufen:

import .module

oder beziehend auf das übergeordnete Package (Elternverzeichnis):

import ..module

Beim direkten Ausführen von Untermodulen kann der Interpreter die Pfade der Importanweisungen nur auflösen, wenn die betreffende Eingabe mit der Option -m als Modulname markiert wird:

> python -m package.subpackage.module

Wird hingegen das Modul über den Verzeichnispfad aufgerufen oder ohne Flag -m, deutet der Interpreter die Datei als bloßes Skript und sucht in der Folge nicht nach projektinternen Modulen:

Der Paketname eines Modules ist mit __package__ abfragbar.

Dokumentation

Mit sog docstrings bietet Python ein Konzept, um Funktionen, Klassen sowie Module durch einen Kommentar in den ersten Zeilen zu beschreiben:

Die Dokumentation eines Objekts ist über das allgemeine Attribut __doc__ ansprechbar und kann mit der Funktion help in der interaktiven Umgebung auch unmittelbar ausgegeben werden:

Durch Eintippen von q wird die Help-Ausgabe verlassen.

Objektorientierung

Definition von objektorientierte Programmierung nach Alan Kay:

  1. Alles ist ein Objekt.
  2. Objekte kommunizieren durch das Senden und Empfangen von Nachrichten, welche wiederum aus Objekten bestehen.
  3. Jedes Objekte liegt in einem eigenen Speicherbereich.
  4. Jedes Objekt ist die Instanz einer Klasse.
  5. Eine Klasse beinhaltet das Verhalten aller ihrer Instanzen.
  6. Um eine Programmliste auszuführen, wird die Ausführungskontrolle dem ersten Objekt übergeben und das Verbleibende als dessen Nachricht behandelt.

Merkmale eines Objekts:

Obgleich Python auf Klassen beruht, entspricht die Herangehensweise im Kern der prototypenbasierten Programmierung: Jedem Objekt sind nachträglich Attribute sowie Methoden zuweisbar, sogar dynamisch zur Laufzeit. Demnach lassen sich neue Objekte entweder durch Instanziierung einer Klasse oder durch Kopieren (Klonen) eines bestehenden Objekts erzeugen:

Als Instanz wird ein Objekt im Speicher bezeichnet.

Attribute

Attribute liegen entweder als Klassenattribute für alle Instanzen vor, oder sind spezifisch für eine Instanz festgelegt (→ Instanzattribute):

Eine Instanz greift auf ein Klassenattribut nur dann zu, wenn kein gleichnamiges Instanzattribut bereits im Wörterbuch aufgelistet ist.

Intern werden Attribute von Instanzen ähnlich einem Wörterbuch verwaltet.

Dynamisches Erzeugen & Löschen

Nachfolgend eine Übersicht der wichtigsten Funktionen im Umgang mit Attributen:

FunktionWirkung
vars(OBJ)Anzeige alle Instanzattribute als Wörterbuch
dir(OBJ)Anzeige von Instanz- und Klassenattribute
getattr(OBJ, STR)Abfragen des Attributwertes
hasattr(OBJ, STR)Prüfen, ob Attribut existiert
setattr(OBJ, STR, VAL)Attributzuweisung
delattr(OBJ, STR)Löschen eines Attributs

Auch Instanzen von Funktions- und Modulklassen lassen sich Attribute dynamisch zuordnen:

Slots

Über das spezielle Attribut __slots__ kann genau angegeben werden, welche Eigenschaften eine Instanz vorweisen darf:

Vorteile

Methoden

Methoden in Python sind an eine Instanz gebundene Funktionsobjekte, deren erster Parameter auf die zugehörige Instanz verweist (Referenz):

Tatsächlich ist self kein verbindliches Schlüsselwort, um auf das Objekt selbst zu verweisen; jeder andere Bezeichner ist denkbar.

Der Methodenaufruf erfolgt in gängiger Punktnotation.

Statische Methoden

Der Dekorateur @staticmethod erzeugt eine Methode, deren erster Parameter bei Aufruf in Punktnotation nicht implizit als ein Objekt selbiger Klasse angenommen wird:

Magische Methoden

Magische Methoden weisen jeweils links und rechts angefügte doppelte Unterstriche __f__ vor. Durch das Implementieren von magischen Methoden lassen sich Klassen um besondere Funktionalitäten erweitern, welche nicht anderweitig programmierbar sind (spezielle Syntax).

Konstruktor

implementierbar als __init__

Standardkonstruktor
parametrisierte Konstruktoren

Konvention: __init__ als erste Methode

Destruktor

implementierbar als __del__

Der Speicherplatz von Objekten wird automatisch bei Verlassen des Gültigkeitsbereichs freigegeben. Dabei ruft der Übersetzer eigenmächtig die Methode __del__, sofern für eine Klasse definiert, am Ende des Lebenszyklus auf:

Mit del kann der Programmierer die Löschung vorzeitig veranlassen:

Die Methode __del__ löscht nicht das Objekt, sondern leitet nur den eigentlichen Destruktor ein, vorausgesetzt, keine weiteren Referenzen verweisen auf die betreffende Instanz:

Weitere magische Methoden

__str__ und __repr__

Datenkapselung

Mit Datenkapslung ist der Schutz von Attributen (Daten) vor einem unmittelbaren Zugriff gemeint, indem Veränderungen nur über spezielle Methoden zugelassen werden.

Python verfügt über keinen Mechanismus, um den Zugriff auf interne Variablen sowie Funktionen einzuschränken; alle Bestandteile (en members) sind grundsätzlich öffentlich (en public). Stattdessen schreibt nur eine Konvention vor, geschützte (protected) Werte durch einen vorangestellten einfachen und private Bestandteile mittels eines doppelten Unterstrich zu kennzeichnen.

Im Hintergrund löst Python als privat gekennzeichnete Bestandteile zu Instanz._Klasse__Attribut auf.

Zusammenfassung
OOPPythonBedeutung
publicnamevon Außen les- und schreibbar
protected_namevon Außen les- und schreibbar, jedoch als nicht zu benutzen gekennzeichnet (Einhaltung obliegt dem Programmierer)
private__nameweder von Außen sichtbar noch zu benutzen

Eigenschaften

en property

Die Funktion property erlaubt das Definieren von öffentlich zugänglichen Klassenattributen, welche automatisch die angegebenen Änderungs- sowie Abfragemethoden aufrufen:

Wird die Funktion property ohne Argumente aufgerufen, verhält sich das Attribut wie gehabt.

Weiteres Beispiel

Konstanten

 

 

 

Vererbung

Vererbung definiert eine Beziehung zwischen einer allgemeinen Klasse (auch Basis- / Eltern- oder Superklasse) und einer spezialisierten Klasse (Kind- oder Subklasse): Oberklasse ⊇ Unterklasse

Durch Kopieren eines bestehendes Objekts entsteht eine neue Instanz:

 

Dokumentation

Mit sog docstrings bietet Python ein Konzept, um Funktionen, Klassen sowie Module durch einen Kommentar in den ersten Zeilen zu beschreiben:

Die Dokumentation eines Objekts ist über das allgemeine Attribut __doc__ ansprechbar und kann mit der Funktion help in der interaktiven Umgebung auch unmittelbar ausgegeben werden:

Durch Eintippen von q wird die Help-Ausgabe verlassen.

Höhere Funktionen

In Python sind Funktionen First-Class-Objekte – im Englischen auch allgemein first-class citizen genannt –, was soviel bedeutet, dass Funktionen als Referenz einer anderen Funktion übergeben oder von dieser zurückgeliefert werden können:

Zudem sieht die Definition von First-Class-Objekten vor, dass diese auch einer Variable zuweisbar sind:

Funktionale Programmierung

Python unterstützt funktionale Ansätze nur nebensächlich, sodass einzig und allein dem Programmierer das Einhalten folgender Designprinzipien obliegt:

Funktionen ohne Nebenwirkungen (en side effects)
Das Funktionsergebnis hängt ausschließlich von den Eingangsparametern ab; keine globalen Variablen sowie unerwünschten Nebenwirkungen wie Ein- und Ausgaben.
Kennzeichnen von wirkbehafteten Funktionen
Pythons Typsystem umfasst nur wenige vordefinierte Grundtypen; Signaturen bleiben dem Programmierer weitestgehend verborgen. Entsprechend lassen sich Wirkungen wie Ein- / Ausgaben nur anhand des Namens vermuten.
Ausdrucksorientierte Programmierung
Statt des Gebrauchs von Variablen und Zuweisungen werden bevorzugt Konstanten sowie Funktionen miteinander zu komplexeren Ausdrücken verknüpft.

Bei Befolgen dieser Ansätze wird der Programmierer mit

belohnt.

Partielle Anwendung

Python unterstützt das Teilanwenden von Funktionen (en partial function application) nur indirekt mittels der Hilfsfunktion partial aus dem Modul functools der Standardbibliothek:

λ-Ausdrücke

en lambda expressions – auch Funktionsliterale genannt

Lambdaausdrücke müssen nicht zwangsläufig parametrisch sein:

Funktionsabschluss

en closure

Ein Funktionsabschluss liegt vor, wenn eine Funktion Zugang zu lokalen Variablen eines umschließenden, bereits abgearbeiteten Gültigkeitsbereichs besitzt, was eine äußere Funktion sein kann oder allg der Erstellungskontext:

Bei Aufruf einer übergeordneten Funktion gib_echo wird ein neuer Rahmen (en stack frame) mit dem kompilierten Programmtext der inneren Funktion echo auf dem Stapelspeicher abgelegt. Lokale Werte, auf welche die innere Funktion zugreift, bleiben erhalten.

Von einem Funktionsabschluss wird nur gesprochen, wenn die innere Funktion den lokalen Zustand speichert.

map, filter und reduce

Python bietet bereits von Haus aus einige grundlegende höhere Funktionen:

Durch map entstandene Objekte müssen zur Ausgabe in eine Liste umgewandelt werden. Ferner ist map auf einstellige Funktionen beschränkt.

Die Funktion reduce wurde in das Modul functools ausgelagert.

Dekorateure

 

 

Iteratoren

 

 

Generatoren

 

 

Konventionen

Der offizielle Style Guide for Python Code empfiehlt 4 Leerzeichen zum Einrücken. Diese Entscheidung rührt aus der Vergangenheit, als Texteditoren noch nicht mit Tabulatoren umgehen konnten. Jedoch spricht aus heutiger Sicht absolut nichts gegen das Verwenden von Tabulatoren, ganz im Gegenteil:

In jedem Fall gilt, Leerzeichen und Tabulatoren auf keinen Fall zu mischen!

Auch sollten Zeile nicht länger als 120 Zeichen sein. 

Benennungen
TypKonventionBeispiel
Variable, Funktiondurchgängig klein mit Unterstrichencount
Konstantedurchgängig groß mit UnterstrichenEULER
Klassegroßgeschrieben mit BinnenmajuskelBackgroundColor
Modul, Paketdurchgängig klein mit Unterstrichenui_main

Jedoch hält sich die Standardbibliothek selbst nicht an diese empfohlenen Regeln, und schreibt Konstanten wie math.pi durchgängig klein.

Projektstruktur

Im Zusammenhang mit dem Paketsystem hat sich der folgende Standard etabliert:

Project Name/Wurzelverzeichnis des Projekts
./binausführbare Dateien (ohne Dateiendung)
./docDokumentation für Anwender
./specProgrammspezifikation für Entwickler
./project_namealle Programmdateien des Projekts als ein Package
./project_name/__res__Ressourcen wie Bilder
./project_name/testTestmodule (→ en unit tests)
./project_name/…weitere Subpackages
./project_name/__init__.pyInitialisierungsdatei des Projektpakets
./project_name/__main__.pyausführbare Programmdatei des Projektpakets
./project_name.pysofern das Projekt nur aus einer Quelldatei besteht
./LICENSE {.md, .rst, .txt}Lizenz als Textdatei (vornehmlich ohne Endung)
./README.mdTextdatei mit wichtigen Informationen
./requirements.txtListe aller Abhängigkeiten
./setup.pyEinstellungen für das Verteilen mittels pip
Importe

Alle Importe sollten zu Beginn der Quelldatei in sortierter Weise erfolgen:

Zeilenprogramme

 

 

Anwendungen mit Qt

Installation mittels:

> pip install PySide2

Unter Linux ist zu beachten, dass Python 3 statt Version 2 standardmäßig aufgerufen wird. Um dies zu gewährleisten, kann das folgende Paket installiert werden:

> sudo apt-get install python-is-python3

Basisklassen

Jede Qt-Anwendung läuft in einer Ereignisschleife (en event loop) ab. Bei Interaktion mit der GUI werden ausgelöste Ereignisse – beispielsweise durch Klicken von Schaltflächen – in einer Warteschlange (en event queue) abgelegten. Mit jedem Durchlauf erfolgt eine Abfrage der Warteschlange, um im Anschluss jedes Ereignis zusammen mit dem Kontrollfluss an den zugehörigen Event Handler weiterzureichen. Nach Abarbeitung gibt der Event Handler die Kontrolle an die Ereignisschleife zurück.

Jedes Widget kann als Fenster auf oberster Ebene auftreten (→ en top level widget); ist somit nicht auf ein anderes Widget oder Layout angewiesen. Folglich kann ein Fenster aus jedem beliebigen Widget erstellt werden.

QApplication class
QMainWindow class

Die QMainWindow-Klasse beschreibt Widgets, welche viele Standardfunktionen wie Menüs und Leisten bereitstellen.

Durch Vererbung werden neue benutzerdefinierte Fenster abgleitet:

Signale und Slots

In Python kann jede Funktion bzw Methode als Slot fungieren und Daten empfangen. Viele Qt-Widgets weisen auch eigene Slots vor, um sich direkt miteinander verknüpfen zu lassen.

Komponenten

In Qt werden Komponenten der UI als Widget bezeichnet. Neben einer ganzen Reihe bestehender Widgets sind auch eigene definierbar.

 

Cython