P
prepair.app
Interview starten →
EnglishУкраїнськаРусскийDeutsch
🐍

Python-Backend-Interviewfragen

Python-Backend-Interviews decken die Interna der Sprache, asynchrone Programmierung, Django oder FastAPI und den Umgang mit Datenbanken ab. Die folgenden Fragen kommen am häufigsten vor, jeweils mit einer Musterantwort.

Junior · keine Erfahrung / unter 1 JahrMiddle · 2–4 Jahre ErfahrungSenior · 5+ Jahre Erfahrung

Worum es geht

Datentypen und Strukturen
Decorators und Generatoren
GIL und Nebenläufigkeit
asyncio und async/await
Django / FastAPI
ORM und SQL-Optimierung

12 echte Fragen mit Antworten

Zu jeder Frage gibt es eine Musterantwort, mit der du deine eigene vergleichen kannst.

1

Was ist der GIL, und wie beeinflusst er Multithreading?

Antwort

Der Global Interpreter Lock erlaubt es in CPython immer nur einem Thread, Python-Bytecode auszuführen, sodass Threads Python-Code nie parallel über mehrere Cores ausführen. Threads helfen trotzdem bei I/O-lastiger Arbeit, weil der GIL während blockierender Aufrufe freigegeben wird. Für CPU-lastige Arbeit braucht man Multiprocessing, eine C-Extension, die den GIL freigibt, oder eine andere Runtime.

2

Was unterscheidet eine Liste von einem Tupel? Wann nutzt man welches?

Antwort

Listen sind mutable, Tupel sind immutable, wodurch Tupel hashbar und als Dictionary-Keys nutzbar werden. Tupel sind etwas schneller und signalisieren dem Leser, dass die Sammlung ein feststehender Datensatz ist und keine wachsende Sequenz. Eine Liste nutzt man, wenn sich der Inhalt ändert, ein Tupel für feste, heterogene Daten wie Koordinaten oder ein zurückgegebenes Paar.

3

Was ist ein Decorator? Schreib einen, der die Ausführungszeit misst.

Antwort

Ein Decorator ist ein Callable, das eine Funktion entgegennimmt und eine Ersatzfunktion zurückgibt, um Verhalten hinzuzufügen, ohne den ursprünglichen Body anzufassen. Ein Timing-Decorator umschließt den Aufruf: perf_counter vorher notieren, die Funktion aufrufen, perf_counter danach notieren, die Differenz loggen und das Ergebnis zurückgeben. Man sollte immer functools.wraps auf die innere Funktion anwenden, damit Name, Docstring und Signatur des Originals bei der Introspektion erhalten bleiben.

4

Erkläre den Unterschied zwischen einem Generator und einer normalen Funktion. Wozu braucht man yield?

Antwort

Eine normale Funktion berechnet alles und gibt einmal zurück; ein Generator pausiert bei jedem yield und setzt genau dort fort, wo er aufgehört hat, und liefert Werte lazy. Das bedeutet konstanten Speicherverbrauch unabhängig davon, wie viele Elemente erzeugt werden, sodass man über eine mehrere Gigabyte große Datei oder eine unendliche Sequenz iterieren kann. yield ist das, was die Funktion in eine Zustandsmaschine verwandelt, die der Interpreter pausieren und fortsetzen kann.

5

Was sind *args und **kwargs? Gib ein Anwendungsbeispiel.

Antwort

*args sammelt zusätzliche positionale Argumente in einem Tupel, **kwargs sammelt zusätzliche Keyword-Argumente in einem Dict. Man nutzt sie, wenn eine Funktion eine beliebige Signatur akzeptieren muss — am häufigsten in Decorators und Wrappern, die alles an das umschlossene Callable weiterreichen. Das Gegenstück ist das Unpacking: Der Aufruf f(*items, **options) verteilt eine Sequenz und ein Mapping auf die Argumente.

6

Was ist der Unterschied zwischen multiprocessing, threading und asyncio?

Antwort

Threading liefert Nebenläufigkeit innerhalb eines Prozesses und hilft wegen des GIL nur bei I/O. Multiprocessing startet separate Interpreter mit echtem Parallelismus, auf Kosten von Prozessstart und Interprozesskommunikation — die richtige Wahl für CPU-lastige Arbeit. asyncio ist single-threaded kooperative Nebenläufigkeit: Tasks geben an await-Punkten die Kontrolle ab, was auf Zehntausende Sockets skaliert, aber alles blockiert, sobald man innerhalb einer Coroutine synchronen Code aufruft.

7

Was ist ein Context Manager? Wie implementiert man einen eigenen?

Antwort

Ein Context Manager garantiert Setup und Teardown rund um einen Block, genau das nutzt with, um Dateien zu schließen oder Locks freizugeben, selbst wenn eine Exception geworfen wird. Man implementiert einen entweder als Klasse mit __enter__ und __exit__ oder als Generator mit @contextlib.contextmanager, der genau einmal zwischen Setup- und Cleanup-Code yieldet. Die __exit__-Methode erhält die Exception-Details und kann die Exception unterdrücken, indem sie True zurückgibt.

8

Erkläre MRO und Mehrfachvererbung.

Antwort

Die Method Resolution Order legt die Reihenfolge fest, in der Python Klassen nach einem Attribut durchsucht, berechnet über den C3-Linearisierungsalgorithmus. Sie garantiert, dass eine Klasse immer vor ihren Elternklassen steht und die Reihenfolge der Basisklassen eingehalten wird, wodurch Diamond-Vererbung vorhersagbar bleibt. super() folgt der MRO, statt direkt zur Elternklasse zu springen, weshalb kooperative Mehrfachvererbung verlangt, dass jede Klasse in der Kette super() aufruft.

9

Was ist das N+1-Problem im Django-ORM? Wie helfen select_related und prefetch_related?

Antwort

N+1 tritt auf, wenn ein QuerySet N Objekte zurückgibt und jeder Zugriff auf ein verwandtes Feld eine eigene Query auslöst. select_related löst das für ForeignKey und OneToOne, indem es einen SQL-JOIN ausführt und das verwandte Objekt in derselben Query mitliefert. prefetch_related behandelt ManyToMany und Reverse-Relations, indem es eine zweite Query ausführt und die Ergebnisse in Python zusammenführt, weshalb dabei zwei Queries statt einer entstehen.

10

Was ist der Unterschied zwischen einer Shallow Copy und einer Deep Copy?

Antwort

Eine Shallow Copy erzeugt einen neuen äußeren Container, behält aber Referenzen auf dieselben verschachtelten Objekte, sodass das Ändern einer verschachtelten Liste in beiden Kopien sichtbar ist. Eine Deep Copy dupliziert rekursiv alles und liefert volle Unabhängigkeit auf Kosten von Zeit und Speicher. Der Bug, den das in der Praxis verursacht, ist ein mutable Default-Argument oder eine geteilte, verschachtelte Config, die ein Aufrufer für alle anderen mit verändert.

11

Was ist der Unterschied zwischen __str__ und __repr__?

Antwort

__repr__ richtet sich an Entwickler und sollte idealerweise eindeutig sein — oft etwas, das wie der Ausdruck aussieht, mit dem man das Objekt neu erzeugen könnte; das zeigen REPL und Debugger an. __str__ richtet sich an Endnutzer und wird von print() und str() aufgerufen, wobei es auf __repr__ zurückfällt, wenn es nicht definiert ist. __repr__ zu implementieren ist die wertvollere Gewohnheit, weil es Logs und Tracebacks lesbar macht.

12

Wie verwaltet Python Speicher, und was ist Reference Counting?

Antwort

CPython gibt ein Objekt frei, sobald sein Referenzzähler auf null fällt, wodurch die Freigabe sofort und vorhersagbar erfolgt. Da reines Reference Counting keine Referenzzyklen auflösen kann, läuft periodisch ein generationeller zyklischer Garbage Collector, der diese erkennt und einsammelt. Praktische Folgen: Ressourcen explizit zu schließen bleibt trotzdem nötig, und eine im Cache oder einer Closure hängende Referenz ist die übliche Ursache eines Memory Leaks.

🦎

Antworten lesen reicht nicht

Im echten Interview sprichst du unter Druck. Cam stellt genau diese Fragen, bewertet jede Antwort und zeigt dir genau, was du verbessern musst.

Python Backend-Interview üben →
Kostenlos · 3 Interviews im Monat

Lesenswert

Alle Artikel →

Weitere Spezialisierungen

🔍QA Manual🤖QA AutomationJava Backend🐘PHP-Backend🦫Go-Backend🟢Node.js-Backend💎Ruby on Rails🔷C++🟨JavaScript⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)⚙️DevOps / SRE🗄️Data Engineer📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing