Inhaltsverzeichnis[Anzeigen]

 

 

Typen und Operatoren

Konzepte

Typklassen

  • Immutabel: Zahlen, Strings und Funktionen
    • können nicht verändert werden
    • können nur auf der rechten Seite (rvalue) einer Zuweisung stehen
    • so ist
a="test"
b=a[2:]

erlaubt,
ALERT!hingegen führt

a[0]="T" 

zur Exception

  • Mutabel: Dateien, Listen, Dictionaries, Klassen und deren Instanzen
    • können verändert werden
    • können auch auf der linken Seite (lvalue) einer Zuweisung stehen
a={}
a["1"]=1
  • TIP daß Klassen mutabel sind, unterscheidet Python von Java und C++
    MOVED TO... zur Laufzeit kann die Definition einer Klasse modifizieren werden
class A:
pass

A.b= 3
A.test = lambda self : 10
  • Aufrufbar: Funktionen und Klassen
  • Indizierbar: Tupel, Strings, Listen und Dictionaries
  • Sequenzen: Tupel, Strings und Listen

Zuweisung

ALERT! Die Unterscheidung zwischen Referenz- und Kopiersemantik bei der Zuweisung ist in Python insbesondere auch eine Unterscheidung zwischen mutablen und immutablen Datentypen.

Durch einen Ausdruck der Form

y=x 


wird nicht der Speicherinhalt der Variable kopiert, sondern nur eine neue Bindung an den Speicherinhalt erzeugt.
Da hier nur eine neue Referenz (Alias) auf das von x referenzierte Speicherobjekt erzeugt wird, spricht man von der Referenzsemantik beim Kopieren.
Wird hingegen der Speicherinhalt mitkopiert, nennt man dies Kopiersemantik .

  • Kopiersemantik:
    • C, Pascal, C++
  • Referenzsemantik:
    • Python, Java, C++, Fortran

Folgendes Bild soll dies noch verdeutlichen:

  • Referenz- versus Kopiersemantik:
    Referenz versus Kopiersemantik
  • REFACTOR  der  Unterschied zwischen zuweisen und kopieren
a=5
b=a
b=4

print a,b

aber

a=[5]

b=a
b[0]=100
print a,b

im ersten Fall wird ein (immutables) Objekt neu zugewiesen, hingegen im zweiten Fall ein (mutables) Objekt modifiziert
HELP Der klassische swap Algorithmus setzt call by value voraus und führt daher bei Python call by objectnicht zu dem gewünschten Ergebnis.

def swap1(a,b):

tmp=a
a=b
b=tmp
  • hier werden Aliase für die Aufrufargumente a,b erzeugt, die im Funktionskörper vertauscht werden
  • ALERT! das Vertauschen der Objektreferenzen findet nur im Funktionskörper statt
  • führt man hingegen eine Operation auf dem referenzierten Objekte aus, so bleibt die Modifikation bestehen
def swap2(a,b):
tmp=a
a=b
b=tmp
b[0]=10
  • TIP um Daten zu vertauschen, muß man auf den Objekten arbeiten
a,b=b,a 

Freie Funktionen versus Methoden

  • alles in Python ist ein Objekt
  • Methoden sind an Objekte gebunden und können daher nur mit einem Objekt aufgerufen werden. Im Gegensatz hierzu erhalten freie Funktionen das Objekt als Argument.
obj=[1,2,3]

print len(obj)
obj.count(2)
  • während bei len(obj) die freie Funktion obj als Parameter bekommt, ruft der Ausdruck obj.count() die Methode count auf dem Objekt auf

Lebensdauer

Namensraum

  • vereinfachend gesprochen gibt es drei Namensräume lokal, global und built in, in denen Namensbezüge in der Suchreihenfolge
    lokal MOVED TO... global MOVED TO... built in aufgelöst werden

Datentypen

  • REFACTOR um zu sehen, welche Operationen ein Datentyp zur Verfügung stellt, hilft die Introspektionsfähigkeit von Python und eine interaktive Pythonshell
dir (5)

dir( " " )
dir ( [] )
dir( () )

dir( {} )

Einfache Datentypen - Zahlen

Folgende Datentypen stehen zur Verfügung:

  • Boolean Typ bool mit den Werten True und False seit Python 2.3
  • ganze Zahlen
    • int: ganze Zahlen fester Länge, abhängig von der Python Implementierung
    • long int: ganze Zahlen fast beliebiger Länge
  • float: Fließkommazahlen fester Länge, abhängig von der Python Implementierung
  • complex: Paare von floats
  • Python besitzt keinen Datentyp char 

Numerische Operationen

  • Die Schreibweise und Präzedenz von Literalen entspricht der von C bzw. Java.
  • Die Zuweisung kann auch in der kompakteren - performanteren - Form geschrieben werden.
    So sind die beiden Ausdrücke und die konkreten Beispiele äquivalent:
  <var>= <var><op><exp>
<var><op>=<expr>

a=a+1
a+=1
 

 

OperationstypOperationenganze ZahlenfloatscomplexErläuterung
Grundoperationen + - * / ** % // choice-yes.gif choice-yes.gif choice-yes.gif ** (Potenzieren) % (Modulo) // (Floor Division)
Standardfunktionen abs divmod pow choice-yes.gif choice-yes.gif choice-yes.gif pow(x,y[,m])= (x ** y % m )
divmod(x,y)= (int(x/y),x%y)
bitweise shift << >> choice-yes.gif     << bitweise verschieben nach links
bitweise Operation & | ^ ~ choice-yes.gif     & (and) | (or) ^ (xor) ~ (Negation)
Runden round   choice-yes.gif   round(a,b) wobei b die Tiefe darstellt

Logische Operatoren

  • folgende Ausdrücke evaluieren zu False, wenn sie in logischen Ausdrücken verwendet werden
    • die Integer 0 und die float 0.0
    • der empty Placeholder None, vergleichbar mit den Null Pointer in C
    • die leere List [], das leere Tupel () und das leere Dictionary {}
    • MOVED TO... alle anderen Werte evaluieren zu True
  • logische not, and und orOperatoren
False and (False or True) 


schon durch das erste False bestimmt

  • Vergleichsoperatoren: is, ==, <>, !=, <, >, <=, >=
    • TIP is testet die Objektidentität, die anderen Vergleichsoperatoren den Wert des Objekts auf Gleichheit

Zusammengesetzte Datentypen

Sequentielle Typen - Strings, Tupel und Listen

  1. alle Sequenzen unterstützen folgende Operationen

    OperationBeschreibung
    s[i] i-te Elemente
    s[i:j] Slice von s[i] auschließlich s[j]
    s[i:j:k] vom Slice s[i:j] jedes k-te Element beginnend bei s[i]
    e in s ist e Element von s
    len(s) Anzahl der Elementen von s
    min(s) Minimum von s
    max(s) Maximum von s
    • bei den Operationen auf den Sequenzen sollte man folgendes beachten:
      • die Indizes beginnen bei 0
      • für die Parameter i,j,k eines Slices s[i:j:k]gilt:
        • i ist immer einschließlich
        • j ist immer ausschließlich zu sehen
        • k besitzt den Defaultwert 1
        • fehlende Parameter werden abhänig von k bestimmt
          1. k > 0 :
            • fehlende Parameter werden auf -sys.maxint und sys.maxint gesetzt, so daß gilt:
              s[::k] ist äquivalent zu s[-sys.maxint:sys.maxint:k]
          2. k < 0 :
            • fehlende Parameter werden auf sys.maxint und -sys.maxint gesetzt, so daß gilt:
              s[::k] ist äquivalent zu s[sys.maxint:-sys.maxint:k]
      • Strings und Tupel sind immutabel, d.h. alle Operationen sind im Gegensatz zu Listen nur lesend möglich
      • während der Indexzugriff gegebenfalls ein Exception wirft, gibt der Slicezugiff auf eine Sequenz eine leeren Slice zurück
  2. mutable Sequenzen unterstützen noch die zwei zusätzlichen Löschfunktionen

    OperationBeschreibung
    del s[i] lösche das i-te Elemente
    del s[i:j] lösche den Slice von s[i] auschließlich s[j]
    • REFACTORerzeuge eine Liste
      • erzeuge Schnitte dieser Liste
        • ab einer Position
        • vorwärts/rückwärts
        • nur jedes i-te Element
      • lösche einzelne Elemente/Bereiche
Strings
  • immutable Folgen von ASCII- oder Unicode-Zeichen
  • Schreibweise:
    • " ": native String
    • r" ": raw String
    • u" ": Unicode String
  • neben den Operationen für Strings als immutabler Sequenz, gibt's für Strings noch weitere Methoden

    OperationBeschreibung
    s.capitalize() Schreibe den ersten Buchstabe von s groß
    s.center( w ) stelle s mittig in einem Feld der Länge w dar
    s.count(sub[,start[,end]]) Zähle das Vorkommen eines Substrings sub
    s.encode([encoding[,errors]]) Gib eine encodierte Version von s zurück
    s.endswith( suffix[,start [,end]] ) Prüfe das Ende von s auf den Substring suffix
    s.expandtabs( [tabsize] ) Expandiere tabs
    s.find(sub[,start [,end]] ) Finde das erste Vorkommen von sub in s
    s.index(sub [,start [,end]] ) Finde das erste Vorkommen von sub in s oder wirf eine Exception
    s.isalnum() Prüfe, ob alle Zeichen alphanumerisch sind
    s.isalpha() Prüfe, ob alle Zeichen alphabetisch sind
    s.isdigit() Prüfe, ob alle Zeichen Zahlen sind
    s.islower() Prüfe, ob alle Zeichen Kleinbuchstaben sind
    s.isspace() Prüfe, ob alle Zeichen whitespace sind
    s.istitle() Prüfe, ob s ein Titel ist
    s.isupper() Prüfe, ob alle Zeichen Großbuchstaben sind
    s.join(t) Verbinde die Strings in t mit s als Trenner
    s.ljust(w) Links-align s in einem String der Länge w
    s.lower() Gibt den String von s in Kleinbuchstaben zurück
    s.lstrip() Entferne führende Leerzeichen
    s.replace( old, new [,maxreplace]) Ersetze von Substring von old mit new
    s.rfind(sub [,start [,end]]) Finde das letzte Vorkommen von sub in s
    s.rindex(sub [,start [,end]] ) Finde das letzte Vorkommen von sub in oder wirf eine Exception
    s.rjust(w) Rechts-align s in einem String der Länge w
    s.rstrip() Entferne endende Leerzeichen
    s.split([sep [,maxsplit]]) Splitte s mit sep als Trenner
    s.splitlines([keepend]) Splitte eine String in eine Liste von Zeilen.
    Falls keepend auf 1 gesetzt ist, werden folgende newlines berücksichtigt
    s.startswith(prefix[,start [,end]]) Prüfe das Anfang von s auf den Substring prefix
    s.strip() Entferne führende und endende Leerzeichen
    s.swapcase() Gib einen String zurück, indem Groß- und Kleinzeichen vertauscht sind
    s.title() Gib eine Titelversion des Strings zurück
    s.translate( table (, deletechars]) Gibt eine mit table übersetzten String zurück
    s.upper() Gibt den String von s in Großbuchstaben zurück
Besonderheiten

rawString

  • durch
 r"mein String

wird ein rawString definiert

  • in diesem wird ein mit \ beginnender Escapeausdruck nicht interpretiert
  • insbesondere beim regulären Ausdrücken und dem Öffnen von Dateien unter Windows sollten rawStrings verwendet werden:
    • "C:\new\test.dat" wird sonst als "C:(newline)ew(tab)est.dat" interpretiert

unicodeString

  • Python unterstützt Unicode Strings
  • Unicode Strings werden durch
u"test" 

definiert

  • für unicode Strings steht die ganze String Funktionalität zur Verfügung
  • wird ein String mit einem unicode String verknüpft, ist der resultierende String ein unicode String
  • durch str(u"test") bzw. unicode("test") kann zwischen den Codierungen konvertieren werden
  • REFACTORtestString="Dies ist ein Teststring."
    • zerlege den String in seine Worte und baue ihn wieder zusammen
    • alignden String "test" auf 40 Zeichen( links, rechts und center )
      • speichere diese Strings ab
      • schneide die Leerzeichen wieder ab
    • besitzt testString das Zeichen T
    • besitzt testString das Zeichen A
  • ALERT!Veränderung mit Python 3.*
    UmsetzungPython 2.*Python 3.*
    8Bit String "string" b"string"
    Unicode String u"string" "string"
Tupel
  • immutable Folgen von beliebigen Objekten
  • Schreibweise: ()
Listen
  • mutable Folgen von beliebigen Objekten
  • Schreibweise: []
  • im Gegensatz zu immutablen Sequenzen, die das Ergebnis der Operation zurückgeben, wirken Listenoperationen auf der Liste
    • ALERT! folgender Code soll die Problematik verdeutlichen
a=[1,2,3]
a.reverse()

print a
a=a.reverse()
print a

 

MethodeBeschreibung
range(n) erzeugt eine Liste [0,1,2,..,n-1]
range(n,m) erzeugt eine Liste [n,n+1,...,m-1]
range(n,m,d) reduziert die Liste range(n,m) auf jedes d-te Element
list(s) Konvertiert die Sequenz s zu einer Liste
s.append(x) hängt das Element x an die Liste an
s.extend(t) erweitert die Liste um die Elemente von t
s.count(x) zählt vorkommen von x in s
s.index(x) gibt den kleinsten Index i zurück, für den gilt s[i] == x
s.insert(i,x) fügt x am Index i ein
s.pop([i]) gibt das Element s[i] zurück und entfernt es aus der Liste.
Falls i nicht angegeben wird, wird die Operation auf das letzte Argument angewandt
s.remove(x) sucht nach x und entfernt es aus s
s.reverse() dreht die Reihenfolge der Elemente von x in place um
s.sort([cmpfunc]) sortiert die Elemente von s gegebenfalls mit Hilfe von cmpfunc in place

 

Assoziative Typen - Dictionaries

  • Datencontainer von Paaren (key,values)
  • Schreibweise: { }
  • auch bekannt als: Dictionary, Map, Hash oder Assoziatives Array
  • der Zugriff auf ein Element ist konstant.
  • das Interface des Dictionaries

    MethodeBeschreibung
    len(m) Anzahl der Elemente von m
    m[k] Gibt den Wert m[k] zurück
    m[k]= x Setze m[k] auf x
    del m[k] Entferne m[k] von m
    m.clear() Entferne alle Elemente von m
    m.copy() Gibt eine copy von m
    m.has_key(k) Existiert der Schlüssel k?
    k in m Existiert der Schlüssel k?
    m.items() Gibt eine Liste aller Paare (key,values) von m zurück.
    m.keys() Gibt eine Liste aller Schlüssel von m zurück.
    m.update(b) Füge alle Elemente vom Dictionary b zu m hinzu.
    m.values() Gibt eine Liste aller Werte von m zurück.
    m.get(k[,v]) Gib m[k] zurück, falls es existiert, anderfalls v (default None)
    m.setdefault(k[,v]) Gib m[k] zurück, falls es existiert, anderfalls v und setzte m[k]=v.
    m.pop(k[,v]) Gib m[k] zurück, entferne das Element, falls es existiert.
    Wenn es nicht existiert oder kein Defaultargument angegeben wird, wirf ein Ausnahme.
    m.popitem() Entferne ein zufälliges Element (key,value) von m und gib es als Tupel zurück.

 

  • REFACTORd={"red":1, "green":2, "blue":3}
    • Welcher Wert hat red?
    • Gibt es white?
    • Falls white nicht existiert, gib 0 zurück.
    • Falls white nicht existiert, gib 0 zurück und trage das Paar in d ein.
    • d2={"white":0,"red":1,"purple":4}: Aktualisiere d mit d2
    • HAND Gib d nach Schlüsseln und nach Werten sortiert aus.
    • HAND Gib d nach Schlüsseln und nach Werten rückwärts sortiert aus.

Konvertierungsoperationen

KonvertierungBeschreibung
int(x [,base] ) Konvertiert x nach int
long(x [,base] ) Konvertiert x nach long int
float(x) Konvertiert x nach float
complex(real [,imag]) Erzeugt eine komplexe Zahl
str(x) Konvertiert x zu einer Stringrepräsentation
repr(x) Konvertiert x zu einem expression string
Kurzform `x`
eval(str) Wertet einen String aus und gibt ein Objekt zurück
tuple(s) Konvertiert eine Sequenz in ein Tupel
list(s) Konvertiert die Sequenz s in eine Liste
chr(x) Konvertiert ein Integer zu seinem Zeichen
unchr(x) Konvertiert ein Integer zum einem Unicode Zeichen
ord(x) Konvertiert ein Zeichen in eine natürliche Zahl
hex(x) Konvertiert eine natürliche Zahl in einen hexadezimal String
oct(x) Konvertiert eine natürliche Zahl in eine oktalen String
  • die Konvertierungsoperationen repr und eval sind zueinander invers, so dass gilt: a=eval(repr(a))
  • HAND Gib die Strings test20, test18, ....., test-4 aus

built-ins

  • Python bringt ein Fundus an built-in Funktionen und Klassen mit
  • einen einfachen Überblick ergibt
>>> dir ()
['__builtins__', '__doc__', '__name__']
>>> dir ( __builtins__ )

['ArithmeticError', 'AssertionError', 'AttributeError', 'DeprecationWarning','EOFError', 'Ellipsis', 'EnvironmentError',

'Exception', 'False', 'FloatingPointError', 'IOError', 'ImportError', 'IndentationError', 'IndexError', 'KeyError',

'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError',

'OSError', 'OverflowError', 'OverflowWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError',

'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError',

'UnboundLocalError', 'UnicodeError', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__',

'__doc__', '__import__', '__name__', 'abs', 'apply', 'bool', 'buffer', 'callable', 'chr', 'classmethod', 'cmp', 'coerce',

'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'eval', 'execfile', 'exit', 'file',

'filter', 'float', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance',

'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord',

'pow', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'round', 'setattr', 'slice','staticmethod',

'str', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
Anhänge:
Diese Datei herunterladen (typenUndOperatoren.py)typenUndOperatoren.py[ ]0.3 KB

Mentoring

Stay Informed about my Mentoring

 

Rezensionen

Tutorial

Besucher

Heute 73

Gestern 1427

Woche 4076

Monat 20018

Insgesamt 3318930

Aktuell sind 24 Gäste und keine Mitglieder online

Kubik-Rubik Joomla! Extensions

Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare