.. include:: markup.rst ****************** Einstieg in Python ****************** .. An example of using customized :mark:`interpreted text` An example of using standard `interpreted text` Installation ============ :mark:`Python ist ein Anwendungsprogramm` welches frei für alle gängigen Plattformen verfügbar ist. Laden Sie für die Übung eine :mark:`Python Distribution` für Ihr Betriebssysteme aus dem Internet herunter. Wir empfehlen Anaconda_ von Continuum Analytics (Python Version 3.X NICHT 2.X!). Dieses Paket gibt es gratis zum Download für alle gängigen Betriebssysteme. .. important:: Installieren Sie für die Übung eine :mark:`Python Distribution` für Ihr Betriebssystem. Wir empfehlen Anaconda_ von Continuum Analytics (Python Version 3.X NICHT 2.X!). Dieses Paket gibt es gratis zum Download für alle gängigen Betriebssysteme. Idealerweise nehmen Sie Ihren Laptop oder ihr Tablet zur Übung mit. Notfalls läuft Python auch auf dem Table oder Smartphone. Achten Sie bitte bei der Installation darauf, dass der Pfad, in dem Sie Anaconda installieren :mark:`keine Leerzeichen oder Umlaute` enthält! **Windows** Nach erfolgreicher Installation sollten Sie Anaconda_ im Startmenü sehen (siehe Abbildung `Windows-Startmenü`_). .. _`Windows-Startmenü`: .. figure:: images/win10-start.png :scale: 70 % :align: center Windows-Startmenü **Linux** Unter Linux ist Python im Allgemeinen bereits :mark:`automatisch installiert`. Eventuell müssen einige :mark:`Zusatzpakete` dazu installiert werden. **MacOS** Verwenden Sie wie unter Windows Anaconda_. Python Shell ~~~~~~~~~~~~ Es gibt mehrere Möglichkeiten Python_ zu verwenden. Die einfachste Möglichkeit ist eine Eingabeaufforderung auch Shell oder Terminal oder Konsole genannt. Diese wird in Windows durch Klicken von :mark:`Anaconda Prompt` (oder Anaconda Powershell Prompt) im `Windows-Startmenü`_ gestartet (siehe Abbildung `Anaconda Powershell Prompt`_). Diese wird in Windows durch Klicken von :mark:`Windows > Anaconda > Anaconda Powershell Prompt` im `Windows-Startmenü`_ (siehe oben) gestartet. Unter Linux-Systemen öffnet man einfach ein :mark:`Terminal`. .. _`Anaconda Powershell Prompt`: .. figure:: images/win10-shell.png :scale: 50 % :align: center Anaconda Prompt (unter Windows) In beiden Fällen startet man Python durch Eingabe des Befehls: :: > python Danach befindet man sich in der Python Shell (gekennzeichnet durch ``>>>``). Jetzt kann man :mark:`Befehle einfach eintippen` und mit ``ENTER`` bestätigen um diese auszuführen: :: >>> print("Hello World") Hello World Wann immer wir zukünftig in den Beispielen einen Code Block mit ``>>>`` beginnen, wird die Python Shell verwendet. .. _Anaconda: https://www.anaconda.com/download/ .. _Python: http://www.python.org/ In der `Anaconda Powershell Prompt`_ kann man auch direkt Python_ Programmtext starten welcher zuvor in einem File gespeichert wurde (z.B. hello.py). Ein solches File wird in Python_ :mark:`Skript File genannt` (genaueres später): :: > python hello.py Alle Befehle in diesem File werden nacheinander ausgeführt. Dies funktioniert nur wenn Sie sich im selben Verzeichnis wie das Skript ``hello.py`` befinden. Dies kann mit dem ``dir`` (=list directory) Befehl in der Anaconda Powershell Prompt kontrolliert werden. Ansonsten muss man vorab mittels ``cd`` (= change directory) – Befehl in der Anaconda Powershell Prompt ins entsprechende Verzeichis wechseln z.B. :: > cd C:\Users\Student\Documents\MeinHelloVerzeichnis > python hello.py Python IDE - Spyder ~~~~~~~~~~~~~~~~~~~ Wesentlich komfortabler ist jedoch ein IDE (:mark:`integrated development enviroment`). Dieses vereinigt ein Anaconda Prompt, Python_ Skript Editor, etc. Anaconda_ stellt das IDE Spyder_ zur Verfügung um Python zu verwenden. Spyder_ startet man über das `Windows-Startmenü`_ oder ähnliches. Danach wird wie in der Abbildung `Python IDE Spyder`_ gezeigt, ein Graphisches User Interface (GUI) angezeigt. .. _`Python IDE Spyder`: .. figure:: images/win10-spyder.png :scale: 50 % :align: center Python IDE Spyder (unter Windows 10) .. .._Spyder: http://pythonhosted.org/spyder/ .. _Spyder: https://www.spyder-ide.org .. hint:: Lernen Sie mit Spyder umzugehen da dieses IDE bei den Übungen verwendet wird! Diese GUI enthält im Wesentlichen 3 Bereiche: * links: einen Editor zum Erzeugen von Python_ Skript Files (z.B. hello.py) * rechts oben: den Inhalt von Variablen (Genaueres später) * rechts unten: die IPython-Konsole (analog zu `Anaconda Powershell Prompt`_, jedoch mit ``In [2]:`` und ``OUT [2]:`` Python Skript Files werden mittels :mark:`Menu-Run` (grünes Dreieck) gestartet. Die Ausgabe des Programmes erfolgt rechts unten. .. hint:: Probieren Sie es einfach aus! * Tippen Sie ``print("Hello World")`` in die `Python IDE Spyder`_ IPython-Konsole ein, bestätigen sie mit ``ENTER``. * Erzeugen Sie ein File :mark:`hello.py` mit ``print("Hello World")`` als Inhalt und starten Sie die Skriptausführung mit Menu-Run. Wird im Folgenden ein Python Skript File verwendet, schreiben wir kein ``>>>`` sondern einfach: Beispiel: :: a=5 b=a*a print ("Hello World, b=" ,b) Ausgabe: :: Hello World, b= 25 .. note:: Mit dem Befehl ``print(..)`` wird Information in der ausgegeben. Unter Python 2 sind keine Klammern erforderlich (``print ".."``). Python 2 oder 3? ~~~~~~~~~~~~~~~~ Es gibt derzeit :mark:`zwei Python Versionen`. Diese unterscheiden sich zwar, Standardanwender werden den Unterschied aber kaum merken. Das Problem beim Umstieg: * :mark:`Python 2` ist weit verbreitet, jedoch gibt es zukünftige keine Weiterentwicklung. * :mark:`Python 3` ist semantisch korrekter, bietet neue Features und wird aktiv weiterentwickelt. Empfehlung: * Neue Entwicklungen: ausschließlich auf Python 3. * Alte Entwicklungen: mit dem Skript ``2to3`` von Python 2 auf 3 portieren In dieser LVA verwenden wir ausschließlich Python 3. Python Hilfe ============ .. note:: Alle Python-Skripts dieses Skriptums finden Sie unter https://ilsb.git-pages.tuwien.ac.at/nbm/gdp2022/src/ zum Download. .. https://www.ilsb.tuwien.ac.at/~pahr/src/ Es gibt eine Vielzahl an Python Büchern, Dokumentationen, Tutorials, Onlinekursen, etc. Um die Auswahl zu erleichtern hier einige Tipps: **Bücher** * A. Bell: Get Programming: Learn to code with Python, 1. Auflage, Manning Publications, 2018, https://www.manning.com/books/get-programming#toc Online Buch. * :mark:`Python 3: Lernen und professionell anwenden`, Reihe: mitp Professional, von Michael Weigend. Sehr gutes, leicht lesbares Buch, umfangreich. **Online Tutorials / Bücher** * Der Klassiker ist sicherlich das `Python Tutorial`_. Dieses gibt es in vielen Sprachen (`Python Tutorial Deutsch`_). * Ein guter Kurs findet sich unter `Python Kurs`_. * Wer sich schnell einen Überblick verschaffen möchte, findet das unter `After Hours Programming`_ (auf Englisch). **Sonstiges** * Auf der WWW Seite `Python for Progammers`_ gibt es Links zu Python Material für alle Geschmäcker. .. _`Python Kurs`: http://www.python-kurs.eu/python3_kurs.php .. _`Python for Progammers`: https://wiki.python.org/moin/BeginnersGuide/Programmers .. _`After Hours Programming`: http://www.afterhoursprogramming.com/tutorial/Python/Introduction/ .. _`Python Das umfassende Handbuch`: https://www.rheinwerk-verlag.de/python-3_3123/ .. _`Python Tutorial`: https://docs.python.org/3/tutorial/ .. _`Python Tutorial Deutsch`: http://py-tutorial-de.readthedocs.org/de/python-3.3/ Python als Taschenrechner ========================= Die Python (genauer die IPython-Konsole im `Python IDE Spyder`_ oder auch die `Anaconda Powershell Prompt`_) kann wie ein Taschenrechner eingesetzt werden. Eine ausführliche Beschreibung findet sich im `Python Tutorial`_. Starten Sie das `Python IDE Spyder`_ oder `Anaconda Powershell Prompt`_. Im folgenden verwenden wir in `Python IDE Spyder`_ die IPython-Konsole). Tippen Sie einfach die folgenden Befehle ein und bestätigen Sie die Eingabe mit ``ENTER``. Vorab Anmerkungen zu den Beispielen. Die Syntax Ausdrücke sind einfach: * Die Operatoren ``+``, ``-``, ``*`` und ``/`` wirken wie gewohnt. * Die Hochzahl startet mit ``**``. Z.B. Wurzel ``**0.5``. * Klammern können zur Gruppierung benutzt werden. * Das Symbol ``#`` erzeugt Kommentare. * Mit bestätigt man die Eingabe. * Ein ``...`` deutet darauf hin, dass eine weitere Eingabe mit Einrückung erwartet wird. Ein- und Ausgaben in der IPython-Konsole sehen wie folgt aus: :: In [2]: 2 + 2 Out[2]: 4 In [3]: # Dies ist ein Kommentar In [4]: 2 + 2 # und dies ist ein Kommentar in derselben Zeile wie Code Out[4]: 4 In [5]: (50 - 5 * 6) / 4 Out[5]: 5.0 In [6]: 8 / 5 # Achtung: Brüche gehen in Python 2 verloren, nicht in 3 Out[6]: 1.6 In [7]: 8 // 5 # Ganzzahldivision Out[7]: 1 In [8]: 9**0.5 # Wurzel Out[8]: 3.0 Das Gleichheitszeichen (``'='``) wird benutzt um einer Variablen einen Wert zuzuweisen. :: In [10]: width = 20 In [11]: height = 5 * 9 In [12]: width * height Out[12]: 900 Variablen müssen "definiert" sein, bevor sie benutzt werden können, sonst tritt ein Fehler auf. :: In [13]: # Versuch eine undefinierte Variable abzurufen In [14]: n Traceback (most recent call last): File "", line 1, in n NameError: name 'n' is not defined .. Werden Operanden verschiedener Zahlentypen durch einen Operator verknüpft, dann werden ganzzahlige Operanden in Fließkommazahlen umgewandelt:: >>> 3 * 3.75 / 1.5 7.5 >>> 7.0 / 2 3.5 Python Skripte ============== Bislang haben wir Anweisungen (Befehle) in der :mark:`IPython-Konsole` getestet. Ein vollständiges Python Programm nennt man :mark:`Skript`. Was ist das? * Eine Textdatei mit der Endung :mark:`.py` welche * :mark:`alle Anweisungen` eines Programms enthält und * mittels IDE (z.B. Spyder_) erstellt bzw. getestet werden kann. Unser erstes Python Skript (``kreis.py``): .. hint:: Alle Beispielfiles finden Sie unter https://ilsb.git-pages.tuwien.ac.at/nbm/gdp2022/src/ Laden Sie alle Skripte herunter und öffnen Sie das jeweilige Skript mit Spyder. .. hint:: Mein Tipp: Zuerst versuchen die Beispiele selbst zu lösen, danach die richtige Lösung durchsehen! .. literalinclude:: src/kreis.py Wird dieses Skript ausgeführt, erhält man folgende Ausgabe: :: In [16]: runfile('C:/Users/pahr/tuw/01_Lehre/Skripten/GdP/src/kreis.py', wdir='C:/Users/pahr/tuw/01_Lehre/Skripten/GdP/src') File : kreis.py Author : D.H. Pahr Date : 24.06.2020 Mein erstes Python Skript zur Berechnung von Umfang und Flaeche eines Kreises. Radius = 1.5 Umfang = 9.424769999999999 Flaeche = 7.0685775 Bemerkungen dazu: * Die erste Zeile gibt das :mark:`Coding` an. Möchte man Umlaute darstellen, müsste man dieses ändern. Diese Zeile kann man auch löschen. Tipp: Verwenden Sie keine Akzente oder Sonderzeichen - nur den standardmäßigen :mark:`englischen Schriftsatz` verwenden d.h. 'ae' statt 'ä' schreiben, usw! * Im Code sind :mark:`2 Kommentartypen`. Der Kommentar am Anfang (mit ``"""``) heißt :mark:`docstring`, geht über mehrere Zeilen und wird ausgeben mit: :: print(__doc__) * Die Kommentare ``#`` beschreiben den Programmablauf. * Alle Variablen sind bewusst ausgeschrieben und damit selbsterklärend (z.B ``radius`` statt ``r``). * Wir haben ``pi`` selbst definiert, später werden wir sehen, es geht einfacher! * Das ``print`` Statement ist Python 3 Syntax, d.h mit Klammern: :: print("Radius = ", radius) .. hint:: Probieren Sie es einfach aus! * Spyder starten * Text reinkopieren bzw. bestehendes Python Skript File laden * ein neues Skript als ``mein_kreis.py`` abspeichern * Ausgabe betrachten, jede Zeile versuchen zu verstehen! Einrückungen ============ Im vorhergehenden Beispielen wurden alle Anweisungen nacheinander ausgeführt. Allgemein unterscheidet man zwischen :mark:`Anweisungskopf` und :mark:`Anweisungskörper`, wobei der Körper weitere Anweisungen enthalten kann: Hier ein Beispiel: :: if x > 10: print("Python leistet gute Arbeit!") print("Zweite Zeile...") Bemerkungen dazu: * ``if x > 10:`` heißt :mark:`Anweisungskopf`. * Der Anweisungskopf endet mit einem ``:`` * Danach beginnt der :mark:`Anweisungskörper`. * Dieser wird durch eine :mark:`tiefere Einrückung` des Anweisungskörpers festgelegt. * Die Einrückung kann sowohl über :mark:`Tabulatoren` als auch über :mark:`Leerzeichen` erfolgen. * Tipp: :mark:`2-4 Leerzeichen` als Einrückung verwenden! Standardeinstellung bei der verwendeten Anaconda Version sind 4 Leerzeichen und ein Tabulator wird in Leerzeichen umgewandelt: .. figure:: images/einrueckung.png :scale: 40 % :align: center .. warning:: Tabulator werden je nach Editor Python intern durch 4-8 Leerzeichen ersetzt. Dies kann zu schwer auffindbaren Fehlern führen. Am Besten IMMER Leerzeichen verwenden. Vergleich mit anderen Programmiersprachen: * In **Fortran** lautet eine ähnliche Anweisung z.B.: :: IF ( x .GT. 10 ) THEN WRITE(6,*) "Fortran, alt aber gut!" WRITE(6,*) "Zweite Zeile..." ENDIF * In **C++** würde man schreiben: :: if ( x > 10 ) { printf ("C++, die Sprache für Experten!") printf ("Zweite Zeile...") } :mark:`Einrückungen` sind bei diesen beiden Sprachen nicht notwendig. Dafür muss man mehr schreiben (ENDIF bzw. {..}). Man macht der :mark:`Übersichtlichkeit` halber aber trotzdem Einrückungen! Übungsbeispiele ================= **\Aufgabe 2.1** Verwendung von Python als Taschenrechner: 1) Öffnen Sie eine Python Shell (oder starten Sie Python auf Ihrer Windows/Linux Shell) 2) Definieren Sie drei Variablen, ``a``, ``b`` und ``c``. Belegen Sie diese Variablen mit den Werten 1, 2 und 3. 3) Berechnen Sie die folgenden Werte und geben Sie das Ergebnis auf der Konsole mit einem ``print`` aus. * ``a`` * ``c`` * ``b`` / 2 4) Setzen Sie den Wert der Variable ``c`` zu -35. 5) Führen Sie Schritt 3 und 4 erneut durch. Probieren Sie die Pfeil oben bzw unten Tasten aus! **Aufgabe 2.2** Gegeben sei eine quadratische Gleichung .. math:: a*x^2+b*x+c = 0 1) Öffnen Sie eine Python Shell. 2) Definieren Sie drei beliebige Variablen, ``a``, ``b`` und ``c``. 3) Berechnen Sie die beiden Lösungen der quadratischen Gleichung und geben Sie das Ergebnis mit einem ``print`` aus. 4) Erzeugen Sie ein Python Skript mit beliebigem Namen mittels Spyder. 5) Übertragen Sie die Berechnungen der quadratischen Gleichung auf ein Skript und führen Sie das Skript mittels ``Run`` aus. Welche Vorteile hat so ein Skript? **Generelle Hinweise ab Aufgabe 2.1, Pkt 4)** * Verwenden Sie ein IDE (z.B Spyder) und machen Sie für jede Übung ein eigens Python File (z.B. ``hw2.py``) * Versuchen Sie die Programme selbstständig zu lösen, nur so lernen Sie Programmieren! * Zuerst das Skriptum oder andere Unterlagen durchlesen, dann erst zu Programmieren beginnen! * Kommentieren Sie Ihren Code ausführlich, damit Sie auch nach Wochen noch verstehen was Sie gemacht haben. Die Ausgabe sollte den Programmablauf "sichtbar machen". * Speichern Sie die Files zwischendurch ab, je nach IDE auch bevor Sie ``Run`` klicken. * Geben Sie zur Kontrolle nach Code-Modifikationen das Ergebnis in der Konsole mittels ``print`` aus. weitere Übungsbeispiele ================= **Aufgabe 2.3** Gegeben sei eine quadratische Funktion in x: .. math:: f(x) = a*x^2+b*x+c 1) Erzeugen Sie ein Python Skript mit beliebigem Namen mittels Spyder. 2) Definieren Sie 3 Variablen, ``a``, ``b`` und ``c`` mit beliebigen Werten (:math:`a \neq 0`) 3) Berechnen Sie den Extremwert der Funktion und weisen Sie ihn der Variable ``f0`` zu. (Die entsprechende extremale Position ``x0`` ist die Stelle, an der die erste Ableitung der Funktion null ist.) 4) Ermitteln Sie zusätzlich, ob es sich bei dem Extremwert um ein Minimum oder Maximum handelt. 5) Geben Sie das Ergebnis als "Minimum: ..." bzw. "Maximum: ..." aus. .. hint :: Achten Sie darauf, dass das Skript fuer beliebige Werte fuer ``a``, ``b`` und ``c`` funktioniert. **Aufgabe 2.4** Erstellen Sie eine Variable ``Bytes`` und weisen Sie ihr eine beliebige positive Integer-Zahl zu. ``Bytes`` gibt die Anzahl an verfügbaren Bytes an. Was ist die größte Integerzahl, die in dieser Anzahl an Bytes abgespeichert werden kann? (Gehen Sie davon aus, dass kein Vorzeichen mitgespeichert wird, d.h. es handelt sich um einen unsigned integer!). Bestimmen Sie mittels eines kurzen Python-Skripts die größte Integerzahl in Abhängigkeit von der Variable ``Bytes`` und geben Sie diese auf der Konsole aus. Testen Sie Ihr Skript mit verschieden Werten für ``Bytes``. .. Die größte Integerzahl berechnet sich anhand der Formel :math:`Zahl = 2^{Bits} - 1`. Beachten Sie den Unterschied zwischen Bit und Byte! .. hint :: Die größte Integerzahl berechnet sich anhand der Formel: .. math :: Zahl = 2^{Bits} - 1 Beachten Sie den Unterschied zwischen Bit und Byte!