Benutzer-Werkzeuge

Webseiten-Werkzeuge


python

Dies ist eine alte Version des Dokuments!


Besonderheiten

  • Python markiert Anweisungsblöcke durch einrücken
    • Es gibt keine { } oder Spezialwörter die einen Anweisungsblock (zum Beispiel nach einem if-Statement) eingrenzen
  • Python betrachtet Zeilenumbrüche als Ende einer Anweisung
    • Es kennt kein ; um eine Anweisung als zu Ende zu markieren

Technisches

Variablen, Instanzen, Referenzen

  • Referenzen → Zeiger die auf eine Instanz verweisen
    • auch bekannt als Bezeichner/Variablenname
  • Instanz → ein konkretes Objekt von einem Typ
    • auch bekannt als Variable, Wert usw.
    • also eine konkrete Stelle im Speicher/ein konkretes Objekt
  • Variablennamen sind in Python Referenzen auf eine Instanz
    • verweisen also auf einen Speicherbereich
  • =-Operator weißt einem Bezeichner (Variablenname) eine Referenz zu
  • verweisen zwei Referenzen auf die gleiche Instanz und wird eine geändert - wird eine zweite Instanz angelegt die den neuen Wert enthält und die geänderte Referenz verweist auf die neue Instanz
    • so lange beide Referenzen unverändert sind → gleiche Instanz
    • wenn Instanz über eine Referenz geändert wird → wird eine Kopie der Instanz angelegt
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.

Hilfsprogramme

Name Beschreibung
pydocDokumentation zu python

Syntax: pydoc Funktionsname
pipPaketmanager - 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

Datentypen

  • Mutable → Veränderliche Datentypen → Datentypen die nach der Deklaration noch geändert werden können
  • Immutable → Datentypen die nach der Deklaration nicht mehr verändert werden können → entspricht const in C
  • Alle Datentypen sind Objekte

Sequentielle Datentypen

  • Datentypen bei denen die Informationen sequentiell (nacheinander) abgelegt sind
Name Beschreibung
unicodeEine Unicode-Zeichenkette
strEine Byte-Kette/eine ASCI-Zeichenkette

Speichert (im Gegensatz zu Unicode) die Daten Byte-Genau, man kann darin also Binärdaten speichern
listEine geordnete Liste von beliebigen Objekten/Datentypen

Geordnet → die Reihenfolge in der die Objekte gespeichert wurden wird beibehalten (hat nichts mit sortiert zu tun)
tupleImmutable (unveränderliche) Liste - kann nach der Deklaration nicht mehr verändert werden

Sequentielle Operatoren

  • Alle sequentielle Datentypen unterstützen die unten stehenden Operationen
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 → sequentielles Objekt
  • n → Ganzzahl
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 → sequentielles Objekt
  • n → Ganzzahl
a="Hallo"
a*=5
print a
HalloHalloHalloHalloHallo
inPrüfung ob ein Wert im seriellen Objekt vorkommt - liefert true oder false


Syntax: a in b

  • a → Wert der gesucht wird
  • b → Objekt in dem gesucht wird


Liefert true (Wert ist im seriellen Objekt) oder false (Wert ist nicht im seriellen Objekt)

not inPrüft ob ein Wert nicht im seriellen Objekt vorkommt - liefert true oder false


Syntax: a not in b

  • a → Wert der gesucht wird
  • b → Objekt in dem gesucht wird
len(s)Liefert die Anzahl der Elemente des seriellen Objektes (s) zurück


Syntax: x=len(s)

  • s → das Objekt dessen Anzahl Elemente festgestellt werden soll
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)

  • s → das serielle Objekt aus dem das kleinste Objekt/Wert/Element ermittelt werden soll
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)

  • s → das serielle Objekt aus dem das größte Objekt/Wert/Element ermittelt werden soll
s[x]Ermöglicht den Zugriff auf das xte Element innerhalb eines seriellen Objektes


Syntax: s[x]

  • s → das serielle Objekt
  • x → das Element auf welches man zugreifen möchte/dessen Inhalt man haben will - Achtung: Die Zählung beginnt bei 0
s[x:y]Zugriff auf auf Bereich von Elementen innerhalb eines seriellen Objektes


Syntax: s[x:y]

  • s → serielle Objekt auf das zueggriffen werden soll
  • x → Optional; Erstes Element des Bereiches - Achtung: Zählung beginnt bei 0
    • Wird es nicht angegeben wird der Bereich beim 0en (ersten) Element begonnen
      • Notation: s[:y] → a[:5]
  • y → Optional; Gesamtanzahl der auszugebenden Elemente - Achtung: Das erste Element zählt mit in die Anzahl; das letzte zurück gegebene Element ist also x+y-1
    • Wird es nicht angegeben wird der Bereich bei x begonnen und geht bis zum letzten Element
      • Notation: s[x:] → a[2:]

Auf diese Weise können auch die so adressierten Elemente gelöscht werden: del s[x:y:z).
Oder ersetzt werden: a[x:y:z]=value

s[x:y:z]Zugriff jedes z'ste Element innerhalb eines definierten Bereiches eines seriellen Objektes - Schrittdefinition


Syntax: s[x:y:z]

  • s → serielle Objekt auf das zueggriffen werden soll
  • x → Optional; Erstes Element des Bereiches - Achtung: Zählung beginnt bei 0
    • Wird es nicht angegeben wird der Bereich beim 0en (ersten) Element begonnen
      • Notation: s[:y:z] → a[:5:2]
  • y → Optional; Gesamtanzahl der auszugebenden Elemente - Achtung: Das erste Element zählt mit in die Anzahl; das letzte zurück gegebene Element ist also x+y-1
    • Wird es nicht angegeben wird der Bereich bei x begonnen und geht bis zum letzten Element
      • Notation: s[x::z] → a[2::2]
  • z → Schrittzahl aka jedes wie vielte Element im gewählten Bereich soll berücksichtigt werden
    • 1 bedeutet jedes Element des seriellen Objektes wird genommen, 2 → jedes zweite (also 1,3,5 usw.)
    • kann auch alleine angegben werden - es wird dann das gesamte serielle Objekt schrittweise durchlaufen
      • Notation: s[::z] → a[::2]



Auf diese Weise können auch die so adressierten Elemente gelöscht werden: del s[x:y:z).
Oder ersetzt werden: a[x:y:z]=value

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]

  • x → Index/x-te Element in a
  • y → Index/y-te Element des x-ten Elements von a

Set

Bringen spezielle Operatoren mit die u.a. erlauben Mengen zu:

  • vergleichen
  • auf Übereinstimmung zu prüfen
  • auf Differenzen zu prüfen
  • zu prüfen ob eine Menge eine Teilmenge einer anderen menge ist
setMenge - jedes Elememt darf nur einmal vorkommen
frozensetImmutable (Unveränderliches) set - kann nach der Deklaration nicht mehr verändert werden

Mapping

  • in Python Standard-Mapping: Dictionary
  • Speichert Key-Value-Pairs aka Wert-Paare

Sprachkonstrukte

Methoden

Syntax:

def Funktionsname (Parameter1,Parameter2):
    Funktionscode

Methodenaufruf:

Rückgabevariable=Funktionsname(Parameter1, Parameter2)
  • Rückgabevariable: Optional Variable die einen eventuellen Rückgabewert der Funktion aufnimmt
  • Funktionsname: Name der Funktion
  • Parameterx: Parameter die an die Funktion übergeben werden; Als bennannter Parameter in beliebiger Reihenfolge → Parametername=Wert, Parameter2=Wert2, oder als unbenannte Parameter in Reihenfolge → Parameter1, Parameter2 usw.

Optionale Parameter

  • In der Literatur/Dokumentation als Parameter1,Parameter1[,Parameter3, Parameter4] dargestellt → Parameter1 und 2 sind dabei anzugeben, 3 und 4 sind optional

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.

Benannte Parameter

  • Ermöglicht das angeben von Parametern in beliebiger Reihenfolge

Syntax:

def Funktionsname (Parameter1, Parameter2):
      Code
      
Funtionsname(Parameter1=Wert1, Parameter2=Wert2)
  • Parameter 1 und 2 sind Referenzen/Bezeichner/Variablennamen
  • über den Parameternamen können die Paraemter direkt angesprochen werden

Klassen

  • Klassen sollten (wenn sie nicht von einer anderen Klasse erben) von Object erben
    • Object implementiert einige nützliche Funktionen → u.a. kann nur wenn von Object geerbt wurde per type(Objekt) der Typ (Klassenname) abgerufen werden

Klassenvariablen

  • Variablen die die global über alle Objekte der Klasse existieren
  • diese Variablen existieren nur einmal für alle Objekte der Klasse zusammen
    • wird in einem Objekt der Inhalt der Variable geändert, ändert er sich in allen Objekten der Klasse
  • Klassenvariablen werden unmittelbar nach der Klassendeklaration definiert

Syntax:

class test(object):
   a=list([1,2,3,]
  • a ist in diesem Fall eine Klassenvariable

Objektvariablen

  • Variablen die innerhalb des Objektes global verfügbar sind
  • Jedes Objekt/Instanz der Klasse hat diese Variablen für sich alleine
    • ändert sich der Wert innerhalb eines Objektes, ändert er sich nicht in den anderen Objekten
  • Objektvariablen werden in der init-Methode defklariert
  • Objektvariablen werden über self.Variablenname angesprochen
    • self → Verweis auf das aktuelle Objekt

Syntax:

class test (object):
   def __init__(self):
      self.a=list([1,2,3,4,5])

Überladen

  • Überladen von Methoden ist in Python nicht vorgesehen
  • Abhilfe kann man durch mehrere Methoden schaffen oder
  • durch Parameter die man per Default auf none setzt, von denen nur ein teil gesetzt wird und wo man anschließend prüft welche der parameter gesetzt wurden

Überschreiben

  • Überschreiben von Methoden geht
  • man definiert die gleiche Methode die man geerbt hat ein zweites mal → damit ist sie überschrieben

Private Variablen/Methoden

  • Gibt es in Python nicht
  • Es gibt die Konvention das Variablen/Methoden auf die nicht direkt zugegriffen werden darf _Variablenname geschrieben werden

Syntax: _Variable=Type()
Syntax: def _Methodenname(self)

Statische Variablen/Methoden

This section is not tested and based on assumptions:

  • Werden per Methodenname deklariert * sind vorhanden ohne das eine Instanz der Klasse geschaffen wurde === Spezialmethoden === * Es gibt einige Methoden die nur durch den Compiler aufgerufen werden sollen * Diese werden mit Methode deklariert Syntax: def init__()

Funktionen

Name Beschreibung
printAusgabe von Text auf dem Bildschirm

Syntax: print Text

  • Kommagetrennte Abschnitte resultieren in Leeruzeichen zwischen den Abschnitten
    • print „Hallo“,„%s“ %Name → „Hallo Name“
  • Nach dem Ende einer Print-Anweisung folgt ein Zeilenumbruch
    • mit einem „,“ am Ende erfolgt kein Zeilenumbruch in der Ausgabe
print "Hallo",
print "Mensch"

Obiges Beispiel ergibt: „Hallo Mensch“ (ohne Zeilenumbruch, wegen des „,“ am Ende


Ausgabe in Dateien:
Syntax: print » Dateiobjekt, String

Wichtig ist das Dateiobjekt kommt zuerst, durch Komma getrennt kommt danach der zu schreibende String.
Hinweis: Es ist wichtig in welchem Modus die FDatei geöffnet wird. Wird open() mit „w“ geöffnet wird eventuell bestehender Inhalt in der Datei überschrieben. Wird es mit „a“ geöffnet (append) wird der neue Inhalt angefügt - der bestehende Inhalt bleibt bestehen

inputLiest Text auf der Kommandozeile ein - die Eingabe wird durch das Drücken von <Enter> beendet

Syntax: Variable=input (Ausgabetext)

  • Variable → Bezeichner der auf die eingelesenen Daten verweist
  • Ausgabetext → Optionaler Text der direkt vor der Eingabe erscheint

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_inputLiest 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)

  • Variable → Bezeichner der auf die eingelesenen Daten verweist
  • Ausgabetext → Optionaler Text der direkt vor der Eingabe erscheint

Hinweis: Über die Konvertier-Funktionen (also zum Beispiel int()) kann die Eingabe vor dem Speichern bereits einen bestimmten Typ erhalten:
a=int(raw_input())

openÖffnet eine Datei zum lesen oder schreiben

Syntax: Dateiobjekt=open(„Dateiname“,„Modus“)

  • Dateiobjekt → Variable die eine Referenz auf die Datei aufnimmt
  • Dateiname → gesamter Pfad zur gewünschten Datei
  • Modus → Für was die Datei geöffnet erden soll.
    r → Lesen, w → Schreiben, a → Daten an das Ende anfügen, r+ → Lesen und Schreiben, w+ → Schreiben und lesen - vorher die Datei leeren, a+ Anfügen und Datei zum lesen öffnen.
    Die Optionen gibt es auch mit vorangestelltem b - in dem Fall werden die Dateien binär geöffnet

HowTos

Arbeiten mit Dateien

Methode Funktion
open(Dateipfad,Modus)Öffnet eine Datei.
Rückgabewert ist ein Dateiobjekt

Modi:
  • r → Read/Lesen
  • w → write/schreiben
    • Achtung: Ist die Datei bereits vorhanden wird sie überschrieben
  • a → Append/Anfügen
    • Fügt die neuen Daten (per Default) an das Ende der Datei an

Zusätzlich kann man bei „r“ und „w“ ein „+“ anfügen. Die Datei ist dann zum lesen und zum schreiben geöffnet.
Ein angehängtes b öffnet die Datei im Binärmodus

Beispiel: open(„/tmp/test“,„w“)

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

Size ist die zu lesende Anzahl Bytes. Der Parameter ist optional, wird er nicht angegeben wird bis zum Ende der Datei (EOF) gelesen.

Beispiel: a=fobj.read()
a → enthält den gelesenen String
fobj → das Dateiobejkt welches von open zurückgegeben wurde
Size → Optionaler Parameter der die Länge in Byte angibt die gelesen werden soll

Troubleshooting

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.

Compiler-Medlungen

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 definedSelf 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 indentMan 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 definedBeim 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



Der Parameter der eigentlich den Wert eines globalen Attributes/Variable bekommen sollte, wird einfach standardmäßig auf None gesetzt und in der Methode geprüft ob er None als Wert hat und wenn das der Fall ist wird ihm der Wert des globalen Attributes/Variable zugeweisen (was erst beim aufrufen der Methode passiert, was vorraussetzt das die Klasse instanziert wurde und was bedeutet das es auch globale Attribute gibt).

Dokumentation/Turotials

Name Typ Beschreibung Quelle
Python Das umfassende HandbuchBuch/KursOpenbook von Galileo http://openbook.galileocomputing.de/python/
python.1416157472.txt.gz · Zuletzt geändert: 2014/12/04 10:24 (Externe Bearbeitung)