Vortragsunterlagen

Werbung
9. Informatiktag 2016
Python 1: Grundlagen
Martin Weissenböck
29. September 2016
Universität Wien
Python-Workshop
●
Bitte Python Version 2.7 installieren:
https://www.python.org/ftp/python/2.7.12/python-2.7.12.msi
Python – Grundlagen (1)
Python ([ˈpaɪθnn], [ˈpaɪθɑn], auf Deutsch auch
[ˈpyːtɔn]) ist eine universelle, üblicherweise
interpretierte höhere Programmiersprache.
Python unterstützt mehrere Programmierparadigmen, z. B. die objektorientierte, die
aspektorientierte und die funktionale
Programmierung.
Ferner bietet es eine dynamische Typisierung.
Wie viele dynamische Sprachen wird Python oft
als Skriptsprache genutzt.
https://de.wikipedia.org/wiki/Python_(Programmiersprache)
Python – Grundlagen (2)
Ihre Entwurfsphilosophie betont
Programmlesbarkeit, außerdem ist Python-Code
im Vergleich mit anderssprachigem Code
teilweise deutlich kürzer.
Zur besseren Lesbarkeit soll auch der Verzicht
auf geschweifte Klammern zur Bildung von
Code-Blöcken dienen, da die Programmstruktur
durch Einrückungen gebildet wird.
Python – Grundlagen (3)
Die Sprache hat ein offenes, gemeinschaftsbasiertes Entwicklungsmodell, das durch die
gemeinnützige Python Software Foundation, die
de facto die Definition der Sprache in der
Referenzumgebung CPython pflegt, gestützt
wird.
Python gilt als einfach zu erlernende Sprache, da
sie über eine klare und übersichtliche Syntax
verfügt. Ferner besitzt sie eine umfangreiche
Standardbibliothek und zahlreiche Pakete im
Python Package Index.
Workshop?
9. Informatiktag 2016
Noch einmal....
Python 1: Grundlagen
Martin Weissenböck
29. September 2016
Universität Wien
APL
LISP
(defun factorial (n)
(loop for i from 1 to n
for fac = 1 then (* fac i)
finally (return fac)))
PL/I
Hello2: proc options(main);
put list ('Hello, world!');
end Hello2;
Welche ist die beste Sprache?
Statt sachlicher Diskussionen...
●
Persönliche Präferenzen
●
Unterschiedliches Vorwissen
●
Fertige Unterlagen...
Welche ist die besten Sprache?
●
●
… für welche Hardware?
Desktop-PC, Mobiltelefon, Raspberry,
µP-Steuerung
… für welche Aufgabe?
Spiel, kommerzielles Programm, Webseite
erstellen
… und …
●
aus pädagogischer Sicht - für den Unterricht?
Ein anderer Weg
Ein anderer Weg
„Wenn Du ein Schiff bauen willst, dann
trommle nicht Männer zusammen um
Holz zu beschaffen, Aufgaben zu
vergeben und die Arbeit einzuteilen,
sondern lehre die Männer die Sehnsucht
nach dem weiten, endlosen Meer.“
Antoine de Saint-Exupery
Die Stadt in der Wüste / Citadelle
Ein anderer Weg
„Wenn Du Interesse für gutes
Programmieren wecken willst, dann
halte keinen Vortrag über Syntax und
Semantik, auch nicht über
Laufzeitverhalten und
Implementierungsdetails, sondern wecke
die Sehnsucht nach einer schönen,
einfachen und leicht zu lernenden
Sprache.“
Martin Weissenböck
9. Informatiktag 2016
Addiere zwei Zahlen
import java.util.*;
public class einausgabe {
public static void main(String[] args) {
Scanner ScIn= new Scanner(System.in);
System.out.print("1. Zahl: ");
int i=ScIn.nextInt();
System.out.print("2. Zahl: ");
int j=ScIn.nextInt();
int s=i+j;
System.out.println(
"Die Summe von "+i+" und "+j+" ist "+s);
}
}
Addiere zwei Zahlen
import java.util.*;
public class einausgabe {
public static void main(String[] args) {
Scanner ScIn= new Scanner(System.in);
System.out.print("1. Zahl: ");
int i=ScIn.nextInt();
System.out.print("2. Zahl: ");
int j=ScIn.nextInt();
int s=i+j;
System.out.println(
"Die Summe von "+i+" und "+j+" ist "+s);
}
}
Oder so?
i = input("1. Zahl: ")
j = input("2. Zahl: ")
print "Die Summe von %d und %d ist %d" % (i, j, i+j)
Böse 7
public class boese7 {
public static void main(String[] args) {
for (int i=1; i<100; i++) {
if (i%10==7) continue;
if (i/10==7) continue;
if (i%7==0) continue;
System.out.print(i+" ");
}
System.out.println();
}
}
Böse 7
public class boese7 {
public static void main(String[] args) {
for (int i=1; i<100; i++) {
if (i%10==7) continue;
if (i/10==7) continue;
if (i%7==0) continue;
System.out.print(i+" ");
}
System.out.println();
}
}
Wie wäre es denn damit?
for i in range(1,100):
if i%10==7: continue
if i/10==7: continue
if i%7==0: continue
print i,
print
Die Antwort ist...
Python als Taschenrechner
Python 2 oder 3?
Gehen wir von einem bekannten Umfeld aus:
vom Taschenrechner
Bitte jetzt Python starten!
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:19:22)
[MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more
information.
Addition, Exponentiation
>>> 1+2
3
>>> 123456789 * 987654321
121932631112635269L
>>> 2**8
256
Große Zahlen
>>> 2**100
1267650600228229401496703205376L
>>> 2**1000
107150860718626732094842504906000181056140481170553360744375038
837035105112493612249319837881569585812759467291755314682518714
528569231404359845775746985748039345677748242309854210746050623
711418779541821530464749835819412673987675591655439460770629145
71196477686542167660429831652624386837205668069376L
Noch größere Zahlen...
>>> 2**10000
199506311688075838488374216268358508382349683188619245485200894985294388302219466319199616840361945978993311294232091242715564
913494137811175937859320963239578557300467937945267652465512660598955205500869181933115425086084606181046855090748660896248880
904898948380092539416332578506215683094739025569123880652250966438744410467598716269854532228685381616943157756296407628368807
607322285350916414761839563814589694638994108409605362678210646214273333940365255656495306031426802349694003359343166514592977
732796657756061725820314079941981796073782456837622800373028854872519008344645814546505579296014148339216157345881392570953797
691192778008269577356744441230620187578363255027283237892707103738028663930314281332414016241956716905740614196543423246388012
488561473052074319922596117962501309928602417083408076059323201612684922884962558413128440615367389514871142563151110897455142
033138202029316409575964647560104058458415660720449628670165150619206310041864222759086709005746064178569519114560550682512504
060075198422618980592371180544447880729063952425483392219827074044731623767608466130337787060398034131971334936546227005631699
374555082417809728109832913144035718775247685098572769379264332215993998768866608083688378380276432827751722736575727447841122
943897338108616074232532919748131201976041782819656974758981645312584341359598627841301281854062834766490886905210475808826158
239619857701224070443305830758690393196046034049731565832086721059133009037528234155397453943977152574552905102123109473216107
534748257407752739863482984983407569379556466386218745694992790165721037013644331358172143117913982229838458473344402709641828
510050729277483645505786345011008529878123894739286995408343461588070439591189858151457791771436196987281314594837832020814749
8217185801138907122825090582681743622057747592141765371568772561490458290499246102863008153558330813010198767585623434353
89554091756234008448875261626435686488335194637203772932400944562469232543504006780272738377553764067268986362410
37491410966718557050759098100246789880178271925953381282421954028302759408448955014676668389697996886241636313376
39390337345580140763674187771105538422573949911018646821969658165148513049422236994771476306915546821768287620036
27772577237813653316111968112807926694818872012986436607685516398605346022978715575179473852463694469230878942659
48217008051120322365496288169035739121368338393591756418733850510970271613915439590991598154654417336311656936031
12224993796999922678173235802311186264457529913575817500819983923628461524988108896023224436217377161808635701546
84840586223297928538756234865564405369626220189635710288123615675125433383032700290976686505685571575055167275188
99194129711337690149916181315171544007728650573189557450920330185304847113818315407324053319038462084036421763703
91155063978900074285367219628090347797453332046836879586858023795221862912008074281955131794815762444829851846150
9704888027274721574688131594750409732115080498190455803416826949787141316063210686391511681774304792596709376L
Division, Datentypen
>>> 7 /
1
>>> 7 /
1.75
>>> 7.0
1.75
>>> 7.0
1.75
>>> 7 %
3
4
4.0
/ 4
/ 4.0
4
Zahlensysteme
>>> 10 * 3
30
>>> 010 * 3
24
>>> 0x10 * 3
48
>>> hex(0x10 * 3)
'0x30'
>>> 0b10 * 3
6
Noch eine Multiplikation
>>> 142857
285714
>>> 142857
428571
>>> 142857
571428
>>> 142857
714285
* 2
* 3
* 4
* 5
Speichern
>>> b = 434782608695652173913
>>> b * 2
869565217391304347826L
>>> b * 3
1304347826086956521739L
>>> b * 4
1739130434782608695652L
>>> b * 5
2173913043478260869565L
Zeichenketten
>>> 'abc'
'abc'
>>> "def"
'def'
>>> 'abc' + "def"
'abcdef'
>>> 'o' * 20
'oooooooooooooooooooo'
Zeichenketten
>>> s = "abcdef"
>>> print s
abcdef
>>> s
'abcdef'
>>> s[0]
'a'
>>> s[5]
'f'
Fehlermeldung
>>> s[6]
Traceback (most recent call last):
File "<pyshell#53>", line 1, in <module>
s[6]
IndexError: string index out of range
Indizes von hinten gerechnet
>>> s[-1]
'f'
>>> s[-2]
'e'
Slices
>>> s[0:2]
'ab'
>>> s[2:99]
'cdef'
>>> s[2:]
'cdef'
Slices
>>> s[-3:-1]
'de'
>>> s[-3:0]
''
>>> s[-3:]
'def'
>>> s[:]
'abcdef'
Schrittweite
>>> s[::2]
'ace'
>>> s[::1]
'abcdef'
>>> s[::-1]
'fedcba'
Tuples
>>> a = (2,3,5,7,11,13)
>>> a[1]
3
>>> a[:4]
(2, 3, 5, 7)
>>> a[:-2]
(2, 3, 5, 7)
>>> a[-2:]
(11, 13)
range
>>>
[0,
>>>
[1,
>>>
[1,
>>>
[]
>>>
[6,
range(5)
1, 2, 3, 4]
range(1,6)
2, 3, 4, 5]
range(1,6,2)
3, 5]
range(1,6,-2)
range(6,1,-2)
4, 2]
for-Schleife
>>> for x in a:
print x
2
3
5
7
11
13
for-Schleife
>>> for x in s:
print x
a
b
c
d
e
f
for-Schleife
>>> for x in range(1,12):
print "%022d" % (434782608695652173913*x)
0434782608695652173913
0869565217391304347826
1304347826086956521739
1739130434782608695652
2173913043478260869565
2608695652173913043478
3043478260869565217391
3478260869565217391304
3913043478260869565217
4347826086956521739130
4782608695652173913043
Comprehension
>>> [142857*x for x in range(1,7)]
[142857, 285714, 428571, 571428, 714285, 857142]
Bedingungen
●
Keine Klammern um die logischen Ausdrücke
●
Strukturen durch Einrücken
●
Logische Konstanten: True, False
>>> if 2<3:
print "ja"
else:
print "nein"
Bedingung
>>> d=3
>>> e=4
>>> if d<e:
f=77
else:
f=88
>>> print f
77
>>>
>>> f = 77 if d<e else 88
>>> f
77
Funktionen
>>> def f(x):
return 142857*x
>>> for i in range(1,7): print f(i)
142857
285714
428571
571428
714285
857142
Römische Zahlen (1)
def arab2roem(a):
tab = [(1000,'M'), (500,'D'), (100,'C'),
(50,'L'), (10,'X'), (5,'V'), (1,'I')]
res = ""
for key,val in tab:
while a>=key:
a-=key
res+=val
return res
print arab2roem(1977)
Römische Zahlen (2)
def arab2roem(a):
tab = {1000: 'M', 500: 'D', 100:'C', 50:'L',
10:'X', 5:'V', 1:'I'}
res = ""
for key in sorted(tab, reverse=True):
while a>=key:
a-=key
res+=tab[key]
return res
Römische Zahlen (3)
def arab2roem(a):
tab = [(1000,'M'),
(900,'CM'), (500,'D'), (400,'CD'),(100,'C'),
(90,'XL'), (50,'L'), (40,'XL'), (10,'X'),
(9, 'IX'), (5,'V'), (4, 'IV'), (1,'I')]
res = ""
for key,val in tab:
while a>=key:
a-=key
res+=val
return res
Große Zahlen
Große römische Zahlen
def arab2roem(a):
tab = [(1000000,'CCCCIↃↃↃↃ'), (500000,'IↃↃↃↃ'),
(100000,'CCCIↃↃↃ'), (50000,'IↃↃↃ'),
(10000,'CCIↃↃ'), (5000,'IↃↃ'), (1000,'CIↃ'),
(500,'IↃ'), (100,'C'), (50,'L'),
(10,'X'), (5,'V'), (1,'I')]
res = ""
for key,val in tab:
while a>=key:
a-=key
res+=val
return res
Was gibt es noch in Python?
●
Komplexe Zahlen
c = 3 + 4j
●
dict: assoziative Arrays
●
if ... elif ...elif ... else
●
Exceptions
try ... except ... else ... finally
●
lambda-Funktionen
lambda a,b: a+b
Funktionen
●
●
Argumente mit Namen:
f(a=3, b=4) oder f(b=4, a=3)
Parameter mit Default-Werten
def f(a=3):...
●
Variable Anzahl von Argumenten:
def g(**a):....
Aufrufe: g(x=3) oder g(y=4,
z=5)
Klassen
class MyClass(object):
z = 2
def __init__(self, a, b):
self.x = a
self.y = b
def add(self):
return self.x + self.y + self.z
myinstance = MyClass(3, 4)
print myinstance.add()
Noch mehr...
●
●
Mehrfachvererbung von Klassen
Operatoren
Python-Operatoren können in Klassen neue
Bedeutungen bekommen
Bibliotheken
●
Umfangreiche Programmbibliotheken
import xx
from lib import xx
●
Besonders nett: 3D-Bibliotheken
●
File-Bearbeitung
Am Beispiel 9. Schulstufe:
Der Schüler muss...
●
●
eine meist sprachlich (und nicht
mathematisch-technisch) formulierte
Aufgabenstellungen verstehen (laut PISAStudie eine Schwäche)
daraus einen dynamischen Ablauf (eine
Algorithmus) erzeugen können, nachdem er
jahrelang auf geschlossene mathematische
Lösungen hin trainiert wurde - er muss
algorithmisch denken lernen
... und ...
●
die Syntax der Programmiersprache lernen
●
die Semantik der Programmiersprache lernen
●
●
●
mehr oder weniger viele „notwendige“
Programmbausteine akzeptieren, die zu einem
bestimmten Zeitpunkt noch gar nicht erklärt
werden können
bei JavaScript zwischen Programmiersprache
und HTML-Code unterscheiden lernen
das Testen eines Programms lernen
... und ...
●
●
●
die Bedienung des Editors lernen (ist wohl das
geringste Problem)
Aufgaben als Projekte (die mehrere Files
enthalten können) verstehen lernen
mit der Entwicklungsumgebung umgehen
lernen
Und das alles im Alter von 14 bis 15 Jahren, in
dem die Fähigkeit zum abstrakten Denken noch
nicht besonders stark ausgeprägt sind.
Zusammenfassung
●
●
Die Programmiersprache für den Unterricht
sorgfältig wählen
Unterricht darf Spaß machen
Weigl: Ironisches schreibt man in Österreich kursiv
●
Diplomarbeit „Die Eignung von Python für
Einführungskurse in das Programmieren im
Vergleich zu anderen Programmiersprachen“
http://www.ub.tuwien.ac.at/dipl/2015/AC12689747.pdf
Werbung in eigener Sache
●
●
Die Initiative „SCHUL.InfoSMS“
(http://www.infosms.org) stellt Applikationen
für die Verbesserung der der Kommunikation
zwischen Eltern und Schule zur Verfügung.
Das gesamte Projekt ist in Python
geschrieben.
Interessenten werden gebeten, sich unter
offi[email protected] zu melden!
Danke für Ihr Interesse
In Kürze beginnt der zweite Teil zum Thema
Anwendungen von Python
9. Informatiktag 2016
Python 2: Erweiterung
Anwendung web2py
Martin Weissenböck
29. September 2016
Universität Wien
Web2Py – das Framework!
●
●
Bitte laden und in Verzeichnis entpacken – fertig!
Vorschlag: c:\web2py
http://www.web2py.com/examples/static/web2py_win.zip
Ein komplettes Framework („Batteries included“)
zum Erstellen einer Website.
Umsetzung des Prinzips
Trennung in „Model – View - Controller“
Let's start!
●
cd /web2py
●
web2py aufrufen
●
Choose Password:
123 reicht bei lokaler Installation
●
DIESE APP > DESIGN
●
Administrator Passwort: 123
●
<Anmelden>
Neue einfache Anwendung
●
Name der Anwendung: DVD
●
<Erstellen>
●
Modelle: Beschreibung der Datenbanktabellen
Weitere Programme, die bei jedem Aufruf
abgearbeitet werden
●
Controllers: Programm-Logik, Steuerung
●
Ansichten: Wie sollen die Seiten aussehen?
Datenbank-Tabelle
●
●
●
●
●
Modelle: db.py <Bearbeiten>
Zusätzliche Abstraktionsebene für Datenbank
Am Ende einfügen.
db.define_table('dvd',
Field('titel'), Field('bewertung', 'integer'))
„Speichere Datei“ nicht vergessen!
<Bearbeiten> <Datenbankadministration>
db.dvd <NEUER EINTRAG>
Ein paar Titel eintragen
Tabelle ansehen
●
<Bearbeiten><Datenbankadministration>
db.dvd
Controller schreiben
●
<Bearbeiten> default.py <Bearbeiten>
●
Nach dem Kommentar einfügen:
def zeigen():
alle = db(db.dvd.id>0).select()
return dict(alle=alle)
●
„Speichere Datei“ nicht vergessen!
Ansicht erzeugen
●
Ansichten <Erstellen>
Erzeuge Datei mit Dateinamen:
●
default/zeigen <Erstellen>
●
<Bearbeiten> default/zeigen.html
●
Ändern auf
{{extend 'layout.html'}}
<h1> DVD-Liste </h1>
{{=alle}}
●
„Speichere Datei“ nicht vergessen!
●
<Versuche view>
DVD-Liste erweitern
●
<DIESE APP> <CONTROLLER>
●
Neue Funktion:
def dvdlisteerweitern():
form = SQLFORM(db.dvd)
if form.process().accepted:
response.flash = 'form accepted'
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill out the form'
return dict(form=form)
●
„Speichere Datei“ nicht vergessen!
Ansicht hinzufügen
●
<Erstellen> Erzeuge Datei mit Dateinamen
●
default/dvdlisteerweitern
{{extend 'layout.html'}}
<h1>DVD Liste erweitern</h1>
{{=form}}
●
„Speichere Datei“ nicht vergessen!
DVD bearbeiten
●
Und in der Ansicht
default/dvdbearbeiten.html anlegen:
{{extend 'layout.html'}}
<h1>DVD bearbeiten</h1>
{{=grid}}
●
Neue Funktion im Controller hinzufügen:
def dvdbearbeiten():
grid = SQLFORM.grid(db.auth_user, user_signature=False)
return dict(form=form)
DVD bearbeiten
Mögliche Erweiterungen
●
Personen anlegen
●
Verleihliste
●
Bewertungsliste
Web2Py-Projekte
●
●
●
●
Web2Py wurde zwar für Schulungszwecke
entwickelt, erlaubt aber auch sehr große und
anspruchsvolle Applikationen
Dutzende Tabellen mit vielen Tabellenspalten
Hunderte von Funktionen in vielen
„Controllern“
Viele Applikationen, die gemeinsam ein Paket
bilden
Eigene Erfahrungen
●
Initiative „SCHUL.InfoSMS“
(http://www.infosms.org):
Verbesserung der Kommunikation zwischen
Schule und Eltern mit elektronischen Mitteln
●
●
Komplett in Web2Py und somit in Python
realisiert
Interessenten an der Initiative sind sehr
willkommen: [email protected]
Wie geht es weiter?
●
Applikation auf einen öffentlich zugänglichen
Server stellen:
●
●
●
Eigener Server – Installationsanleitungen
vorhanden
Gratisserver, vor allem zum Testen
Handbuch lesen:
●
●
http://web2py.com/book (6. Auflage)
https://dl.dropboxusercontent.com/u/18065445/we
b2py/web2py_manual_5th.pdf (5. Auflage)
Danke für Ihr Interesse!
Viel Erfolg beim Einsatz von
Python und Web2Py
Martin Weissenböck
Herunterladen