Unterschiede zu C

Allgemeines

C und Python liegen recht ähnliche Entwurfsziele zugrunde. Die meisten Punkte aus dem Spirit of C, das in den Standardisierungsdokumenten zu C nachzulesen ist, gelten auch für Python. Die Sprache soll klein und einfach sein. Grundsätzlich soll man dem Programmierer vertrauen und keine Steine in den Weg legen, auch wenn er "böse" Sachen machen will. Für jede Operation sollte es möglichst nur einen offensichtlichen Weg geben.

Die Standardimplementierung von Python ist in C geschrieben und die Dokumentation enthält Anleitungen wie man Erweiterungsmodule in C schreibt und wie man Python in C-Programme einbettet. Viele der Module in der Standardbibliothek sind in C geschrieben. Die beiden Sprachen ergänzen sich gegenseitig sehr gut.

Sprachkonstrukte gegenübergestellt

Bezeichner

In C und in Python bestehen gültige Bezeichner aus Unterstrichen, Buchstaben und Zahlen. In C müssen sie mit einem Buchstaben beginnen, in Python dürfen sie außerdem mit einem Unterstrich beginnen. Gross- und Kleinschreibung ist signifikant.

Genau wie in C dürfen Bezeichner keine Schlüsselworte der Sprache sein, man kann zum Beispiel nicht den Namen for verwenden. Der Style Guide (PEP008) schlägt für solche Fälle vor, einen Unterstrich an den Namen anzuhängen.

Datentypen

Zahlen

Python kennt nur vorzeichenbehaftete Zahlen. Bei den ganzen Zahlen gibt es int und long, wobei int ein C int zugrunde liegt. long-Zahlen können beliebig gross werden, bzw. sind nur durch den verfügbaren Speicher begrenzt. Die Trennung zwischen int und long ist mittlerweile ziemlich "aufgeweicht", was bedeutet, dass das Ergebnis einer Operation automatisch ein long wird, wenn es nicht mehr in den Wertebereich von int passt. Ab Python 3.0 wird es nur noch einen Typ int geben, der beliebig grosse Werte darstellen kann.

Der Fliesskommatyp float entspricht einem double in C.

Außerdem kennt Python noch komplexe Zahlen:

   1 >>> a = 3 + 4j
   2 >>> b = 5 - 1j
   3 >>> a + b
   4 (8+3j)
   5 >>> a * b
   6 (19+17j)
   7 >>>

Literale Zahlen können wie bei C in den Quelltext geschrieben werden. Den Suffix L für "long" kann man weglassen. Ausserdem können ganze Zahlen, genau wie in C hexadezimal und oktal angegeben werden indem man '0x' bzw. '0' voranstellt.

Zeichen und Zeichenketten

Einen char-Typ gibt es in Python nicht, dafür sind Zeichenketten ein Grunddatentyp. Einzelne Zeichen sind einfach Zeichenketten der Länge 1. Zeichenketten sind im Grunde "Byte-Ketten", da sie beliebige Bytes aufnehmen können, inklusive dem Nullbyte! Zeichenketten sind "immutable", d.h. man kann sie nicht verändern.

Literale Zeichenketten können in einfachen oder doppelten Anführungszeichen eingeschlossen werden. Genau wie in C werden Zeichenketten, die nur durch "whitespace" getrennt sind, automatisch zu einer zusammengefasst und es gelten die üblichen Escape-Sequenzen für nicht-druckbare Zeichen.

Arrays/Listen

Arrays gibt es nicht als eingebauten Datentyp, dafür verwendet man in Python für gewöhnlich den Datentyp list, der intern als dynamisch wachsendes Array implementiert ist. So eine Liste kann Elemente von unterschiedlichen Typen enthalten, kennt ihre Länge und man operiert recht selten mit Indizes, wie beim Thema for-Schleifen zu sehen ist.

Zeiger/Referenzen

Python kennt ebenfalls keine Zeiger als Datentyp, allerdings werden diese intern für jedes Objekt benutzt. Und da in Python alles Objekt ist, kann man sagen, dass die Variablen ausschliesslich (interne) Pointer enthalten. Bei Funktionsargumenten und Zuweisungen werden grundsätzlich nur Referenzen auf die beteiligten Objekte im Speicher bewegt.

Da Funktionen auch Objekte sind, kann man sie an andere Namen binden, in Datenstrukturen wie Listen speichern oder als Argumente an andere Funktionen übergeben. Das Verhalten ist ähnlich wie bei Zeigern auf Funktionen in C.

Konstanten

Es gibt keine Konstanten und damit auch keine Aufzählungskonstanten (enum). Aber es gibt die von C bekannte Konvention die Namen von "Konstanten" durchgehend in Grossbuchstaben zu schreiben.

Strukturen

Eigene Datentypen schafft man in C mit Strukturen:

struct person
{
    char vorname[20];
    char nachname[20];
    int telefon;
};


struct person boss = {"Hans", "Meyer", 1234};
printf("%s %s %i\n", boss.vorname, boss.nachname, boss.telefon);

In Python verwendet man dafür Klassen:

   1 class Person:
   2     def __init__(self, vorname, nachname, telefon):
   3         self.vorname = vorname
   4         self.nachname = nachname
   5         self.telefon = telefon
   6 
   7 boss = Person("Hans", "Meyer", 1234)
   8 print boss.vorname, boss.nachname, boss.telefon

Das sieht in Python zunächst etwas komplizierter aus, das liegt daran, dass man mit Klassen noch viel mehr machen kann als mit Strukturen. (Stichwort: Objektorientierte Programmierung).

Operatoren

Die arithmetischen Operatoren aus Python entsprechen denen aus C. Zusätzlich zu +, -, *, / und % gibt es noch die Potenzierung ** und die Ganzzahldivision //. Letztere gibt bei der Division von zwei ganzahligen Werten auch in jedem Fall eine (nach unten) gerundete ganze Zahl als Ergebnis, während das Verhalten von / bei zwei ganzen Zahlen von der Python-Version bzw. einem __future__-Import abhängt. In Python 3.0 und in Python >=2.2 falls man division aus dem __future__-Modul importiert ist das Ergebnis einer /-Division immer eine Fliesskommazahl, sonst nur, wenn mindestens einer der Operanden eine Fliesskommazahl ist.

Es gibt die gleichen Vergleichsoperatoren: <, >, <=, >=, == und !=. Für "ungleich" kann man in Python <3 auch <> schreiben, was aber sehr unüblich ist.

Die boole'schen Operatoren werden als Worte ausgeschrieben: and, or und not. Ähnlich wie in C hat jeder Datentyp, dass heisst jedes Objekt einen Wahrheitswert. Die Zahlen 0, 0.0, und leere Listen, Dictionries und Tupel sind falsch, andere Zahlen und Container-Objekte mit Inhalt sind wahr. Ausserdem gibt es noch die beiden Objekte True und False. Die Operatoren and und or brechen bei der Berechnung ab, sobald das Ergebnis feststeht, also genauso wie in C.

Für Bitmanipulationen stehen ebenfalls die gleichen Operatoren zur Verfügung wie in C. Beim bitweisen Verschieben nach links muss man aber beachten, dass die Bits nicht links "herausfallen", weil der Wertebereich von ganzen Zahlen nicht begrenzt ist.

Die Zuweisung ist in Python kein Operator, sondern eine Anweisung. Dieser Umstand verhindert, dass man innerhalb von Ausdrücken Zuweisungen vornehmen kann. Das betrifft zum Beispiel Bedingungen bei if oder while.

Es gibt auch die Kombination aus Operatoren und Zuweisung wie +=, *= usw. aber keine Prä- und Postfix-Inkerement und -Dekrement Operatoren. Vorsicht: ++i und --i sind legale Syntax in Python, allerdings beides nur längere Arten i zu schreiben. Es sind einfach die unären Operatoren zweimal hintereinander angewendet. Also äquivalent zu -(-(i)).

Kontrollstrukturen

if-else-Verzweigungen

if-else-Verzweigungen sind in Python und C sehr ähnlich.

if (a == 3 && b < 4)
    printf("Tu was.\n");
else
    printf("Tu was anderes.\n);

   1 if a == 3 and b < 4:
   2     print "Tu was."
   3 else:
   4     print "Tu was anderes."

Die Verneinung eines Ausdrucks wird nicht mit ! sondern mit not angegeben. Den Ausdruck

if ( a == 3 || a == 9 || a == 13 ) {...}

kann man in Python etwas vereinfachen:

   1 if a in (3, 9, 13): ...

switch-Anweisungen

In Python gibt es keine switch-Anweisung wie in C:

switch (note)
{
    case 1: printf("Streber!\n"); break;
    case 2: printf("Gut!\n"); break;
    case 3: 
    case 4: printf("In Ordnung.\n"); break;
    case 5: 
    case 6: printf("Faule Socke!\n"); break;
    default: printf("Diese Note kenne ich nicht.\n"); break;
}

So etwas könnte man in Python mit einer if-Anweisung lösen:

   1 if note == 1:
   2     print "Streber!"
   3 elif note == 2:
   4     print "Gut!"
   5 elif note in (3, 4):
   6     print "In Ordnung."
   7 elif note in (5, 6):
   8     print "Faule Socke!"
   9 else:
  10     print "Diese Note kenne ich nicht."

Alternativ kann man die möglichen Werte/Aktionen aus einem Dictionary auslesen:

   1 choices = {
   2     1: "Streber!",
   3     2: "Gut!",
   4     3: "In Ordnung.",
   5     4: "In Ordnung.",
   6     5: "Faule Socke!",
   7     6: "Faule Socke!"
   8 }
   9 print choices.get(note, "Diese Note kenne ich nicht.")

for-Schleifen

Die for-Schleife

for (int i = 3; i < 7; i++)
    printf("%i\n", i);

wird in Python zu

   1 for i in xrange(3, 7):
   2     print i

Anders als in C benutzt man in Python meist keine Indizes, wenn man über Arrays bzw. Listen, Tupel, Strings iteriert, denn man kann direkt über die Elemente iterieren. Statt

int hallo_len = 5;
char hallo[] = "hallo";

for (int i = 0; i < hallo_len; i++)
    printf("%c\n", hallo[i]);

also:

   1 hallo = "hallo"
   2 
   3 for char in hallo:
   4     print char

while- und do-Schleifen

Eine while-Schleife in C

while (zahl) {...}

sieht in Python ganz ähnlich aus:

   1 while zahl:
   2     ...

Eine do-Schleife gibt es in Python nicht. Statt

do {
    zahl = ...
}
while (zahl >= 0 && zahl <= 10);

könnte man schreiben:

   1 while True:
   2     zahl = ...
   3     if not (0 <= zahl <= 10):
   4         break

Standardbibliotheksfunktionen

In diesem Abschnitt wird gezeigt wie Gegenstücke der wichtigsten Funktionen aus der C-Standardbibliothek in Python aussehen.

Formatierte Ausgabe

Formatierte Ausgabe funktioniert in C und Python ähnlich:

printf("% .2f\n", 4.0);
printf("%.3f  %i\n", 4.0, 5);
printf("%s\n", "spam");

Das Ganze in Python:

   1 print "% .2f" % 4.0
   2 print "%.3f  %i" % (4.0, 5)
   3 print "%s" % "spam"

Weitere Beispiele sind auf der Seite String-Formatter zu sehen.

Tags: Umsteiger

Unterschiede zu C (last edited 2009-06-17 16:14:20 by localhost)