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 [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