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 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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. Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Bsp: Datentypen und Operationen (am Beispiel Python) Eingabe-Prompt Ausgabe: Wert des Ausdrucks Eingabe eines Ausdrucks >>> 1 + 2 3 >>> '1' + '2' '12' >>> >>> 5 / 2 2 >>> 5.0 / 2 2.5 Prof. B. Jung Additionvon vonZahlen Zahlen Addition Konkatenationvon vonZeichenketten Zeichenketten Konkatenation Divisionvon vonInteger-Zahlen Integer-Zahlen Division Divisionvon vonGleitkommazahlen Gleitkommazahlen Division Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 2 Wdh: Einfache Datentypen (am Beispiel Python; ähnlich in vielen anderen Programmiersprachen) Ganze Zahlen ("integer"): Reelle Zahlen ("float"): 0.1, 3.14, 10.0, -33.33, ... auch in Exponentialschreibweise: 1.0e-5, 0.5e10, … Zeichenketten ("string"): 1, 2, 5, -100, ... auch im Hexadezimalsystem spezifizierbar: 0xA1, 0xFF, 0x3B, … "TU Bergakademie Freiberg", ... 'Grundlagen der Informatik' Listen: [1,2,3], ["eins", "zwei", drei"], ... Boolean: true, false ... Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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" Prof. B. Jung d.h. eine Ziffer (digit) ist das Zeichen 0, oder das Zeichen 1, oder das Zeichen 2, usw. Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 4 EBNF - Operatoren Wiederholung + Pluszeichen + bezeichnet das mehrfache Vorkommen eines Symbols Sternoperator * Der Stern * bedeutet, dass ein Symbol n-mal, n≥0, vorkommt z.B. ba* steht für b, ba, baa, baaa, baaaa, … Option [] z.B. ba+ steht für ba, baa, baaa, baaaa, … 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 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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" Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 5 Übersicht: Die wichtigsten Datentypen in Python Datentypen Kollektionen Zahlen Ganze Zahlen float complex 12.852 1+2j Unveränderbar int 123 long 123456789L Sequenzen NoneType True, False None Abbildungen Mengen Veränderbar str unicode tuple ‘Wort‘ u‘Wort‘ (1, ‘a‘, [2]) Prof. B. Jung bool list [1, ‘a‘, [2]] Einführung in die Informatik, WS 2007/08 set dict set( [1,2]) (‘A‘:65, ‘B‘:66) frozenset frozenset( [1,2]) TU Bergakademie Freiberg Datentyp bool Darstellung von Wahrheitswerten Literale Operationen True False and, or, not gleich (==), ungleich (!=) Verwendung oft in Bedingungen Prof. B. Jung >>> True True >>> not True False >>> True and True True >>> True and False False >>> True or True True >>> True or False True >>> 12 > 9 True >>> 2*3 == 6 True >>> 2*3 == 5 False >>> if 2 == 2: ... print 'gleich' ... gleich Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 6 Datentyp bool and False True or False True Prof. B. Jung False False False True False True False False True >>> True True >>> not True False >>> True and True True >>> True and False False True True True >>> True or True True >>> True or False True Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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 Prof. B. Jung >>> 12 12 >>> 12L 12L Die Standardfunktion type() liefert den Datentyp eines Ausdrucks oder einer Variable. >>> type(12) <type 'int'> >>> type(12l) <type 'long'> >>> 2147483647 2147483647 >>> 2147483648 2147483648L >>> type(-2147483648) <type 'int'> >>> type(-2147483648-1) <type 'long'> Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 7 Darstellung ganzer Zahlen: Datentypen int und long Darstellung ganzer Zahlen in unterschiedlichen Zahlensystemen Dezimalsystem Literale fangen nie mit 0 an >>> 011 9 außer 0 selbst z.B. 11, 9 >>> 09 Traceback ( File "<interactive input>", line 1 09 ^SyntaxError: invalid token Oktalsystem >>> 9 9 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 Prof. B. Jung >>> 0xA 10 Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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 digit | "a"..."f" | "A"..."F" TU Bergakademie Freiberg Einführung in die Informatik, WS 2007/08 8 Darstellung rationaler Zahlen: Datentyp float Darstellung rationaler Zahlen Darstellungsformen: als Dezimalbruch (pointfloat) z.B. 3.12, 0.1, 1.0 in Exponentialschreibweise >>> 0.2 0.20000000000000001 >>> 0.6 0.59999999999999998 >>> 3.14 3.1400000000000001 "Gleitkommazahlen" 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 Prof. B. Jung >>> 1e8 100000000.0 >>> 1e+8 100000000.0 >>> 1e-8 1e-008 >>> 0.00000001 1e-008 >>> 1.234567890123456789 1.2345678901234567 Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Datentypen float EBNF floatnumber ::= pointfloat | exponentfloat pointfloat ::= [intpart] fraction | intpart "." exponentfloat ::= (intpart | pointfloat) exponent intpart ::= digit+ fraction ::= "." digit+ exponent ::= ("e" | "E") ["+" | "-"] digit+ Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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 imagnumber EBNF (Imaginärteil) Beispiele Prof. B. Jung ::= (floatnumber | intpart) ("j" | "J") >>> 10 + 0.3j (10+0.29999999999999999j) >>> 20j 20j Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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 Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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 59 19 -1 -111 -30 18 18 index 0 1 2 3 4 5 6 Arten von Sequenzen in Python: Zeichenketten, Tupel, Listen Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Darstellung von Zeichenketten: Datentyp str Darstellung von Zeichenketten Kurze Zeichenketten nur ASCII-Zeichen erlaubt Definition in einer Programmzeile eingeschlossen in Hochkommata ' oder Anführungszeichen " Lange Zeichenketten >>> "eins zwei drei" 'eins zwei drei' >>> 'vier fuenf sechs' 'vier fuenf sechs' >>> type("vier fuenf sechs") <type 'str'> können sich über mehrere Programmzeichen erstrecken eingeschlossen in dreifache Hochkommata ''' oder Anführungszeichen """ >>> """Die Ewigkeit dauert lange, besonders gegen Ende. (Woody Allen)""" 'Die Ewigkeit dauert lange,\nbesonders gegen Ende. (Woody Allen)' Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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}" Ж Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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'> >>> () () Prof. B. Jung # leerer Tupel Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 12 Datentyp list Darstellung von Listen Listen enthalten oft Elemente vom gleichen Typ Inhalt von Listen kann zur Laufzeit verändert werden Darstellung in Python durch eckige Klammern [] können aber auch Elemente unterschiedlichen Typs enthalten i.Ggs. zu Tupeln, Zeichenketten 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'> Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Einige Operationen auf Sequenzen Zugriff auf Elemente Konkatenation >>> 'Berg' + 'akademie' 'Bergakademie' >>> [1,2,3]+[4] [1, 2, 3, 4] mittels Operator + Bestimmung der Länge mittels Index in eckigen Klammern mittels Standardfunktion len() Vervielfältigung mittels Multiplikations-operator * Prof. B. Jung >>> rgb = ("rot", "gruen", "blau") >>> rgb[1] 'gruen' >>> "Informatik"[0] 'I' >>> primzahlen = [2,3,5,7,11,13] >>> primzahlen[5] 13 >>> len( [1,2,3] ) 3 >>> len('Bergakademie') 12 >>> 20*'.' '....................' >>> ('an','aus') * 3 ('an', 'aus', 'an', 'aus', 'an', 'aus') Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 13 Datentypen set und frozenset Darstellung von Mengen Operationen Menge = ungeordnete Kollektion ohne Duplikate set-Objekte sind veränderbar frozenset-Objekte sind unveränderbar Durchschnitt & Vereinigung | Differenz – >>> set( [1,2]) set([1, 2]) Beispiele >>> set([1,2,1,2]) # Duplikate? set([1, 2]) >>> set([1,2]) & set([2,3]) # Durchschnitt set([2]) Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 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'> Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 14