Fortgeschrittenes Python: Datenstrukturen, Funktionen und OOP
Erklären Sie den Unterschied zwischen einer Liste (list) und einem Tupel (tuple) in Python.
Antwort:
Listen sind veränderlich (mutable), was bedeutet, dass ihre Elemente nach der Erstellung geändert werden können, und werden mit eckigen Klammern [] definiert. Tupel sind unveränderlich (immutable), was bedeutet, dass ihre Elemente nicht geändert werden können, und werden mit runden Klammern () definiert. Tupel sind im Allgemeinen schneller und können als Schlüssel in Wörterbüchern (dictionaries) verwendet werden.
Was ist eine Dictionary Comprehension? Geben Sie ein Beispiel.
Antwort:
Eine Dictionary Comprehension ist eine prägnante Methode zur Erstellung von Dictionaries. Sie besteht aus einem Ausdruck, gefolgt von einer for-Klausel, dann null oder mehr for- oder if-Klauseln. Beispiel: squares = {x: x*x for x in range(5)} erstellt {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}.
Was ist der Zweck von *args und **kwargs in Funktionsdefinitionen?
Antwort:
*args ermöglicht es einer Funktion, eine beliebige Anzahl von Positionsargumenten zu akzeptieren, die in einem Tupel gesammelt werden. **kwargs ermöglicht es einer Funktion, eine beliebige Anzahl von Schlüsselwortargumenten zu akzeptieren, die in einem Dictionary gesammelt werden. Sie ermöglichen flexible Funktionssignaturen.
Erklären Sie das Konzept eines Decorators in Python.
Antwort:
Ein Decorator ist ein Entwurfsmuster (design pattern), das es Ihnen ermöglicht, die Funktionalität einer Funktion oder Methode zu modifizieren oder zu erweitern, ohne deren Quellcode explizit zu ändern. Es ist im Wesentlichen eine Funktion, die eine andere Funktion als Argument nimmt, zusätzliche Funktionalität hinzufügt und eine neue Funktion zurückgibt. Sie werden häufig für Logging, Zeitmessung oder Zugriffskontrolle verwendet.
Was ist der Unterschied zwischen den Methoden __init__ und __new__ in Python-Klassen?
Antwort:
__new__ ist eine statische Methode, die für die Erstellung und Rückgabe einer neuen Instanz der Klasse verantwortlich ist, bevor __init__ aufgerufen wird. __init__ ist eine Instanzmethode, die das neu erstellte Objekt initialisiert. __new__ wird selten überschrieben, es sei denn, Sie müssen die Objekterstellung selbst steuern, z. B. für Singletons.
Beschreiben Sie Method Overriding und Method Overloading in Python.
Antwort:
Method Overriding tritt auf, wenn eine Unterklasse eine spezifische Implementierung für eine Methode bereitstellt, die bereits in ihrer Oberklasse definiert ist. Python unterstützt traditionelles Method Overloading (mehrere Methoden mit demselben Namen, aber unterschiedlichen Parametern) nicht direkt; stattdessen können Sie Standardargumente oder *args/**kwargs verwenden, um ähnliche Flexibilität zu erreichen.
Was ist ein Generator in Python und warum sollten Sie ihn verwenden?
Antwort:
Ein Generator ist eine Funktion, die einen Iterator zurückgibt, der eine Sequenz von Ergebnissen einzeln mithilfe des yield-Schlüsselworts erzeugt, anstatt einen einzelnen Wert zurückzugeben. Sie sind speichereffizient, da sie nicht die gesamte Sequenz im Speicher speichern, was sie ideal für große Datensätze oder unendliche Sequenzen macht.
Erklären Sie den Global Interpreter Lock (GIL) in Python.
Antwort:
Der GIL ist ein Mutex, der den Zugriff auf Python-Objekte schützt und verhindert, dass mehrere native Threads gleichzeitig Python-Bytecodes ausführen. Das bedeutet, dass selbst auf Multi-Core-Prozessoren zu jedem Zeitpunkt nur ein Thread Python-Bytecode ausführen kann. Er vereinfacht die Speicherverwaltung, kann aber die echte parallele Ausführung für CPU-gebundene Aufgaben einschränken.
Was ist der Zweck von super() in Python?
Antwort:
super() wird verwendet, um eine Methode von einer Eltern- oder Geschwisterklasse aufzurufen. Es ermöglicht Ihnen den Zugriff auf geerbte Methoden, die in einer Unterklasse überschrieben wurden, und stellt die korrekte Method Resolution Order (MRO) in komplexen Vererbungshierarchien sicher. Es wird häufig in __init__-Methoden von Unterklassen verwendet.
Wie handhaben Sie Ausnahmen (exceptions) in Python? Geben Sie ein einfaches Beispiel.
Antwort:
Ausnahmen werden mit den Blöcken try, except, else und finally behandelt. Der try-Block enthält Code, der eine Ausnahme auslösen könnte. except fängt spezifische Ausnahmen ab. else wird ausgeführt, wenn keine Ausnahme auftritt, und finally wird immer ausgeführt, unabhängig davon, ob eine Ausnahme aufgetreten ist. Beispiel: try: 1/0 except ZeroDivisionError: print('Cannot divide by zero').
Was ist der Unterschied zwischen einer flachen Kopie (shallow copy) und einer tiefen Kopie (deep copy)?
Antwort:
Eine flache Kopie erstellt ein neues zusammengesetztes Objekt, fügt dann aber Referenzen auf die im Original gefundenen Objekte ein. Wenn das Original veränderliche Objekte enthält, werden Änderungen an diesen Objekten in der flachen Kopie reflektiert. Eine tiefe Kopie erstellt ein neues zusammengesetztes Objekt und fügt dann rekursiv Kopien der im Original gefundenen Objekte ein, was eine vollständige Unabhängigkeit gewährleistet.
Erklären Sie das Konzept von Context Managern und die with-Anweisung.
Antwort:
Context Manager bieten eine saubere Möglichkeit, Ressourcen zu verwalten und sicherzustellen, dass Setup- und Teardown-Operationen korrekt behandelt werden, auch wenn Fehler auftreten. Die with-Anweisung wird verwendet, um die Beschaffung und Freigabe von Ressourcen automatisch zu handhaben. Häufige Anwendungsfälle sind die Dateiverarbeitung, Datenbankverbindungen und Sperren, die sicherstellen, dass Ressourcen ordnungsgemäß geschlossen werden.