9. Vorlesung (PDF 338 KB)

Werbung
Termin 9:
Programmieren im Großen
Grundlagen der Informatik
Wintersemester 2006/07
Prof. Bernhard Jung
Übersicht
‰
Programmiertechniken in Python
„
Import von Modulen
‰
‰
„
import-Anweisung
Ausgewählte Module der Python Standardbibliothek
Ein- und Ausgabe
‰
‰
Lesen und Schreiben in Dateien
Modul pickle
Hauptlernziel
• Techniken für das "Programmieren im Großen" kennen lernen und verstehen:
• Module / Bibliotheken
• Ein- und Ausgabe
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
1
Programmieren im Großen
import - Anweisung
„
mittels import-Anweisung kann man Module (Python-Skripte) in andere
Skripte importieren
‰
„
„
import-Anweisungen o.ä. gibt es in allen gängigen Programmiersprachen
Import von
‰
‰
„
Definitionen von Funktionen (und Klassen) anderer Module werden so im
aktuellen Modul verfügbar
Standardmodulen (ausgeliefert mit Python-Distribution)
selbst geschriebenen Skripten
Formen (Python)
‰
import modul1, modul2, …
‰
from modul import name1, name2, …
„
„
„
‰
importiert nur die benannten Funktionsdefinitionen des Moduls
Zugriff auf Definitionen ohne Erwähnung des Modulnamens
from modul import *
„
„
‰
Zugriff auf Funktionsdefinitionen mittels modul1.definition
importiert alle Definitionen des Moduls
Zugriff auf Definitionen ohne Erwähnung des Modulnamens
Beispiele …
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Programmieren im Großen
import - Anweisung
„
Beispiel: Gewünscht ist Verwendung der Funktionen des PythonSkripts (Moduls) "primzahlen.py" in anderem Python-Skript
"""Funktionen fuer Primzahlen"""
def prim(n):
"Testet, ob n Primzahl ist"
for teiler in range(2,n):
if n % teiler == 0:
return False
return True
primzahlen.py
primzahlen.py
def primListe(n):
u"liefert eine Liste der Primzahlen kleiner gleich n"
if n < 2:
return []
result = []
for zahl in range(2, n+1):
if prim(zahl):
result.append(zahl)
return result Grundlagen der Informatik, WS 2006/07
Prof. B. Jung
2
Programmieren im Großen
import – Anweisung, Beispiel (1)
Import des Moduls
primzahlen
Zugriff mit
Modulname
Zugriff ohne
Modulname
Æ Fehler
>>> import primzahlen
>>> primzahlen.prim(5)
True
>>> primzahlen.prim(8)
False
>>> prim(8)
Traceback (most recent call last):
File "<pyshell#8>", line 1, in -toplevelprim(8)
NameError: name 'prim' is not defined
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Programmieren im Großen
import – Anweisung, Beispiel (2)
Import der Funktion prim
aus Modul primzahlen
Zugriff ohne
Modulname
Æ jetzt ok
>>> from primzahlen import prim
>>> prim(9)
False
>>> l = primListe(8)
Zugriff auf nicht
importierte Funktion
Æ Fehler
Traceback (most recent call last):
File "<pyshell#12>", line 1, in -toplevell = primListe(8)
NameError: name 'primListe' is not defined
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
3
Programmieren im Großen
import – Anweisung, Beispiel (3)
Import aller Funktionen
aus Modul primzahlen
Zugriffe auf beide
Funktionen des Moduls
Prof. B. Jung
>>> from primzahlen import *
>>> prim(9)
False
>>> primListe(13)
[2, 3, 5, 7, 11, 13]
>>>
Grundlagen der Informatik, WS 2006/07
Programmieren im Großen
import – Anweisung
„
Wo sucht Python die zu importierenden Module?
‰
im aktuellen Verzeichnis
„
‰
wo zuletzt eine .py – Datei geöffnet wurde
in den Verzeichnissen der sys.path Variable
„
Inspektion in IDLE: File >> Path Browser
„
Inspektion der sys.path Variable …
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
4
Inspektion und Erweitern von sys.path
>>> import sys
>>> sys.path
['C:\\Python24\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python24.zip', 'C:\\Python24',
'C:\\Python24\\DLLs', 'C:\\Python24\\lib', 'C:\\Python24\\lib\\plat-win',
'C:\\Python24\\lib\\lib-tk', 'C:\\Python24\\lib\\site-packages', 'C:\\Python24\\lib\\sitepackages\\win32', 'C:\\Python24\\lib\\site-packages\\win32\\lib', 'C:\\Python24\\lib\\sitepackages\\Pythonwin', 'C:\\Python24\\lib\\site-packages\\wx-2.6-msw-unicode']
>>> sys.path.append(r'C:\Dokumente und Einstellungen\Jung\Eigene
Dateien\MyPythonPrograms')
>>> sys.path
['C:\\Python24\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python24.zip', 'C:\\Python24',
'C:\\Python24\\DLLs', 'C:\\Python24\\lib', 'C:\\Python24\\lib\\plat-win',
'C:\\Python24\\lib\\lib-tk', 'C:\\Python24\\lib\\site-packages', 'C:\\Python24\\lib\\sitepackages\\win32', 'C:\\Python24\\lib\\site-packages\\win32\\lib', 'C:\\Python24\\lib\\sitepackages\\Pythonwin', 'C:\\Python24\\lib\\site-packages\\wx-2.6-msw-unicode',
'C:\\Dokumente und Einstellungen\\Jung\\Eigene Dateien\\MyPythonPrograms']
>>> import primzahlen
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Standardbibliotheken in Python – welche gibt es?
IDLE: Help > Python Docs
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
5
Standardbibliotheken in Python – welche gibt es?
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Ausgewählte Standardbibliotheken:
Modul math
„
Definition von Konstanten
‰
‰
„
pi
e
Definition mathematischer Funktionen
‰
ceil(x) – x wird aufgerundet
floor(x) – x wird abgerundet
sin(x), cos(x), tan(x) – Sinus, Cosinus, Tangens von x
asin(x), acos(x), atan(x)
degrees(x), radians(x)-Konversion zw. Bogenmaß und Grad
fabs(x) – Betrag von x (als float)
log(x), log10(x) – Logarithmus von x zur Basis 2 bzw. 10
‰
…
‰
‰
‰
‰
‰
‰
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
6
Ausgewählte Standardbibliotheken:
Modul math
>>> from math import *
>>> fabs(-1.1)
1.1000000000000001
>>> pi
3.1415926535897931
>>> cos(pi)
-1.0
>>> sin(pi/2)
1.0
>>> floor(8.5)
8.0
>>> ceil(8.5)
9.0
>>> acos(0.5)
1.0471975511965976
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Ausgewählte Standardbibliotheken:
Modul random
„
Funktionen
‰
‰
‰
‰
‰
‰
randint(a, b) – liefert zufällige Integer-Zahl zw. a und b
(inklusive)
random() – liefert zufällige Realzahl zwischen 0 und 1
uniform(a,b) - liefert zufällige Realzahl zw. a und b (inklusive)
choice(Sammlung) – liefert ein zufälliges Element der
Sammlung (z.B. Liste, Menge)
sample( Sammlung, k) – liefert k Zufallselemente aus
Sammlung
…
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
7
Ausgewählte Standardbibliotheken:
Modul random
>>> from random import *
>>> random()
0.79513661012444292
>>> random()
0.93153037147896656
>>> randint(30,39)
36
>>> sample( ['a', 'b', 'c', 'd', 'e'], 3)
['b', 'a', 'c']
>>> sample( ['a', 'b', 'c', 'd', 'e'], 3)
['c', 'a', 'b']
>>> sample( range(50), 10)
[23, 14, 43, 6, 29, 42, 24, 18, 28, 8]
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Auswahl Python-Bibliotheken für Multimedia
(in Jython andere Multimedia-Bibliotheken)
„
Tkinter
‰
‰
„
graphische Benutzeroberflächen
Bilder
Winsound
‰
Sound auf Windows-Plattform
>>> import winsound
>>> winsound.PlaySound(r'C:\Dokumente und
Einstellungen\Jung\Eigene Dateien\Sounds\techno_mono.wav',
winsound.SND_ASYNC )
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
8
Innovation
„
Nachtsichtassistent für Automobile
‰
‰
‰
Infrarot-Technik für mehr Fahrsicherheit bei Dunkelheit
Nominierung Deutscher Zukunftspreis 2006, www.deutscher-zukunftspreis.de
Team: DaimlerChrysler AG, Robert Bosch AG
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Ein- und Ausgabe: Übersicht
„
Interaktive Ein- und Ausgabe in Python-Interpreter
‰
Ausgabe: print
„
„
‰
auch formatierte Ausgabe (siehe auch Übungen), z.B.
>>> print '%1.3f' % 1.2
1.200
Eingabe: input(), raw_input()
„
Ein- und Ausgabe von / in Dateien
„
Datenbanken
‰
später
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
9
Interaktive Eingabe
„
Eingabe in der Python-Shell
‰
raw_input()
‰
input()
„
„
Achtung: Interaktive Eingabe
funktioniert nicht in
JES-Interpreter
Rückgabewert ist immer vom Typ String
Typ des Rückgabewerts entsprechend Eingabewert
>>> i = input("Geben Sie eine Zahl ein: ")
Geben Sie eine Zahl ein: 10
>>> print type(i), i + 1
<type 'int'> 11
>>> i = raw_input("Geben Sie eine Zahl ein: ")
Geben Sie eine Zahl ein: 10
>>> print type(i), i + 1
<type 'str'>
Traceback (most recent call last):
File "<pyshell#34>", line 1, in -toplevelprint type(i), i + 1
TypeError: cannot concatenate 'str' and 'int' objects
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Interaktive Eingabe - Beispiele
>>> name = raw_input("Geben Sie Ihren Namen ein: ")
Geben Sie Ihren Namen ein: Jung
>>> print name
Jung
>>> type(name)
<type 'str'>
>>> zahl = raw_input("Geben Sie einen Wert ein: ")
Geben Sie einen Wert ein: 10
>>> print zahl
10
>>> type(zahl)
<type 'str'>
>>> zahl = input("Geben Sie einen Wert ein: ")
Geben Sie einen Wert ein: 10
>>> type(zahl)
<type 'int'>
>>> a = input()
[1,2,3]
>>> type(a)
<type 'list'>
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
10
Interaktive Eingabe – Beispiele
Eingabe einer beliebigen Anzahl von Zahlen
def leseWerte():
"""Interaktives Einlesen von Zahlen-Werten.
Abbruch bei Eingabe einer Zahl < 0.
"""
werte = []
zahl = 0 # Dummy-Wert
while (zahl >= 0 ):
zahl = input("Eingabe einer Zahl --> ")
if zahl >= 0:
werte.append(zahl)
return werte
>>> l = leseWerte()
Eingabe einer Zahl -->
Eingabe einer Zahl -->
Eingabe einer Zahl -->
Eingabe einer Zahl -->
Eingabe einer Zahl -->
>>> print l
[1, 1.2, 3, 4]
Prof. B. Jung
1
1.2
3
4
-1
Aber, falls Eingabe keine Zahl: (Behandlung mit
'Exceptions', fortgeschrittenes Thema)
>>> leseWerte()
Eingabe einer ganzen Zahl --> 2
Eingabe einer ganzen Zahl --> zwei
Traceback (most recent call last):
File "<pyshell#17>", line 1, in toplevel-leseWerte()
Grundlagen der Informatik, WS 2006/07
… NameError: name 'zwei' is not defined
Arbeiten mit Dateien
„
Ziel: Verfügbarkeit von Daten auch nach Beendigung eines
Programms
Æ Speichern der Daten in Dateien
„
Prinzipielles Vorgehen beim Arbeiten mit Dateien
1.
2.
3.
Öffnen der Datei
(wiederholtes) Lesen bzw. Schreiben von Daten
Schließen der Datei
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
11
Öffnen und Schließen von Dateien
„
f = open(filename, mode)
‰
Erzeugt ein Objekt f vom Typ file
‰
Mode
„
„
„
„
„
„
„
r – Datei zum Lesen öffnen. Die Datei muss existieren.
w – Datei zum Schreiben öffnen. Existiert eine gleichnamige Datei, wird sie
gelöscht.
a – Schreiben am Ende einer Datei. Die Datei muss existieren.
r+ - Lesen und Schreiben. Die Datei muss existieren.
w+ - Lesen und Schreiben. Existiert eine gleichnamige Datei, wird sie
gelöscht.
a+ - Lesen und Schreiben am Ende einer Datei. Die Datei muss existieren.
f.close()
‰
Anwendung der Methode close() auf das file-Objekt f
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
In Dateien Schreiben
„
Schreiben von Strings
‰
‰
„
f.write(String)
f.writeLines([String1, String2, … ])
Schreiben verschiedener Datentypen mittels print
‰
Ausgabe erscheint in Datei wie bei print im Interpreter
print >> f, data
‰
z.B.
‰
„
„
„
Prof. B. Jung
print >> f, 10
print >> f, "Hallo Welt"
print >> f, "%x" % 15 # Ausgabe als Hexadezimalzahl
Grundlagen der Informatik, WS 2006/07
12
In Dateien Schreiben – Beispiel (write)
def saveList(filename,list):
f = open(filename, 'w') #
for i in list:
f.write( str(i) )
#
f.write( "\n")
#
f.close()
#
Übergabe des Dateinamen
als Raw-String
open file for writing
write each list element as string
start a new line
close the file
Verzeichnis c:\temp muss existieren
>>> saveList(r'c:\temp\list1.txt', [1,'zwei', 3.0])
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
In Dateien Schreiben – Beispiel (print)
def saveList2(filename,list):
f = open(filename, 'w') # open file for writing
for i in list:
print >> f, i
# print each list element to the file
f.close()
# close the file
Übergabe des Dateinamen
als normaler String
Verzeichnis c:\temp muss existieren
>>> saveList2('c:\\temp\\list2.txt', [1,'zwei', 3.0, (1,2) ])
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
13
Aus Dateien Lesen
„
Methoden
‰
‰
‰
‰
f.read() – gibt die ganze Datei zurück (als String)
f.read(n) – liest n Zeichen
f.readline() – liest eine Zeile (d.h. bis '\n')
f.readlines() – gibt eine Liste zurück; jedes Element ist eine
Zeile der gelesenen Datei f
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Aus Dateien Lesen - Beispiel
def readList(filename):
f = open(filename, 'r') # open file for reading
lines = f.readlines()
# read all lines
f.close()
return lines
Datei c:\temp\list2.txt muss existieren
>>> readList2(r'c:\temp\list2.txt')
['1\n', 'zwei\n', '3.0\n', '(1, 2)\n']
>>>
Rückgabe: Liste von Strings
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
14
Ein- und Ausgabe mit dem Modul pickle
„
Problem bisher beim Einlesen
‰
‰
read-Funktionen liefern nur Strings
Einlesen anderer Datentypen erfordert explizite Konvertierung
„
„
„
„
>>> i = int('1')
>>> j = int('2\n')
>>> print i, j
1 2
z.B. mittels int(), float()-Funktionen
für komplexe Datentypen (Listen, Mengen, Objekte) noch komplexer
fehleranfällig!
Modul pickle (etwa: Einpökeln):
‰
‰
ermöglicht Speichern und anschließendes Auslesen beliebiger Objekte
ohne explizite Konvertierung
Funktionen
„
„
‰
dump(data, file)
# schreibe Daten data in Datei file
load(file) # lädt Daten aus Datei; Rückgabe als ein Objekt
Mögl. Nachteil: gespeicherte Dateiinhalte nicht mehr unbedingt verständlich
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
Modul pickle - Beispiel
def saveWithPickle(filename, obj):
f = open(filename, 'w') # open file for writing
from pickle import dump
dump(obj, f)
f.close()
def readWithPickle(filename):
f = open(filename, 'r') # open file for reading
from pickle import load
obj = load(f)
f.close()
return obj
>>> saveWithPickle(r'c:\temp\list3.txt', ['eins', 2, 3.0, {"otto":1}] )
>>> readWithPickle(r'c:\temp\list3.txt')
['eins', 2, 3.0, {'otto': 1}]
>>>
Prof. B. Jung
Grundlagen der Informatik, WS 2006/07
15
Herunterladen