a=5 b=a
a und verweisen auf die gleiche Instanz - print würde in beiden Fällen 5 ausgeben.
a=5 b=a a=a+1
a und b verweisen zuerst auf die gleiche Instanz (print würde bei beiden 5 ausgeben).
Nach dem a um 1 erhöht wurde verweisen a und b auf unterschiedliche Instanzen, a würde 5 ausgeben, b 6.
Name | Beschreibung |
---|---|
pydoc | Dokumentation zu python Syntax: pydoc Funktionsname |
pip | Paketmanager - erlaubt es Pakete zu installieren und zu verwalten Greift Standardmäßig auf pypi.python.org/ (Verzeichnis von Paketen) zu Hinweis: Es empfiehlt sich python-dev (Entwicklungsdateien für python) zu installieren - einige Pakete müssen kompiliert werden und benötigen diese |
Praktisch:
#a ist vom Typ int und wird der Wert 4 zugewiesen a=int(4) #b ist vom Typ int, aber leer b=int() #b wird a zugewiesen - a und b haben den gleichen Wert b=a #Abfrage des Speicherplatzes auf den b verweist id(b) 152711856 #Abfrage des Speicherplatzes auf den a verweist id(a) 152711856 #Erhöhen von b um 1 b+=1 #Abfrage des Speicherplatzes auf den b verweist id(b) 152711844 #Abfrage de Speicherplatzes von a id(a) 152711856
Name | Beschreibung |
---|---|
unicode | Eine Unicode-Zeichenkette |
str | Eine Byte-Kette/eine ASCI-Zeichenkette Speichert (im Gegensatz zu Unicode) die Daten Byte-Genau, man kann darin also Binärdaten speichern |
list | Eine geordnete Liste von beliebigen Objekten/Datentypen Geordnet → die Reihenfolge in der die Objekte gespeichert wurden wird beibehalten (hat nichts mit sortiert zu tun) |
tuple | Immutable (unveränderliche) Liste - kann nach der Deklaration nicht mehr verändert werden |
Operator | Beschreibung |
---|---|
+ | Verknüpft zwei sequentielle Objekte nacheinander a=„Hallo “ b=„Mensch“ c=a+b print c „Hallo Mensch“ |
+= | Verknüpft zwei sequentielle Objekte nacheinandern und weißt dem links stehenden das Ergebnis zu a=„Hallo “ b=„Mensch“ a+=b print a „Hallo Mensch“ |
* | Wiederholt den Inhalt des sequentiellen Objektes n mal Syntax: a * n
a="Hallo" b=a*5 print b HalloHalloHalloHalloHallo |
*= | Wiederholt den Inhalt des sequentiellen Objektes n mal und weist das Ergebnis ihm zu Syntax: a * n
a="Hallo" a*=5 print a HalloHalloHalloHalloHallo |
in | Prüfung ob ein Wert im seriellen Objekt vorkommt - liefert true oder false Syntax: a in b
|
not in | Prüft ob ein Wert nicht im seriellen Objekt vorkommt - liefert true oder false Syntax: a not in b
|
len(s) | Liefert die Anzahl der Elemente des seriellen Objektes (s) zurück Syntax: x=len(s)
|
min(s) | Gibt den kleinsten Wert im seriellen Objekt zurück Geht nur wenn sich die Objekte innerhalb des seriellen Objektes sortieren lassen. Also zum Beispiel Strings, Unicode oder Zahlen in einem list oder dict (da werden die Keys genutzt) zum Beispiel. Syntax: len(s)
|
max(s) | Gibt den größten Wert im seriellen Objekt zurück Geht nur wenn sich die Objekte innerhalb des seriellen Objektes sortieren lassen. Also zum Beispiel Strings, Unicode oder Zahlen in einem list oder dict (da werden die Keys genutzt) zum Beispiel. Syntax: max(s)
|
sum(s) | Summiert die Werte im seriellen Objekt (also deren Werte, nicht deren Anzahl |
s[x] | Auch bekannt als Sub-Operator. Ermöglicht den Zugriff auf das xte Element innerhalb eines seriellen Objektes Syntax: s[x]
Man kann innerhalb des Suboperators auch Operationen ausführen: s[x-1] In dem Beispiel würde der Wert aus x - 1 berechnet und das Ergebnis als Index verwendet. |
s[x:y] | Zugriff auf auf Bereich von Elementen innerhalb eines seriellen Objektes Syntax: s[x:y]
Auf diese Weise können auch die so adressierten Elemente gelöscht werden: del s[x:y:z). |
s[x:y:z] | Zugriff jedes z'ste Element innerhalb eines definierten Bereiches eines seriellen Objektes - Schrittdefinition Syntax: s[x:y:z]
|
s[y][y] | Zugriff auf Unter-Elemente eines Objektes/Elements innerhalb eines sequentiellen Objektes - Zugriff auf inneinander verschachtelte Elemente/sequentielle Objekte Syntax: a[x][y]
|
Bringen spezielle Operatoren mit die u.a. erlauben Mengen zu:
set | Menge - jedes Elememt darf nur einmal vorkommen |
frozenset | Immutable (Unveränderliches) set - kann nach der Deklaration nicht mehr verändert werden |
Syntax:
def Funktionsname (Parameter1,Parameter2): Funktionscode return //Variable//
Methodenaufruf:
Rückgabevariable=Funktionsname(Parameter1, Parameter2)
Syntax:
def Funktionsname (Parameter1, Parameter2=Wert2, Parameter3=Wert3): Funktionscode
Parameter 2 und 3 sind optionale Parameter, wird kein Wert für sie angegeben, wird der Wert in der Funktionsdefinition genutzt.
Es bietet sich an optionale Parameter ans Ende der Funktion zu schreiben, dann ist auch beim weglassen eines Parameters noch eine Parameterübergabe ohne Bezeichner möglich.
Syntax:
def Funktionsname (Parameter1, Parameter2): Code Funtionsname(Parameter1=Wert1, Parameter2=Wert2)
Syntax:
def //methodenname// (//Parameter1//,//Parameter2//,*//Parameter3//): Code //methodenname//(//Wert1//, //Wert2//, //Wert3//, //Wert4//, //Wert5//)
Beispiel:
Syntax:
class test(object): a=list([1,2,3,]
Syntax:
class test (object): def __init__(self): self.a=list([1,2,3,4,5])
Syntax: _Variable=Type()
Syntax: def _Methodenname(self)
This section is not tested and based on assumptions:
Syntax: def __init__()
Name | Beschreibung |
---|---|
Ausgabe von Text auf dem Bildschirm Syntax: print Text
print "Hallo", print "Mensch"
Obiges Beispiel ergibt: „Hallo Mensch“ (ohne Zeilenumbruch, wegen des „,“ am Ende
Wichtig ist das Dateiobjekt kommt zuerst, durch Komma getrennt kommt danach der zu schreibende String. |
|
input | Liest Text auf der Kommandozeile ein - die Eingabe wird durch das Drücken von <Enter> beendet Syntax: Variable=input (Ausgabetext)
Achtung: input interpretiert die Eingaben bevor sie in die Variable übergeben werden - aus der Eingabe 1+1 würde 2 werden; lalal → würde als Zugriff auf die Variable „lala“ interpretiert werden (was zum Programmabbruch führt wenn diese nicht existiert). Es empfiehlt sich in der Regel raw_input statt input zu benutzen! |
raw_input | Liest Text auf der Kommandozeile ein - die Eingabe wird durch das Drücken von <Enter> beendet \\Im Gegensatz zu input wird die Eingabe nicht interpretiert, sondern wie eingegeben abgelegt. Syntax: Variable=raw_input (Ausgabetext)
Hinweis: Über die Konvertier-Funktionen (also zum Beispiel int()) kann die Eingabe vor dem Speichern bereits einen bestimmten Typ erhalten: |
open | Öffnet eine Datei zum lesen oder schreiben Syntax: Dateiobjekt=open(„Dateiname“,„Modus“)
|
type (Objekt) | Gibt den Typ (die Klasse) eines Objektes zurück |
dir(Objekt) | Gibt alle Methoden eines Objektes zurück |
Eine Datei in Python wird durch ein Dateiobjekt repräsentiert.
Beim öffnen einer Datei durch die eingebaute Methode open() wird eben jenes Dateiobjekt zurückgeliefert.
Alle Operationen, wie lesen und schreiben sind Methoden dieses Dateiobjektes.
Viele Operationen beziehen sich nicht auf die ganze Datei, sondern nur eine bestimmte Anzhal Bytes oder Zeilen.
Dabei wird ab der Stelle die Aktion durchgeführt an der sich der Zeiger innerhalb der Date befindet - es gibt also immer eine bestimmte Stelle an der man innerhalb der Datei steht.
Diese verschiebt sich, zum Beispiel nach einem readline an den Beginn der nächsten Zeile.
Per tell() kann man sich die aktuelle Position geben lassen und per seek eine Position setzen.
Schreiboperationen werden nicht immer sofort auf die Platte geschrieben, sondern landen eventuell erst im Schreibpuffer des Betriebsyystems → die Date enthält dann noch nicht den geänderten Inhalt. Per flush() oder close() wird die Datei auf die Festplatte geschrieben.
Dateiobjekte können ein Iterable mit den Zeilen der Datei zur Verfügung stelen, damit wird es u.a. möglich eine Datei folgendermaßen Zeile für Zeile zu durchlaufen:
fobj=open("/tmp/somefile","r") for line in fobj: print line fobj.close()
Per Default schreibt Python Daten hintereinanderweg in die Datei, auch wenn sie aus verschiedenen Schreiboperationen stammen, es wird standardmäßig kein Zeilenumbruch gemacht:
fobj=open("/tmp/somefile","r") fobj.write("Hallo ") fobj.write("Mensch")
Beide Strings stehen in der Date hintereinander: Hallo Mensch, ohne Zeilenumbruch.
Man kann in die Strings Steuerzeichen einfügen, wie „\n“ → es gibt je nach Platform verschiedene Steuerzeichen für Newline.
<code> fobj=open("/tmp/somefile","r") fobj.write("Hallo \n") fobj.write("Mensch")
In diesem Fall stehen Hallo und Mensch auf verschiedenen Zeilen in der Datei (untereinander).
Um nach dem lesen aus der Datei die Steuerzeichen wieder zu entfernen hat die String-Klasse die Methode „strip()“ die eine Kopie des Strings zurückgibt, ohne Zeilenumbruch am Ende (Hinweis: die Methode entfernt weitere Steuerzeichen).
Methode | Funktion |
---|---|
open(Dateipfad,Modus) | Öffnet eine Datei. Rückgabewert ist ein Dateiobjekt Modi:
Zusätzlich kann man bei „r“ und „w“ ein „+“ anfügen. Die Datei ist dann zum lesen und zum schreiben geöffnet. |
write(String) | Schreibt einen String in eine Datei Zwischen zwei Strings die geschrieben werden, wird nicht automatisch ein Zeilenumbruch in der Datei hinzugefügt → der muss gegebenenfalls (zum Beispiel als \n) vorher in den String geschrieben werden. |
writelines(Iterateable of Strings) | Nimmt ein Objekt entgegen welches interable ist und Strings zur Verfügung stellt. Solche Objekte sind zum Beispiel Listen. Die einzelnen String werden hintereinander Weg in die Datei geschrieben, es wird kein Newline/Zeilenumbruch zwischen den Strings gesetzt - wenn keine entsprechenden Steuerzeichen in den Strings selbst vorhanden sind. Beispiel: a=list(["eins","zwei","drei"]) fobj=open("/tmp/test","w") fobj.writelines(a) fobj.close() |
read(Size) |
Ließt Daten aus einer Datei, liefert einen String mit den gelesenen Daten zurück |
readline(Size) | Ließt eine Zeile aus der Datei - optionaler Parameter Länge in Bytes die zu lesen sind Eine Zeile definiert sich bis ein Newline (Steuerzeichen welches das Ende einer Zeile markiert, es gibt verschiedene Standards die systemabhängig sind) kommt. Der Zeiger steht danach hinter dem letzten gelesenen Zeichen/am ersten der nächsten Zeile. Ein erneutes Aufrufen von readline liefert also die nächste Zeile. Beispiel: a=fobj.readline() |
readlines() | Ließt alle Zeilen einer Datei aus und gibt sie als Liste von Strings zurück |
tell | Gibt die derzeitige Position in der Datei an (Integer) |
seek | Spingt an eine bestimmte Psoition der Datei |
Standardmäßig akzeptiert Python nur Zeichen des ASCII-Zeichensatzes im Code (alle anderen Zeichen müssen per Escape-Sequenz angegeben werden).
#coding=utf-8
Mit dem Kommentar #coding=Charset in der ersten oder zweiten Zeile einer Datei setzt den Zeichensatz auf den angegebenenen.
Hinweis: Der verwendete Editor muss ebenfalls in UTF8 kodieren können (siehe vim
Problem | Mögliche Lösung/Ursache |
---|---|
type gibt instance zurück | Anstatt des Objekttypes/Variablenttypes gibt type(Variablenname) instance zurück. Die Klasse hat nicht von Object geerbt. Die Object-Klasse implementiert die notwendige Funktionalität für type. |
Meldung | Mögliche Lösung |
---|---|
NameError: global name x is not defined | Wahrscheinlich Attribut in Klasse deklariert (Variable in Klasse) und ZUgriff erfolgt innerhalb einer Methode/Funktion der Klasse ohne voran gestelltes self (self.Name) |
IndentationError: expected an indented block | Entweder Code außerhalb eines Blockes eingerückt (Blöcke beginnen hinter einer Anweisung und :) oder einen Block begonnen und keinen (eingerückten) Code hineingeschrieben |
global name 'self' is not defined | Self wird innerhalb von Klassen benutzt um auf Klassen-Methoden/Funktionen oder Klassen-Attribute/Variablen zuzugreifen. Es wurde vergessen in der Methode die self aufruft als ersten Parameter self entgegen zu nehmen. Beispiel, hier gibt es das Problem: def testmethode(a,b,c): Die Methode hat keine Variable namens self die einen Verweis auf das Objekt selbst aufnehmen könnte → self ist nicht definiert. Beispiel so ist es richtig: def testmethode(self,a,b,c): |
IndentationError: unexpected indent | Man hat etwas eingerückt ohne das davor ein Blockstatement (wie if, class usw.) kommt. In Python werden Zeilen eingerückt um ihre zugehörigkeit zu einem Block zu definieren |
TypeError: Methodenname takes exactly x arguments (x+y given) | Eine Methode wurde aufgerufen und mehr Parameter angeben als die Methode erwartet maximal übergeben zu bekommen. Die komplette Meldung sieht zum Beispiel so aus: TypeError: bla() takes exactly 2 arguments (3 given) Häufigster Grund: Method eeiner Klasse aufgerufen und bei der deklaration der Methode wurde vergessen als ersten Parameter self anzugeben: def testmethode(a,b): Wenn man diese Methode aufruft: testmethode(„Hans“,„Wurst“) bekommt man: TypeError: testmethode() takes exactly 2 arguments (3 given) Man hat zwar explizit nur 2 Parameter „Hans“ und Wurst übergeben, aber intern wird übergeben: self, „Hans“, „Wurst“. Self ist ein Verweis auf das Objekt selbst. Richtig müsste die deklaration der Methode so aussehen: def testmethode(self,a,b): |
NameError: name 'self' is not defined | Beim deklarieren einer Methode wurde ein Parameter standardmäßig auf ein Klassenattribut gesetzt. Beispiel: def testmethode(parametereins=self.globaleins) Der Kompiler wird bei oben genanntem Beispiel meckern, weil auf self.globaleins zugegriffen wird. Methodendeklarationen werden geprüft vor dem instanzieren der Klasse (also bevor es ein Objekt gibt) und damit bevor es globale Attribute/Variablen gibt. Workaround: def testmethode(parametereins=None): if parametereins is None: parametereins=self.globaleins
|
Name | Typ | Beschreibung | Quelle |
---|---|---|---|
Python Das umfassende Handbuch | Buch/Kurs | Openbook von Galileo | http://openbook.galileocomputing.de/python/ |