Home | Lehre | Videos | Texte | Vorträge | Software | Person | Impressum, Datenschutzerklärung | Blog RSS

Stand: 2025-04-02
weitgehend formuliert von Claude 3 Opus, verbessert von ChatGPT 4o, redigiert/korrigiert von Jörn Loviscach

Umstieg von C auf Python, Teil 1

Elementare Datentypen in Python

Python ist eine dynamisch typisierte Sprache, im Gegensatz zu C, wo Variablen ausdrücklich mit einem Datentyp deklariert werden müssen. In Python werden Datentypen automatisch zugewiesen und können sich während der Laufzeit ändern. Trotzdem gibt es in Python ähnliche Datentypen wie in C, die man kennen sollte.

Ganzzahlen (int)

Ganzzahlen werden in Python mit dem Datentyp int dargestellt. Anders als in C gibt es keine Unterscheidung zwischen zum Beispiel short, int, int32_t oder long long. Python wählt automatisch die passende Größe für eine Ganzzahl, selbst für Zahlen mit Tausenden von Stellen.

x = 42
y = -1337

Gleitkommazahlen (float)

Gleitkommazahlen werden in Python mit dem Datentyp float dargestellt. Auch hier gibt es keine Unterscheidung zwischen float und double wie in C.

x = 3.14
y = -2.71828

Unterschiede zwischen C und Python: ++, –, ** und /

Python und C haben einige Unterschiede in der Syntax und Funktionsweise, insbesondere bei den Operatoren ++, -- und **.

In C werden die Operatoren ++ und -- häufig verwendet, um Variablen um 1 zu erhöhen oder zu verringern. Beispiel:

int i = 5;
i++; // i ist jetzt 6
i--; // i ist wieder 5

In Python existieren diese Operatoren nicht. Stattdessen verwendet man die Schreibweise += 1 oder -= 1, um eine Variable um 1 zu erhöhen oder zu verringern. Beispiel:

i = 5
i += 1 # i ist jetzt 6
i -= 1 # i ist wieder 5

In C wird die Potenzierung mit der Funktion pow() aus der math.h-Bibliothek durchgeführt. Beispiel:

#include <math.h>

double result = pow(2, 3); // result ist 8

Python hingegen verwendet den Operator ** für die Potenzierung. Beispiel:

result = 2 ** 3 # result ist 8

Die Verwendung von ** ist oft intuitiver und führt zu besser lesbarem Code.

In C liefert die Division für ganzzahlige Typen wieder ganze Zahlen, zum Beispiel wird 7/3 zu 2. Python liefert hier dagegen eine Gleitkommazahl. Um in Python ganzzahlige Divisionsergebnisse zu erhalten, muss man den Doppelstrich wie 7//3 schreiben.

Boolesche Werte (bool)

Boolesche Werte werden in Python mit dem Datentyp bool dargestellt. Sie können die Werte True (1) oder False (0) annehmen, was C mit true und false spätestens seit C23 genauso macht.

x = True
y = False

Logische Operatoren: not, and, or

Python unterstützt die logischen Operatoren not, and und or, die wie !, && und || in C funktionieren:

Hier sind einige Beispiele:

if not bedingung:
    # Anweisungen, die ausgeführt werden, wenn die Bedingung falsch ist

if bedingung1 and bedingung2:
    # Anweisungen, die ausgeführt werden, wenn beide Bedingungen wahr sind

if bedingung1 or bedingung2:
    # Anweisungen, die ausgeführt werden, wenn mindestens eine der Bedingungen wahr ist

Hier ist ein Beispiel für einen komplizierteren Ausdruck mit den logischen Operatoren not, and und or in Python:

x = 10
y = 20
z = 30

result = not x > 5 or y < 25 and z == 30
print(result)

Python führt erst die Vergleiche und dann die logischen Operationen aus, in der Reihenfolge notandor. Es rechnet also so, als ob diese Klammern gesetzt worden wären: (not (x > 5)) or ((y < 25) and (z == 30)) Wenn man eine andere Auswertungsreihenfolge haben will, muss man selbst Klammern setzen.

Analog zu C wertet Python bei x and y das y nicht mehr aus, wenn x schon False ist (Short-Circuit). Ebenso wird bei x or y das y nicht mehr ausgewertet, wenn x schon True ist. Dadurch lassen sich z. B. Bedingungen wie ist_Ressource_verfügbar() and frage_Resource_ab() schreiben: Die Funktion zur Abfrage wird nur aufgerufen, wenn die Ressource verfügbar ist.

Der Ablauf des kleinen Programms oben ist also:

  1. Zuerst wird die Variable x mit dem Wert 10, y mit dem Wert 20 und z mit dem Wert 30 initialisiert.

  2. Der komplexe Ausdruck not x > 5 or y < 25 and z == 30 wird ausgewertet:

  3. Das Ergebnis True wird auf der Konsole ausgegeben.

Type Hints

Seit Python 3.5 gibt es die Möglichkeit, Variablen mit sogenannten Type Hints zu versehen. Diese geben an, welchen Datentyp eine Variable erwartet. Type Hints werden von Python jedoch erstens nicht erzwungen und zweitens bei der Ausführung ignoriert. Sie dienen hauptsächlich zur besseren Lesbarkeit und Verständlichkeit des Codes sowie zum Fehlerfinden, meist in der Entwicklungsumgebung durch rote Unterkringelungen oder Ähnliches erkennbar.

x: int = 42
y: float = 3.14
z: bool = True

Type Hints können auch verwendet werden, um anzugeben, dass eine Variable mehrere Datentypen annehmen kann:

x: int | str = 42
x = 'Hallo'  # gültig, da x auch String sein kann

Namen von Variablen usw.

Die Namen (Bezeichner) von Variablen, Funktionen, Klassen usw. in Python dürfen aus Buchstaben (auch Unicode), Ziffern und Unterstrichen bestehen, dürfen aber nicht mit einer Ziffer beginnen. Außerdem sind die reservierten Schlüsselwörter wie for, class oder def als Namen verboten.

Erlaubte Namen sind z. B. π oder 变量. Ungültig sind z. B. 10Bestellungen (beginnt mit Ziffer), erstes Beispiel (Leerzeichen), Gesamt-Liste (Bindestrich) oder verfasse✉️ (unerlaubtes Symbol).

Strings (Zeichenketten)

In Python sind Strings eine grundlegende Datenstruktur zur Speicherung und Manipulation von Textdaten. Im Gegensatz zu C müssen Strings in Python nicht als Arrays von Zeichen definiert werden. Strings können in Python alle (Unicode-)Zeichen enthalten, insbesondere kyrillische oder arabische Zeichen oder Emojis.

Stringliterale und Konkatenation

Stringliterale, also Buchstabe für Buchstabe wörtlich angegebene Zeichenketten, werden in Python in einfachen ('...') oder doppelten ("...") Anführungszeichen eingeschlossen. (Achtung: In C erzeugt man mit einfachen Anführungszeichen nur Einzelzeichen!) Strings können mit dem +-Operator aneinandergehängt (konkateniert) werden:

name = 'Alex'
greeting = 'Hallo, ' + name + '!'
print(greeting)  # Ausgabe: Hallo, Alex!

Stringfunktionen

Python bietet eine Vielzahl von eingebauten Funktionen zur Manipulation von Strings. Hier sind einige häufig verwendete Funktionen:

Beispiel:

text = '  Hallo, Welt!  '
print(len(text))           # Ausgabe: 15
print(text.lower())        # Ausgabe: '  hallo, welt!  '
print(text.strip())        # Ausgabe: 'Hallo, Welt!'
print(text.split(', '))    # Ausgabe: ['  Hallo', 'Welt!  ']

Type Hints

Für Strings wird der Typ str verwendet:

name: str = 'Alex'

Formatierte Strings (f-Strings)

Mit f-Strings lassen sich Ausdrücke direkt in wortwörtlich angegebene Strings (Stringliterale) einbetten, indem sie in geschweifte Klammern {} eingeschlossen werden:

name = 'Alex'
age = 25
print(f'Mein Name ist {name} und ich bin {2 * age} Jahre alt.')
# Ausgabe: Mein Name ist Alex und ich bin 50 Jahre alt.

In den geschweiften Klammern der f-Strings lassen sich auch Formatierungsanweisungen geben. Zum Beispiel platziert {wert:8.2f} den Inhalt der Gleitkommavariablen wert mit zwei Nachkommastellen in einem Feld mit 8 Zeichen Breite.

Bedingte Anweisungen mit if, elif und else

In Python werden bedingte Anweisungen ähnlich wie in C verwendet, allerdings mit einer etwas anderen Syntax. Anstatt geschweifte Klammern {} zu verwenden, nutzt Python Einrückungen, um den Gültigkeitsbereich eines Blocks festzulegen.

Eine if-Anweisung in Python sieht folgendermaßen aus:

if bedingung:
    # Anweisungen, die ausgeführt werden, wenn die Bedingung wahr ist
    anweisung1
    anweisung2

Wenn die Bedingung wahr ist, werden die eingerückten Anweisungen ausgeführt. Im Gegensatz zu C muss keine runde Klammer () um die Bedingung gesetzt werden.

Mit elif (kurz für else if) können weitere Bedingungen überprüft werden, falls die vorherige Bedingung nicht erfüllt war:

if bedingung1:
    # Anweisungen für bedingung1
elif bedingung2:
    # Anweisungen für bedingung2
else:
    # Anweisungen, wenn keine der Bedingungen erfüllt ist

Vergleich von ?: in C und if-else in Python

In C gibt es den ternären Operator ?:, der eine kompakte Schreibweise für einfache if-else-Anweisungen ermöglicht. Hier ein Beispiel:

int a = 5;
int b = 10;
int max = (a > b) ? a : b;

In diesem Fall wird max der Wert von a zugewiesen, wenn a > b wahr ist, andernfalls erhält max den Wert von b. Der ternäre Operator ist eine prägnante Möglichkeit, eine einfache Bedingung auszuwerten und basierend auf dem Ergebnis einen Wert zuzuweisen.

In Python gibt es eine ähnliche Syntax wie den ternären Operator, die als conditional expression bezeichnet wird:

a = 5
b = 10
max = a if a > b else b

Schleifen

Python bietet zwei Arten von Schleifen: while-Schleifen und for-Schleifen. Beide ermöglichen es, einen Codeblock wiederholt auszuführen, bis eine bestimmte Bedingung erfüllt ist.

while-Schleifen

Eine while-Schleife führt einen Codeblock aus, solange eine Bedingung wahr ist. Die Syntax ist ähnlich wie in C:

while bedingung:
    # Anweisungen

for-Schleifen und range

for-Schleifen werden verwendet, um über eine Sequenz von Elementen zu iterieren. In Python ist die Syntax etwas anders als in C:

for element in sequenz:
    # Anweisungen

Die Funktion range wird oft in Kombination mit for-Schleifen verwendet, um eine Sequenz von Zahlen zu generieren:

for i in range(start, stop, step):
    # Anweisungen

break und continue

break und continue sind zwei Anweisungen, die den Ablauf von Schleifen beeinflussen können:

Beispiel für break:

for i in range(1, 6):
    if i == 4:
        break
    print(i)

Ausgabe:

1
2
3

Beispiel für continue:

for i in range(1, 6):
    if i == 3:
        continue
    print(i)

Ausgabe:

1
2
4
5

Verschachtelte Schleifen

Schleifen können ineinander verschachtelt werden, um komplexere Iterationen durchzuführen. Hier ist ein Beispiel für zwei ineinander verschachtelte for-Schleifen:

for i in range(1, 4):
    for j in range(1, 4):
        print(f'({i}, {j})', end=' ')
    print()

Ausgabe:

(1, 1) (1, 2) (1, 3)
(2, 1) (2, 2) (2, 3)
(3, 1) (3, 2) (3, 3)

Funktionen

Funktionen sind wie in C ein grundlegendes Konzept in Python, das es ermöglicht, Code zu strukturieren, wiederzuverwenden und lesbarer zu machen.

Funktionsdefinition

In Python werden Funktionen mit dem Schlüsselwort def definiert, gefolgt vom Funktionsnamen und den Parametern in Klammern. Der Funktionskörper wird eingerückt und enthält den Code, der ausgeführt wird, wenn die Funktion aufgerufen wird.

def greet(name):
    print(f'Hallo, {name}!')

Funktionsaufruf

Um eine Funktion aufzurufen, schreibt man den Funktionsnamen gefolgt von Klammern und den erforderlichen Argumenten.

greet('Alex')  # Ausgabe: Hallo, Alex!

Rückgabewerte

Funktionen in Python können Werte mit dem Schlüsselwort return zurückgeben. Wenn keine solche ausdrückliche Rückgabeanweisung vorhanden ist oder wenn return ohne Wert dahinter steht, gibt die Funktion None zurück.

def add(a, b):
    return a + b

result = add(3, 5)
print(result)  # Ausgabe: 8

Funktionsausführung beenden

Sobald ein return-Statement in einer Python-Funktion erreicht wird, wird die Ausführung der Funktion sofort beendet. Alle nachfolgenden Anweisungen in der Funktion werden nicht mehr ausgeführt.

def beispiel_funktion():
    print('Vor dem return')
    return
    print('Nach dem return')  # Wird nicht ausgeführt

beispiel_funktion()

Ausgabe:

Vor dem return

Type Hints

def multiply(a: int, b: int) -> int:
    return a * b

result = multiply(4, 6)
print(result)  # Ausgabe: 24

Eingebaute mathematische Funktionen

Python bietet das eingebaute math-Modul, das eine Vielzahl von mathematischen Funktionen bereitstellt. Um es zu verwenden, muss es zunächst importiert werden:

import math

Einige nützliche Funktionen aus dem math-Modul sind:

Außerdem bietet math.pi den Wert der Kreiszahl π:

radius = 5
umfang = 2 * math.pi * radius
fläche = math.pi * radius ** 2

print(f'Umfang: {umfang:.2f}')
print(f'Fläche: {fläche:.2f}')

Ausgabe:

Umfang: 31.42
Fläche: 78.54