Kapitel 6: Grundlagen der Programmierung - Datenstrukturen Einführung in die Informatik Wintersemester 2007/08 Prof. Bernhard Jung Übersicht Einleitung EBNF Ein Darstellungsmittel für den syntaktischen Aufbau von Programmiersprachen Datentypen in Python Hauptlernziele: Die grundlegenden Datentypen in Python kennen lernen (ähnlich zu vielen anderen Programmiersprachen) Syntaktischen Aufbau der Literale verschiedener Datentypen verstehen Operationen kennen lernen, die auf Objekte verschiedener Datentypen angewendet werden können 1
Daten, Datentypen, Datenstrukturen Daten: Objekte, mit denen ein Programm umgehen soll Datentypen z.b. Zahlen, Zeichenketten, Wahrheitswerte, Felder, ( in vielen Programmiersprachen vordefiniert) z.b. Bilder, Musikstücke, Videos, ( definierbar; z.tl. in Programmbibliotheken definiert) Unterstützung unterschiedlicher Operationen z.b. Addition von Zahlen, aber nicht von Bildern z.b. Komprimierung von Bildern, aber nicht von Zahlen Datenstruktur: Datentyp + Operationen Datenstruktur: Eine Menge gleichartiger Daten, auf denen eine Sammlung von Operationen definiert ist. Eine Operation ist dabei eine Verknüpfung, die einer festen Anzahl von Eingabedaten ein Ergebnis zuordnet. Bsp: Datentypen und Operationen (am Beispiel Python) Eingabe-Prompt Eingabe eines Ausdrucks Ausgabe: Wert des Ausdrucks >>> 1 + 2 3 >>> '1' + '2' '12' >>> Addition von Zahlen Addition von Zahlen Konkatenation von Zeichenketten Konkatenation von Zeichenketten >>> 5 / 2 2 >>> 5.0 / 2 2.5 Division von Integer-Zahlen Division von Integer-Zahlen Division von Gleitkommazahlen Division von Gleitkommazahlen 2
Wdh: Einfache Datentypen (am Beispiel Python; ähnlich in vielen anderen Programmiersprachen) Ganze Zahlen ("integer"): 1, 2, 5, -100,... auch im Hexadezimalsystem spezifizierbar: 0xA1, 0xFF, 0x3B, Reelle Zahlen ("float"): 0.1, 3.14, 10.0, -33.33,... auch in Exponentialschreibweise: 1.0e-5, 0.5e10, Zeichenketten ("string"): "TU Bergakademie Freiberg",... 'Grundlagen der Informatik' Listen: [1,2,3], ["eins", "zwei", drei"],... Boolean: true, false... EBNF Notation zur Beschreibung von Grammatiken insbesondere Syntax von Programmiersprachen EBNF Extended Backus Naur Form John Backus (1956) Beschreibung von der Syntax von Fortran Peter Naur (1958) Beschreibung von der Syntax von Algol Niklas Wirth (1976) Erweiterte BNF zur Beschreibung von Pascal ISO/ICE-Norm 14977 (1996) Standard für EBNF Grammatiken 3
EBNF Komponenten von EBNF-Grammatiken Terminalsymbole in Python z.b. "1", "2", "print", "for", "if" Nichtterminalsymbole ein Startsymbol (aus der Menge der Nichtterminalsymbole) Regeln der Form: LHS ::= RHS, wobei LHS (left-hand-side) ist Nichtterminalsymbol RHS (right-hand-side) ist Ausdruck aus Terminal, Nichtterminalsymbolen, Operatoren und Klammern Bedeutung: LHS kann durch RHS ersetzt werden z.b. Regel digit ::= "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" d.h. digit kann durch eines der Zeichen "0"... "9" ersetzt werden EBNF - Operatoren Auswahl senkrechter Strich bezeichnet Auswahlmöglichkeit lies als "oder" z.b. digit ::= "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" oder abkürzend digit ::= "0" "9" d.h. eine Ziffer (digit) ist das Zeichen 0, oder das Zeichen 1, oder das Zeichen 2, usw. 4
EBNF - Operatoren Wiederholung + Pluszeichen + bezeichnet das mehrfache Vorkommen eines Symbols z.b. ba+ steht für ba, baa, baaa, baaaa, Sternoperator * Der Stern * bedeutet, dass ein Symbol n-mal, n 0, vorkommt z.b. ba* steht für b, ba, baa, baaa, baaaa, Option [] Kennzeichnung optionaler Symbole in einem Ausdruck z.b. a[b]c steht für ac oder abc Gruppierung () Runde Klammern dienen der Gruppierung von Symbolen z.b. a(b B)c steht für abc oder abc EBNF - Beispiel Gegeben seien die Regeln (R1) fraction ::= "." digit+ (R2) digit ::= "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" Ableitung von ".14" aus fraction Start: fraction Anwendung von (R1): "." digit+ Expansion +-Operator: "." digit digit Anwendung von (R2): "." "1" digit Anwendung von (R2): "." "1" "4" Vereinfachte Schreibweise: ".14" 5
Übersicht: Die wichtigsten Datentypen in Python Datentypen Zahlen Kollektionen bool, False NoneType None Ganze Zahlen float complex 12.852 1+2j Sequenzen Mengen Abbildungen int Unveränderbaderbar Verän- set dict 123 set( [1,2]) ( A :65, B :66) long str unicode tuple 123456789L Wort u Wort (1, a, [2]) list [1, a, [2]] frozenset frozenset( [1,2]) Datentyp bool Darstellung von Wahrheitswerten Literale False Operationen and, or, not gleich (==), ungleich (!=) Verwendung oft in Bedingungen >>> >>> not False >>> and >>> and False False >>> or >>> or False >>> 12 > 9 >>> 2*3 == 6 >>> 2*3 == 5 False >>> if 2 == 2:... print 'gleich'... gleich 6
Datentyp bool and False False False False False or False False False >>> >>> not False >>> and >>> and False False >>> or >>> or False Datentypen int und long Darstellung ganzer Zahlen Datentyp int Werte repräsentiert durch mind. 32 Bit (neue Prozessoren auch 64 Bit) Wertebereich -2 147 483 648 2 147 483 647 (oder höher bei 64 Bit) Datentyp long beliebig lange Zahlen Syntax: Ziffernfolge mit angehängtem 'l' oder 'L' Ganze Zahlen größer als 2147483647 (bzw. kleiner als -2147483648) werden von Python automatisch als long interpretiert >>> 12 12 >>> 12L 12L >>> type(12) <type 'int'> >>> type(12l) <type 'long'> >>> 2147483647 2147483647 >>> 2147483648 2147483648L >>> type(-2147483648) <type 'int'> >>> type(-2147483648-1) <type 'long'> Die Standardfunktion type() liefert den Datentyp eines Ausdrucks oder einer Variable. 7
Darstellung ganzer Zahlen: Datentypen int und long Darstellung ganzer Zahlen in unterschiedlichen Zahlensystemen Dezimalsystem Literale fangen nie mit 0 an außer 0 selbst z.b. 11, 9 Oktalsystem Literale beginnen mit 0 Ziffern 0 7 z.b. 011 Hexadezimalsystem Literale beginnen mit 0x oder 0X Ziffern 0 9, A F z.b. 0x11, 0xA9 >>> 9 9 >>> 011 9 >>> 09 Traceback ( File "<interactive input>", line 1 09 ^SyntaxError: invalid token >>> 0xA 10 Datentypen int und long EBNF longinteger ::= integer ("l" "L") integer ::= decimalinteger octinteger hexinteger decimalinteger ::= nonzerodigit digit* "0" octinteger ::= "0" octdigit+ hexinteger ::= "0" ("x" "X") hexdigit+ digit ::= "0"..."9" nonzerodigit ::= "1"..."9" octdigit ::= "0"..."7" hexdigit ::= Prof. B. Jung Einführung digit in die Informatik, "a"..."f" WS 2007/08 "A"..."F" TU Bergakademie Freiberg 8
Darstellung rationaler Zahlen: Datentyp float Darstellung rationaler Zahlen "Gleitkommazahlen" Darstellungsformen: als Dezimalbruch (pointfloat) z.b. 3.12, 0.1, 1.0 in Exponentialschreibweise falls Zahl sehr nahe bei Null oder sehr groß z.b. 1.0e-5 (entspricht 0.00001) z.b. 1e2 (entspricht 100) begrenzte Genauigkeit interne Darstellung von Gleitkommazahlen ist begrenzt auf feste Anzahl von Stellen >>> 0.2 0.20000000000000001 >>> 0.6 0.59999999999999998 >>> 3.14 3.1400000000000001 >>> 1e8 100000000.0 >>> 1e+8 100000000.0 >>> 1e-8 1e-008 >>> 0.00000001 1e-008 >>> 1.234567890123456789 1.2345678901234567 Datentypen float EBNF floatnumber ::= pointfloat exponentfloat pointfloat ::= [intpart] fraction intpart "." exponentfloat ::= (intpart pointfloat) exponent intpart ::= fraction ::= digit+ "." digit+ exponent ::= ("e" "E") ["+" "-"] digit+ 9
Datentyp complex Darstellung komplexer Zahlen in Mathematik: Summe aus Real- und Imaginärteil, z.b. 1+2i Buchstabe i bezeichnet Wurzel von -1 in Python: 1 + 2j Realteil kann weggelassen werden, falls 0 EBNF (Imaginärteil) imagnumber ::= (floatnumber intpart) ("j" "J") Beispiele >>> 10 + 0.3j (10+0.29999999999999999j) >>> 20j 20j Operationen auf Zahlen Operator Erläuterung Beispielterm Ergebnis ** Potenz 2**3 8 - Negatives Vorzeichen (unär) -1-1 + Positives Vorzeichen (unär) +1 1 * Multiplikation 2.0*2 4.0 / Division 4.0 / 2.0 2.0 % Rest der ganzzahligen Division (modulo) 5 % 3 2 + Addition (2+2j) + (3+4j) (5 + 6j) - Subtraktion 6.0 3.5 2.5 10
Sequenzen Sequenz Container-Objekt (Kollektion), in dem eine Folge von Objekten zusammengefasst ist Elemente sind von 0 beginnend durchnummeriert s[2] s[5] s index 59 19-1 -111-30 18 18 0 1 2 3 4 5 6 Arten von Sequenzen in Python: Zeichenketten, Tupel, Listen Darstellung von Zeichenketten: Datentyp str Darstellung von Zeichenketten nur ASCII-Zeichen erlaubt Kurze Zeichenketten Definition in einer Programmzeile eingeschlossen in Hochkommata ' oder Anführungszeichen " Lange Zeichenketten können sich über mehrere Programmzeichen erstrecken eingeschlossen in dreifache Hochkommata ''' oder Anführungszeichen """ >>> "eins zwei drei" 'eins zwei drei' >>> 'vier fuenf sechs' 'vier fuenf sechs' >>> type("vier fuenf sechs") <type 'str'> >>> """Die Ewigkeit dauert lange, besonders gegen Ende. (Woody Allen)""" 'Die Ewigkeit dauert lange,\nbesonders gegen Ende. (Woody Allen)' 11
Darstellung von Zeichenketten: Datentyp unicode Darstellung von Zeichenketten mit Unicode-Strings auch nicht-ascii-zeichen erlaubt Darstellung von Literalen wie bei str-zeichenketten, mit vorangestelltem u >>> type(u'unicode-string') <type 'unicode'> >>> print u"\n{cyrillic CAPITAL LETTER ZHE}" Ж Datentyp tuple Tupel fasst mehrere Objekte, u.u. unterschiedlichen Typs, zu einem komplexen Objekt zusammen mathematische Schreibweise: z.b. (1,2,3) Beispiele >>> (1,2,3) (1, 2, 3) >>> ("Ampel", 3, ("rot", "gelb", "gruen") ) ('Ampel', 3, ('rot', 'gelb', 'gruen')) >>> type( (1,2,3) ) <type 'tuple'> >>> () # leerer Tupel () 12
Datentyp list Darstellung von Listen Listen enthalten oft Elemente vom gleichen Typ können aber auch Elemente unterschiedlichen Typs enthalten Inhalt von Listen kann zur Laufzeit verändert werden i.ggs. zu Tupeln, Zeichenketten Darstellung in Python durch eckige Klammern [] Beispiele >>> [1,2,3,4,5] [1, 2, 3, 4, 5] >>> ["Morgen", "Mittag", "Abend"] ['Morgen', 'Mittag', 'Abend'] >>> ["Abend", 2, 1.0, ['a', 'b'] ] ['Abend', 2, 1.0, ['a', 'b']] >>> type([1,2]) <type 'list'> Einige Operationen auf Sequenzen Zugriff auf Elemente mittels Index in eckigen Klammern Konkatenation mittels Operator + Bestimmung der Länge mittels Standardfunktion len() Vervielfältigung mittels Multiplikations-operator * >>> rgb = ("rot", "gruen", "blau") >>> rgb[1] 'gruen' >>> "Informatik"[0] 'I' >>> primzahlen = [2,3,5,7,11,13] >>> primzahlen[5] 13 >>> 'Berg' + 'akademie' 'Bergakademie' >>> [1,2,3]+[4] [1, 2, 3, 4] >>> len( [1,2,3] ) 3 >>> len('bergakademie') 12 >>> 20*'.' '...' >>> ('an','aus') * 3 ('an', 'aus', 'an', 'aus', 'an', 'aus') 13
Datentypen set und frozenset Darstellung von Mengen Menge = ungeordnete Kollektion ohne Duplikate set-objekte sind veränderbar frozenset-objekte sind unveränderbar Operationen Durchschnitt & Vereinigung Differenz Beispiele >>> set( [1,2]) set([1, 2]) >>> set([1,2,1,2]) # Duplikate? set([1, 2]) >>> set([1,2]) & set([2,3]) # Durchschnitt set([2]) Datentyp dict Dictionary Kollektion von Schlüssel-Wert-Paaren d.h. Abbildung von Schlüsseln auf Werte Zugriff auf Elemente der Kollektion über Schlüssel >>> woerterbuch = {"sun":"sonne", "moon":"mond", "star":"stern"} >>> woerterbuch["sun"] 'Sonne' >>> type(woerterbuch) <type 'dict'> 14