35
Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales und rekursives Programmieren P raktische Informatik 1, WS 2004/05, F olien P ython-1, (6. Dezember2004) Seite 1

Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

  • Upload
    dangdan

  • View
    237

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Programmierung in Python

imperativ,

objekt-orientiert

dynamische Typisierung

rapid prototyping

Script-Sprache

Funktionales und rekursives Programmieren

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 1

Page 2: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Programmierung in Python

Datentypen: ganze Zahlen, Gleitkommazahlen (Double), Strings.

Tupel, Listen, Arrays,

vordefinierte Listenfunktionen: map, filter, sort, reverse,...

Fehlerbehandlung zur Laufzeit: Exception-Handling

Objektorientierung: Klassen, Methoden

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 2

Page 3: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Python: Struktur eines imperativen Programms

Python-Programm-File besteht aus:

Deklarationen

Definitionen von Funktionen.

Funktionsdefinitionen: Wesentlich Bestandteile:

Befehle (Anweisungen, Kommandos),

wie Zuweisungen, Sprungbefehle, Ein/Ausgabebefehle

mit Seiteneffekten

Ausdrucke mit Returnwert

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 3

Page 4: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Python als Taschenrechner

Eingabe in den Interpreter: Beispiele

>>> a = 3

>>> b = 4

>>> c = a**2 + b**2

>>> c

25

>>> print math.sqrt(c)

5.0

>>>

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 4

Page 5: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Syntax von wesentlichen Konstrukten

fur weitere Konstrukte sowie Details zur Syntax siehe Tutorials und Handbucher

Zuweisung (Assignment)

Variable = Ausdruck

Auswertung:1. Berechne: Wert des Ausdruckes

dazu: Werte von Variablen im Speicher nachschauenResultat: ein im Speicher liegendes

”Objekt“

2. Zuweisung: Wert zu Namen der Variablen

Ein Objekt kann mehrere Namen besitzen.

Deklaration von Variablen(namen) in einer Funktionsdefinition erfolgt

automatisch

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 5

Page 6: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Zuweisung mit Arithmetische Operatoren

Variable op= Ausdruck

Hierbei kann op einer der vordefinierten Operatoren sein: +,*,-,/, ...

>>> a= 100

>>> a /= 5

>>> a

20

>>> a *= 5

>>> a

100

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 6

Page 7: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Mehrfach-Zuweisung

(scheinbar parallele) Mehrfach-Zuweisung:

x1, . . . xn = e1, . . . , en

wobei xi Variablen und ei Ausdrucke sind

Auswertung des Ausdrucks x1, . . . xn = s1, . . . , sn:

1. Wert aller Ausdrucke si2. Zuweisung der Werte si zu den Variablennamen xi

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 7

Page 8: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

if-then-else-Konstrukt in Python

if Bedingung:Anweisungen wenn Bedingung wahr

else:

Anweisungen, wenn Bedingung falsch

Doppelpunkte”:“statt Schlusselwort then

Einruckung bestimmt die Blockstruktur

weitere Varianten von if-then-else:

ohne else Zweig

mit zusatzlichen Abfragen (elif-Zweigen).

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 8

Page 9: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

while-Schleife zur Iteration

while Bedingung:Schleifenkorper

Der Anweisungsblock des Schleifenkorpers wird solange ausgefuhrt, bis

die Bedingung nicht (mehr) erfullt ist.

Im Schleifenrumpf verwendbar:

break

continue

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 9

Page 10: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Beispiel zu while

>>> a=10

>>> while a > 0:

... print a

... a = a-1

...

10

9

8

7

6

5

4

3

2

1

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 10

Page 11: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Funktions- und Prozedurdefinitionen

def Funktioname(parameter1,parameter2, . . .):Anweisungen

Ruckgabewert mittels: return e

None, falls return-Anweisung weggelassen wurde

Prozeduraufruf: f(s1, . . . , sn) bei n-stelligem f .mit voller Argumentanzahlund Argumenten eingeklammert

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 11

Page 12: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Komplexe Zahlen

Paar von zwei Double-Zahlen: Real- und Imaginar-Teil

>>> a=1.5+0.5j

>>> a.real

1.5

>>> a.imag

0.5

>>> abs(a)

1.5811388300841898

>>> a*a

(2+1.5j)

>>>

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 12

Page 13: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Strings

einfache Strings”Hello world“

und

Unicode Strings:

>>> u’Hello World !’

u’Hello World !’

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 13

Page 14: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Module

Benutzung durch import-Anweisungen und qualifizierte Aufrufe:

>>> import cmath

>>> a=1.5+0.5j

>>> cmath.sin(a)

(1.1248012470579227+0.036860823712804462j)

>>>

Wird noch besprochen

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 14

Page 15: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Beispiel: wurzel ala Python:

def wurzel(x): return wurzeliter(1.0,x)

def wurzeliter(schaetzwert,x):

if gutgenug(schaetzwert,x):

return schaetzwert

else: return wurzeliter(verbessern(schaetzwert, x), x)

def quadrat(x): return x*x

def gutgenug(schaetzwert,x):

return (abs ((quadrat(schaetzwert) - x) / x) < 0.00001)

def verbessern(schaetzwert,x):

return mittelwert(schaetzwert, (x / schaetzwert))

def mittelwert(x,y): return (x + y) / 2.0

>>> wurzel(2.0)

1.4142156862745097

>>>

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 15

Page 16: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Referentielle Transparenz gilt nicht in Python:

count = 0

def f(x):

global count

count = count + x

return count

f (1) == f (1) ergibt 0

Seiteneffekt andert die globale Variable count.

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 16

Page 17: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Flussdiagramm am Beispiel ggt

Der großte gemeinsame Teiler kann durch die Prozedur ggtpy berechnet

werden:

def ggtpy(x,y):

if x <= 0 or y <= 0:

print ’Eingabe in GGT muss positiv sein’

else:

while x != y:

if x > y:

x = x - y

else:

y = y - x

return x

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 17

Page 18: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

ggt: schnellere Version

def ggt(x,y):

if y == 0:

return x

else: return ggt(y, (x % y))

Einige Beispielauswertungen:

>>> ggtpy(1234,4321)

1

>>> ggtpy(1243,3421)

11

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 18

Page 19: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Flussdiagramm zu ggt

x := a; y := b

x = ydrucke x

Stop

Ja nein

x > yJa

x := x-y

nein

y := y-x

Flussdiagramme sind oft von begrenztem Nutzen, da sie zu groß werden

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 19

Page 20: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Wert-Vertauschung ohne Hilfsvariable

Vertauschung von Variablenwerten ohne Hilfsvariable:

>>> a = 1

>>> b = 2

>>> a,b = b,a

>>> a

2

>>> b

1

>>>

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 20

Page 21: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Wert-Vertauschung mit Hilfsvariable

c = a

a = b

b = c

####### Im Python Interpreter:

>>> a = 1

>>> b = 2

>>> c = a

>>> a = b

>>> b = c

>>> a

2

>>> b

1

>>>

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 21

Page 22: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Mehrfachzuweisung ist sequentiell

>>> a,b,a = 1,2,3

>>> a

3

>>>

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 22

Page 23: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Fibonacci in Python, iterativ

def fib(n):

a,b = 0,1

while b < n:

print b,

a,b = b,a+b

>>> fib(1000)

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 23

Page 24: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Boolesche Funktionen

>>> a = 1

>>> not a

False

>>> a = 0

>>> b = 1

>>> a or b

1

>>> a and b

0

>>> del b

>>> b

Traceback (most recent call last):

File "<input>", line 1, in ?

NameError: name ’b’ is not defined

>>> a

1

>>> a or b

1

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 24

Page 25: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Boolesche Funktionen

not, or, and wirken (fast) wie die Booleschen Operatoren.

or, and werten von links nach rechts aus

Ersatzdefinitionen:

def or(x,y):

if x: return x

else: return y

def and(x,y):

if x: return y

else: return x

def not(x):

if x == 0: return 1

else: return 0

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 25

Page 26: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Iterative Prozesse und Iterative Funktionen

def fakultaetlin(n):

a = faktiter(1,1,n)

return a

def faktiter(produkt,zaehler,max):

if zaehler > max:

return produkt

else: return faktiter(zaehler * produkt,zaehler + 1,max)

def faktwhile(n):

produkt = 1

zaehler = 1

max = n

while zaehler <= max:

produkt = (zaehler * produkt)

zaehler = zaehler + 1

return produkt

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 26

Page 27: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Module in Python

Module dienen zur

• Strukturierung / Hierarchisierung

• Kapselung:

• Wiederverwendung

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 27

Page 28: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Module in Python

Jede Python-Programm-File ist ein Modul

Kein eigener Modulkopf mit export-Liste

Modulimport mittels import:

import Modulname

Re-Initialisierung:

reload(Modulname)

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 28

Page 29: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Beispiel in Python

Datei Fib.py, Modul Fib:

def fib(n):

a,b = 0,1

while b < n:

print b,

a,b = b,a+b

X=10 # Diese Zeilen werden beim Import

fib(X) # ausgefuehrt

Beim Import des Moduls Fib

>>> import Fib

1 1 2 3 5 8

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 29

Page 30: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Aufruf von Funktionen aus Modul

Zugriff auf Namen aus importierten Modulen: qualifiziert: Modul-

name.Name

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 30

Page 31: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Zugriff auf importierte Variablen

Nach import Fib:

>>> X

Traceback (most recent call last):

File "<stdin>", line 1, in ?

NameError: name ’X’ is not defined

>>> Fib.X

10

>>> Fib.fib(5)

1 1 2 3

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 31

Page 32: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Lokale Aliase fur Modulnamen

Importier unter Alias-Namen ist moglich:

>>> import Fib as Fibonacci

1 1 2 3 5 8

>>> Fibonacci.fib(5)

1 1 2 3

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 32

Page 33: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Importieren mittels from

Nur selektierte Funktionen importieren:

from Modulname import Definitionsliste from Modulname import *

Beispiel:

>>> from Fib import fib

1 1 2 3 5 8

>>> fib(5)

1 1 2 3

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 33

Page 34: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Importieren mittels from ... *: Beispiel

Vorsicht: Unerwartete Effekte dabei

X = 10;

def printer():

global X:

print X

>>> from Printer import *

>>> X

10

>>> printer()

10

>>> X = 20

>>> printer()

10

>>> X

20

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 34

Page 35: Programmierung in Python - ki.informatik.uni-frankfurt.de · Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales

Datenkapselung in Python

Ist in der Verantwortung des Programmierers.

In Python gibt es kein (echtes) Verstecken von Funktionen.

Man kann auf samtliche definierten Namen des importierten Moduls

qualifiziert zugreifen.

Konvention: Namen, die mit _ beginnen gelten als versteckt.

Praktische Informatik 1, WS 2004/05, Folien Python−1, (6. Dezember2004) Seite 35