├── .gitignore
├── LICENSE.md
├── README.md
├── build_conf.json
├── build_reveal.py
├── install.sh
├── latex
├── slides
│ ├── 01_getting_started.tex
│ ├── 02_grundlagen.tex
│ ├── 03_builtins.tex
│ ├── 04_modules_packages_pip.tex
│ ├── 05_decorators.tex
│ ├── 06_comprehensions.tex
│ ├── 07_functions_advanced.tex
│ ├── 08_process.tex
│ ├── 09_web_client.tex
│ ├── 10_regex.tex
│ ├── 11_smtplib.tex
│ ├── 12_curses.tex
│ ├── beamercolorthememetropolis.sty
│ ├── beamercolorthemesolarized.sty
│ ├── beamerfontthememetropolis.sty
│ ├── beamerinnerthememetropolis.sty
│ ├── beamerouterthememetropolis.sty
│ ├── beamerthememetropolis.sty
│ └── resources
│ │ ├── 01_getting_started
│ │ ├── attributes.py
│ │ ├── comments.py
│ │ ├── hello_world.py
│ │ ├── string_concatenation.py
│ │ └── string_format.py
│ │ ├── 02_grundlagen
│ │ ├── boilerplate.py
│ │ ├── classattributes.py
│ │ ├── inheritance.py
│ │ ├── instanceattributes.py
│ │ ├── scope.py
│ │ └── scope_fix.py
│ │ ├── 03_builtins
│ │ ├── cm.py
│ │ ├── dict.py
│ │ ├── exceptions.py
│ │ ├── file.py
│ │ ├── iterate.py
│ │ ├── list.py
│ │ ├── set.py
│ │ ├── tuple.py
│ │ └── unpacking.py
│ │ ├── 04_modules_and_packages
│ │ ├── incdec.py
│ │ ├── modules.py
│ │ └── path.py
│ │ ├── 05_pip
│ │ └── requirements.txt
│ │ ├── 06_comprehensions
│ │ ├── dicts.py
│ │ └── lists.py
│ │ ├── 06_decorators
│ │ ├── decorator.py
│ │ └── functions.py
│ │ ├── 07_funtions_advanced
│ │ ├── default.py
│ │ ├── mixed_aggr.py
│ │ ├── named_aggr.py
│ │ ├── nameless_aggr.py
│ │ ├── positional_aggregators.py
│ │ └── use_func.py
│ │ ├── 08_process
│ │ ├── context_mgr.py
│ │ ├── defs.py
│ │ └── popen_call.py
│ │ ├── 09_web_client
│ │ ├── req_example.py
│ │ ├── requests_example.py
│ │ └── urllib_calls.py
│ │ ├── 10_regex
│ │ ├── match.py
│ │ └── methods.py
│ │ ├── 11_sendmail
│ │ ├── defs.py
│ │ └── mailer.py
│ │ ├── 12_curses
│ │ └── functions.py
│ │ └── list_example.py
└── templates
│ ├── course_definitions.tex
│ ├── course_information.tex
│ ├── fsr_logo.pdf
│ ├── fsr_logo.svg
│ ├── fsr_logo_cropped.pdf
│ └── new_slide.tex
├── md
├── 01_getting_started.md
├── 02_grundlagen.md
├── 03_builtins.md
├── 04_modules_packages_pip.md
├── 05_decorators.md
├── 06_comprehensions.md
├── 07_functions_advanced.md
├── 08_process.md
├── 09_web_client.md
├── 10_regex.md
├── 11_smtplib.md
├── 12_curses.md
└── template.html
├── reveal.json
└── src
├── css
├── repl.css
├── repl.css.map
└── repl.scss
├── ifsr.css
├── ifsr.css.map
├── index.html
└── js
├── repl.it.js
└── token.js.example
/.gitignore:
--------------------------------------------------------------------------------
1 | build/
2 | .texpadtmp/
3 | *.pdf
4 | *.pyg
5 | .c9/
6 |
7 |
8 | token.js
9 | *.log
10 | *.aux
11 | *.vrb
12 | *.out
13 | *.nav
14 | *.pdf
15 | *.toc
16 | *.snm
17 | *.fdb_latexmk
18 | *.fls
19 | *.synctex.gz
20 | .DS_Store
21 | _site/
22 | .sass-cache/
23 | html/
24 | .jekyll-metadata
25 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/.
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Python Lessons
2 |
3 | This repository contains the __Python Lesson__ sources for the free student courses, held at the TU Dresden.
4 |
5 | Exercises to go along with the courses can be found [on GitHub pages](http://fsr.github.io/python-lessons/) or on the `gh-pages` branch of this repository as Markdown sources.
6 |
7 | ## Compiling the markdown sources
8 |
9 | The slides in the `md` folder need to be compiled with **reveal.js**.
10 |
11 | Therefore, `pandoc` has to be installed on your computer. You can find these Instructions [here](http://pandoc.org/installing.html). Mac users can simply install it with *homebrew*:
12 | `brew install pandoc`
13 |
14 | Before installing create a `src/js/token.js` from `src/js/token.js.example` and insert your [repl.it API](https://repl.it/site/blog/api-docs) token.
15 |
16 | Run `./install.sh` to initialize the html folder with reveal.js and copy the ifsr.css this only have to be done once
17 |
18 | To build the slides simply run `./build_reveal.py`. The compiled html files are in the `html` folder and easily can be accessed via the `index.html`
19 |
20 | If you add new slides don't forget to add them to `reveal.json`.
21 |
22 |
23 |
24 | An online copy can be found [here](https://python.felixdoering.com).
25 |
26 |
27 | ## Instructions for teachers and contributors
28 |
29 | If you want to contribute to these lessons, you should note that every topic exists as `.tex` file and as `.md` file because the tex files - rendered as PDF - offer a much more convenient way to look up something after a lesson while the rendered `reveal.js` slides are way better for presenting the slides in class.
30 | The black background and the few lines per slide improve readability and help to focus on the subject. Plus they look much better :wink:
31 |
32 | So if you are thinking about making some content-related changes, it would be nice if you apply those changes to both, the `md` and the `tex` slides.
33 |
34 | For contributing to the tasks, have a look at the `gh-pages` branch of this repository.
35 |
36 | ### Teaching
37 |
38 | As stated above, you should rely on the rendered Markdown slides for presenting. The `tex` files are automatically rendered and can be found at:
39 | [http://fsr.github.io/python-lessons/materials.html](http://fsr.github.io/python-lessons/materials.html)
40 |
41 | Almost every task is linked to a lesson. The corresponding PDF is linked automatically at the beginning of every task.
42 |
43 | Solutions for all tasks on this page can be found at [this repository](https://github.com/Feliix42/python-solutions).
44 |
45 |
46 | These lessons are created and maintained by [@h4llow3En](https://github.com/h4llow3En), [@justusadam](https://github.com/justusadam) and [@feliix42](https://github.com/Feliix42).
47 |
--------------------------------------------------------------------------------
/build_conf.json:
--------------------------------------------------------------------------------
1 | {
2 | "builds": {
3 | "pdf": {
4 | "source_dir": "latex/slides",
5 | "target_dir": "build/pdf",
6 | "command": "pdflatex",
7 | "files": [
8 | "01_getting_started.tex",
9 | "02_grundlagen.tex",
10 | "03_builtins.tex",
11 | "04_modules_packages_pip.tex",
12 | "05_decorators.tex",
13 | "06_comprehensions.tex",
14 | "07_functions_advanced.tex",
15 | "08_process.tex",
16 | "09_web_client.tex",
17 | "10_regex.tex",
18 | "11_smtplib.tex",
19 | "12_curses.tex"
20 | ]
21 | },
22 | "html": {
23 | "source_dir": "latex/slides",
24 | "target_dir": "build/html",
25 | "command": "hevea",
26 | "files": [
27 | "01_getting_started.tex",
28 | "02_grundlagen.tex"
29 | ]
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/build_reveal.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | import json
4 | import os
5 | import subprocess
6 | from collections import OrderedDict
7 |
8 | reveal_config = OrderedDict()
9 | template = []
10 | index = ''
11 |
12 |
13 | def main():
14 | global index
15 | if not os.path.isdir('html'):
16 | print('Please run ./install.sh first')
17 | exit()
18 | load()
19 | for title in reveal_config:
20 | source = reveal_config[title]['source']
21 | theme = reveal_config[title]['theme']
22 | destination = 'html/{source}.html'.format(source=source)
23 | subprocess.call(['pandoc', '-t', 'revealjs', '-s',
24 | '--template', 'md/template.html',
25 | 'md/{}.md'.format(source), '--no-highlight',
26 | '--variable', 'theme={}'.format(theme),
27 | '--variable', 'pagetitle={}'.format(title),
28 | '-o', 'html/{}.html'.format(source)])
29 | index += index_link.format(link=source + '.html', title=title)
30 | generated_index = index_content.format(links=index)
31 | new_index = ''
32 | for line in template:
33 | new_index += line.replace('{content}', generated_index)
34 | with open('html/index.html', 'w') as indexfile:
35 | indexfile.write(new_index)
36 |
37 |
38 | def load():
39 | global reveal_config, template
40 | try:
41 | with open('reveal.json') as json_data:
42 | configdata = json.load(json_data)
43 | for i in range(1, len(configdata) + 1):
44 | search = str(i) if i > 9 else '0' + str(i)
45 | for title in configdata:
46 | if configdata[title]['source'].startswith(search):
47 | reveal_config[title] = configdata[title]
48 | except FileNotFoundError:
49 | print('No reveal.json found.')
50 | exit()
51 | try:
52 | with open('src/index.html') as template_file:
53 | template = template_file.readlines()
54 | except FileNotFoundError:
55 | print('No src/index.html found.')
56 | exit()
57 |
58 |
59 | index_content = ''''''
60 |
61 | index_link = '''
{title}\n'''
62 |
63 |
64 | if __name__ == '__main__':
65 | main()
66 |
--------------------------------------------------------------------------------
/install.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | source_url=https://github.com/hakimel/reveal.js.git
3 |
4 | mkdir html
5 |
6 | git clone $source_url html/reveal.js
7 | cp src/ifsr.css html/reveal.js/css/theme/ifsr.css
8 | cp src/ifsr.css.map html/reveal.js/css/theme/ifsr.css.map
9 | cp -r src/css html/css
10 | cp -r src/js html/js
11 |
--------------------------------------------------------------------------------
/latex/slides/02_grundlagen.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | \title{Grundlagen}
9 | \date{\today}
10 |
11 |
12 | \begin{document}
13 |
14 | \maketitle
15 |
16 | \begin{frame}{Gliederung}
17 | \begin{multicols}{2}
18 | \setbeamertemplate{section in toc}[sections numbered]
19 | \tableofcontents
20 | \end{multicols}
21 | \end{frame}
22 |
23 |
24 |
25 | \section{Scriptcharakter}
26 | \begin{frame}[fragile]{Scriptcharakter}
27 | \begin{itemize}
28 | \item Beim Ausführen oder Importieren wird der Code im obersten Level des Moduls (der .py Datei) ausgeführt
29 | \item Funktionen, Klassen und globale Variablen werden üblicherweise auf dem obersten Level definiert
30 | \item Imports anderer Python Module werden auch hier ausgeführt
31 | \end{itemize}
32 | \end{frame}
33 |
34 | \begin{frame}[fragile]{Scriptcharakter}
35 | \lstinputlisting{resources/02_grundlagen/boilerplate.py}
36 | Soll das entsprechende Modul ausführbar sein und nicht nur als Bibliothek dienen, definiert man üblicherweise eine \alert{main}-Funktion.\\
37 | Zus\"atzlich f\"ugt man am Ende des Moduls die Boilerplate ein.\\
38 | \end{frame}
39 |
40 | \begin{frame}{Scriptcharakter}
41 | \begin{itemize}
42 | \item Python Code wird nicht kompiliert, sondern beim importieren in Python Bytecode übersetzt
43 | \item Bytecode wird auf einer VM ausgeführt
44 | \item Kein Memory Management nötig, alles sind Referenzen
45 | \item Syntaxerror wird beim Importieren geworfen
46 | \item Andere Fehler findet man erst, wenn die betreffende Zeile ausgeführt wird.
47 | \end{itemize}
48 | \end{frame}
49 |
50 |
51 |
52 | \section{Programmierparadigmen}
53 | \subsection{Imperatives Programmieren}
54 | \begin{frame}[fragile]{Programmierpradigmen}
55 | \begin{itemize}
56 | \item Python ist vor allem eine imperative und objektorientierte Sprache
57 | \item reine Funktionen und Variablen können auf oberster Ebene definiert werden
58 | \item Variablen, Klassen und Funktionen sind ab der Ebene sichtbar, in der sie eingeführt werden
59 | \end{itemize}
60 | \end{frame}
61 |
62 | \subsection{Das Scoping Problem}
63 | \begin{frame}[fragile]{Das Problem mit dem Scope}
64 | \lstinputlisting{resources/02_grundlagen/scope.py}
65 | \end{frame}
66 |
67 | \begin{frame}{Das Problem mit dem Scope}
68 | \textbf{\alert{Das Problem:}} \\[.25cm]
69 | Variablen sind zwar nach innen sichtbar, werden aber beim Reassignment innerhalb der Funktion neu angelegt und verschwinden so aus dem Scope.
70 | \end{frame}
71 |
72 | \begin{frame}[fragile]{Die Lösung}
73 | \lstinputlisting{resources/02_grundlagen/scope_fix.py}
74 | \end{frame}
75 |
76 | \subsection{Objektorientiertes Programmieren}
77 | \begin{frame}[fragile]{Objektorientiertung}
78 | \begin{itemize}
79 | \item Python ist auch fundamental objektorientiert
80 | \item Alles in Python ist ein Objekt
81 | \item Selbst die Datentypen \texttt{int}, \texttt{bool}, \texttt{str} und \texttt{type} sind Instanzen von \texttt{object} und haben folglich Methoden und Attribute
82 | \item Der Typ jedes Wertes und jeder Variable lässt sich mit \alert{\texttt{type()}} ermitteln
83 | \end{itemize}
84 | \end{frame}
85 |
86 | \section{Klassen und Attribute}
87 | % TODO: Dieser Frame muss noch mal überarbeitet werden!
88 | \begin{frame}[fragile]{Klassen und Attribute}
89 | \begin{itemize}
90 | \item Typen in Python werden ausgedrückt durch Klassen (Keyword \alert{\texttt{class}})
91 | \item Klassen dienen als Vorlage bzw. Schablone $\rightarrow$ Objekte sind dann Instanzen davon
92 | \item Die Besonderheit: alle Variablen und Werte sind Instanzen von \texttt{object}
93 | \end{itemize}
94 | \texttt{object} und alle Typen selbst sind widerum Objekte, genauer gesagt Instanzen vom Typ \texttt{type} und \texttt{type} widerum ist eine Subklasse von \texttt{object}.
95 | \end{frame}
96 |
97 | \begin{frame}[fragile]{Klassen und Attribute}
98 | \begin{itemize}
99 | \item Klassen und Objekte können selbst auch Variablen tragen (ähnlich wie in Java)
100 | \item Man unterscheidet dabei zwischen Klassenattributen und Instanzattributen
101 | \end{itemize}
102 |
103 | \begin{description}
104 | \item[Klassenattribute] werden für die Klasse definiert und sind für alle Instanzen gleich
105 | \item[Instanzattribute] werden außerhalb der Klassendefnition hinzugefügt (normalerweise im Initialisierer) und sind für jede Instanz unterschiedlich.
106 | \end{description}
107 | \end{frame}
108 |
109 | \begin{frame}[fragile]{Klassen und Attribute}
110 | \begin{itemize}
111 | \item Zugriff auf Attribute über Punktnotation (wie in Ruby/Java)
112 | \item Attribute werden wie Variablen mithilfe von \alert{\texttt{=}} gesetzt
113 | \item Man kann Objekten jederzeit neue Attribute hinzufügen (auch \texttt{type}-Objekten)
114 | \item Ist außerhalb des Initialisierers nicht empfehlenswert
115 | \end{itemize}
116 | \end{frame}
117 |
118 | \subsection{Klassen- und Objektattribute im Detail}
119 | \begin{frame}[fragile]{Klassen- und Objektattribute im Detail}
120 | Klassenattribute sind für jede Instanz eines Objektes gleich.
121 | \lstinputlisting{resources/02_grundlagen/classattributes.py}
122 | \end{frame}
123 |
124 | \begin{frame}{Klassen- und Objektattribute im Detail}
125 | Gewöhnlich definiert man Instanzattribute allerdings im \textbf{Initialisierer}.
126 | \lstinputlisting{resources/02_grundlagen/instanceattributes.py}
127 | \begin{itemize}
128 | \item Instanzattribute sollten immer in \alert{\texttt{\_\_init\_\_}} definiert werden, um sicherzustellen, dass alle Instanzen die gleichen Attribute haben
129 | \end{itemize}
130 | \end{frame}
131 |
132 | \subsection{Super- und Subklassen}
133 | \begin{frame}[fragile]{Super- und Subklassen}
134 | Eine Klasse kann Attribute einer anderen Klasse erben, indem sie mit \alert{\texttt{class subclass(superclass):}} definiert wird.
135 | \begin{itemize}
136 | \item Subklassen enthalten von Anfang an alle Attribute der Superklasse.
137 | \item Es können neue Variablen und Methoden hinzugefügt, und auch alte überschrieben werden.
138 | \item Die Attribute der Superklasse können mit \alert{\texttt{super()}} aufgerufen werden.
139 | \end{itemize}
140 | \end{frame}
141 |
142 | \begin{frame}[fragile]{Super- und Subklassen}
143 | \lstinputlisting{resources/02_grundlagen/inheritance.py}
144 | \end{frame}
145 |
146 |
147 | \section{Methoden}
148 | \begin{frame}[fragile]{Methoden}
149 | \begin{itemize}
150 | \item Methoden sind Funktionen
151 | \item Allgemeiner Typ von Methoden ist daher \alert{\texttt{function}}
152 | \item Methoden liegen im Namespace der zugehörigen Klasse, müssen daher mit \alert{\texttt{ClassName.method\_name()}} angesteuert werden (oder auf dem Objekt aufgerufen werden)
153 | \item Methoden haben ein implizites erstes Argument (typischerweise \texttt{self} genannt, kann aber variieren)
154 | \item Beim Aufruf auf einer Instanz wird das Objekt selbst automatisch übergeben
155 | \end{itemize}
156 | \end{frame}
157 |
158 |
159 | \subsection{Spezielle Methoden}
160 | \begin{frame}[fragile]{Methoden}
161 | Dies sind Methoden die auf den meisten Grundlegenden Datenstrukturen implementiert sind, z.B. \texttt{object}.\\
162 | Die Folgenden beginnen und enden normalerweise mit zwei Unterstrichen.
163 |
164 | \begin{description}
165 | \item[Initialisierer] Oft auch (fälschlicherweise) Konstruktor genannt.\\ Name: \alert{\texttt{\_\_init\_\_}}\\
166 | Wird immer aufgerufen wenn eine neue Instanz der Klasse erstellt wird.
167 | \item[Finalisierer] Oft auch (fälschlicherweise) Destructor genannt.\\
168 | Name: \alert{\texttt{\_\_del\_\_}}\\
169 | Wird immer aufgerufen wenn das Objekt vom Garbage Collector aufgeräumt wird. (selten verwendet)
170 | \end{description}
171 | \end{frame}
172 |
173 | \begin{frame}[fragile]{Methoden}
174 | \begin{description}
175 | \item[String Konvertierer] Äquivalent zu Java's \texttt{toString} Methode. \\ Name: \alert{\texttt{\_\_str\_\_}}
176 | \item[String Repräsentation] Ähnlich wie \alert{\texttt{\_\_str\_\_}} aber gedacht für eine für Debug verwendbare Repräsentation anstatt für Output wie \alert{\texttt{\_\_str\_\_}}.
177 | \end{description}
178 | \end{frame}
179 |
180 |
181 |
182 |
183 |
184 | \end{document}
185 |
--------------------------------------------------------------------------------
/latex/slides/03_builtins.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | \title{Builtin Datenstrukturen}
9 | \date{\today}
10 |
11 |
12 | \begin{document}
13 |
14 | \maketitle
15 |
16 | \begin{frame}{Gliederung}
17 | \begin{multicols}{2}
18 | \setbeamertemplate{section in toc}[sections numbered]
19 | \tableofcontents
20 | \end{multicols}
21 | \end{frame}
22 |
23 |
24 | % #############################################################################
25 | % ------------------------------- 1. Exceptions -------------------------------
26 | % #############################################################################
27 | \section{Exceptions}
28 |
29 | \begin{frame}{Exception Handling}
30 | \begin{itemize}
31 | \item Alle Exceptions erben von \alert{\texttt{Exception}}
32 | \item Catching mit try/except
33 | \item \alert{\texttt{finally}} um Code auszuführen, der \textit{unbedingt} laufen muss, egal ob eine Exception vorliegt oder nicht
34 | \end{itemize}
35 | \end{frame}
36 |
37 | \begin{frame}{Exception Handling - Beispiel}
38 | \lstinputlisting{resources/03_builtins/exceptions.py}
39 | \end{frame}
40 |
41 |
42 | % #############################################################################
43 | % -------------------------------- 2. Booleans --------------------------------
44 | % #############################################################################
45 | \section{Booleans}
46 |
47 | \begin{frame}{Boolsche Werte}
48 | \begin{itemize}
49 | \item \textit{type} ist \alert{\texttt{bool}}
50 | \item Mögliche Werte: \texttt{True} oder \texttt{False}
51 | \item Operationen sind \textit{und}, \textit{oder}, \textit{nicht} (\texttt{and, or, not})
52 | \end{itemize}
53 | \end{frame}
54 |
55 |
56 | % #############################################################################
57 | % --------------------------------- 3. Lists ----------------------------------
58 | % #############################################################################
59 | \section{Lists}
60 |
61 | \begin{frame}{list}
62 | \begin{itemize}
63 | \item enthält variable Anzahl von Objekten
64 | \item eine Liste kann beliebig viele verschiedene Datentypen enthalten (z.B. \texttt{bool} und \texttt{list})
65 | \item Auch Listen können in Listen gespeichert werden!
66 | \item Listenobjekte haben eine feste Reihenfolge (\textit{first in, last out})
67 | \item optimiert für einseitige Benutzung wie z.B. Queue (\alert{\texttt{append}} und \alert{\texttt{pop}})
68 | \end{itemize}
69 | \end{frame}
70 |
71 | \begin{frame}{list - Beispiel}
72 | \lstinputlisting{resources/03_builtins/list.py}
73 | \end{frame}
74 |
75 |
76 | % #############################################################################
77 | % --------------------------------- 4. Tuples ---------------------------------
78 | % #############################################################################
79 | \section{Tuples}
80 |
81 | \begin{frame}{tuple}
82 | \begin{itemize}
83 | \item Gruppiert Daten
84 | \item kann nicht mehr verändert werden, sobald es erstellt wurde
85 | \item Funktionen mit mehreren Rückgabewerten geben ein Tupel zurück
86 | \end{itemize}
87 | \end{frame}
88 |
89 | \begin{frame}{tuple - Beispiel}
90 | \lstinputlisting{resources/03_builtins/tuple.py}
91 | \end{frame}
92 |
93 |
94 | % #############################################################################
95 | % --------------------------------- 5. Dicts ----------------------------------
96 | % #############################################################################
97 | \section{Dicts}
98 |
99 | \begin{frame}{dict}
100 | \begin{itemize}
101 | \item einfache Hashmap
102 | \item ungeordnet
103 | \item jeder hashbare Typ kann ein Key sein
104 | \item jedem Key ist dann ein Value zugeordnet
105 | \end{itemize}
106 | \end{frame}
107 |
108 | \begin{frame}{dict - Beispiel}
109 | \lstinputlisting[lastline=10]{resources/03_builtins/dict.py}
110 | \end{frame}
111 |
112 | \begin{frame}{dict - Beispiel}
113 | \lstinputlisting[firstline=11]{resources/03_builtins/dict.py}
114 | \end{frame}
115 |
116 |
117 | % #############################################################################
118 | % ----------------------------- 6. Set/Frozenset ------------------------------
119 | % #############################################################################
120 | \section{Set/Frozenset}
121 |
122 | \begin{frame}{set/frozenset}
123 | \begin{itemize}
124 | \item kann nur hashbare Einträge enthalten
125 | \item \texttt{set} selbst ist nicht hashbar
126 | \item \texttt{frozensets} sind hashbar, jedoch nicht mehr veränderbar
127 | \item enthält jedes Element nur einmal
128 | \item schnellere Überprüfung mit \alert{\texttt{in}} (prüft, ob Element enthalten ist)
129 | \item Mögliche Operationen: \alert{\texttt{superset()}}, \alert{\texttt{subset()}}, \alert{\texttt{isdisjoint()}}, \alert{\texttt{difference()}}, \alert{\texttt{<}}, \alert{\texttt{>}}, \alert{\texttt{disjoint()}}, \alert{\texttt{-}}
130 | \item ungeordnet
131 | \item (frozen)sets können frozensets enthalten (da sie einen festen Hashwert haben)
132 | \end{itemize}
133 | \end{frame}
134 |
135 | \begin{frame}{set/frozenset - Beispiel}
136 | \lstinputlisting{resources/03_builtins/set.py}
137 | \end{frame}
138 |
139 |
140 | % #############################################################################
141 | % ------------------------------- 7. Iterations -------------------------------
142 | % #############################################################################
143 | \section{Iterations}
144 |
145 | \begin{frame}{Iteration}
146 | \begin{itemize}
147 | \item nur foreach
148 | \item für Iterationen über Integer gibt es \\ \hspace{0.5cm} \texttt{range([start], stop, step=1)}
149 | \item um Iteratoren zu kombinieren kann man \\ \hspace{0.5cm} \texttt{zip(iterator\_1, iterator\_2, ..., iterator\_n)} verwenden
150 | \item alles mit einer \alert{\texttt{\_\_iter\_\_}} Methode ist iterierbar
151 | % TODO: stateful Iterator erklaeren oder entfernen
152 | \item \texttt{iter(iterable)} konstruiert einen \textit{stateful iterator}
153 | \end{itemize}
154 | \end{frame}
155 |
156 | \begin{frame}{Iteration - Beispiel}
157 | \lstinputlisting[lastline=15]{resources/03_builtins/iterate.py}
158 | \end{frame}
159 |
160 | \begin{frame}{Iteration - Beispiel}
161 | \lstinputlisting[firstline=18]{resources/03_builtins/iterate.py}
162 | \end{frame}
163 |
164 |
165 | % #############################################################################
166 | % ------------------------------- 8. Unpacking --------------------------------
167 | % #############################################################################
168 | \section{Unpacking}
169 |
170 | \begin{frame}{Unpacking}
171 | \begin{itemize}
172 | \item einfaches Auflösen von Listen und Tupeln in einzelne Variablen
173 | \item nützlich in \alert{\texttt{for}}-Schleifen
174 | \end{itemize}
175 | \end{frame}
176 |
177 | \begin{frame}{Unpacking - Beispiel}
178 | \lstinputlisting{resources/03_builtins/unpacking.py}
179 | \end{frame}
180 |
181 |
182 | % #############################################################################
183 | % ----------------------------- 9. File Handling ------------------------------
184 | % #############################################################################
185 | \section{File Handling}
186 |
187 | \begin{frame}{File Handling}
188 | \begin{itemize}
189 | \item Dateien können mit \alert{\texttt{open(filename, mode="r")}} geöffnet werden
190 | \item \textit{File Handler} sind Iteratoren über die Zeilen einer Datei
191 | \item \textbf{Wichtig:} File Handler müssen auch wieder geschlossen werden
192 | \item \texttt{r} steht für Lesezugriff, \texttt{w} für Schreibzugriff
193 | \end{itemize}
194 | \textbf{Beachte:} Wird eine Datei mit Schreibzugriff geöffnet, wird sie geleert! Also wichtige Inhalte vorher auslesen.
195 | \end{frame}
196 |
197 | \begin{frame}{File Handling - Beispiel}
198 | \lstinputlisting{resources/03_builtins/file.py}
199 | \end{frame}
200 |
201 |
202 | % #############################################################################
203 | % ---------------------------- 10. Context Manager ----------------------------
204 | % #############################################################################
205 | \section{Context Manager}
206 |
207 | \begin{frame}{Context Manager}
208 | \begin{itemize}
209 | \item Aufruf mit \alert{\texttt{with}}
210 | \item kann jedes Objekt sein, welches eine \texttt{\_\_enter\_\_} und \texttt{\_\_exit\_\_} Methode hat
211 | \item praktisch beim \textit{File Handling}
212 | \end{itemize}
213 | \end{frame}
214 |
215 | \begin{frame}{Context Manager}
216 | \lstinputlisting{resources/03_builtins/cm.py}
217 | \end{frame}
218 |
219 |
220 | \end{document}
221 |
--------------------------------------------------------------------------------
/latex/slides/04_modules_packages_pip.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | \title{Module, Packete und PIP}
9 | \date{\today}
10 |
11 |
12 | \begin{document}
13 |
14 | \maketitle
15 |
16 | \begin{frame}{Gliederung}
17 | \begin{multicols}{2}
18 | \setbeamertemplate{section in toc}[sections numbered]
19 | \tableofcontents
20 | \end{multicols}
21 | \end{frame}
22 |
23 | % ---------------------------------- Module ----------------------------------
24 |
25 | \section{Module}
26 | \subsection{Eigene Module}
27 | \begin{frame}[fragile]{Module}
28 | \begin{itemize}
29 | \item Ein Modul ist die python-interne Repr\"asentation einer \texttt{.py} Datei
30 | \item Der Dateiname setzt sich daher aus Modulname + \texttt{.py} zusammen
31 | \item Module beinhalten eine beliebige Anzahl an Definitionen (Klassen, Funktionen, Variablen/Konstanten)
32 | \item Das komplette Modul wird mit \alert{\texttt{import}} hinzugef\"ugt
33 | \item Einzelne Inhalte mit \alert{\texttt{from}} Modul \alert{\texttt{import}} Name
34 | \item Mit Hilfe von \alert{\texttt{as}} kann ein Alias f\"ur den importierten Namen angelegt werden
35 | \end{itemize}
36 | \end{frame}
37 |
38 | \begin{frame}{Ein Beispiel}
39 | Die Datei \textbf{incdec.py} enth\"alt eine Reihe von Funktionen:
40 | \lstinputlisting{resources/04_modules_and_packages/incdec.py}
41 | \end{frame}
42 |
43 | \begin{frame}{Ein Beispiel}
44 | In einem anderen Python-Script kann ich diese Funktionen nutzen:
45 | \lstinputlisting[lastline=15]{resources/04_modules_and_packages/modules.py}
46 | \end{frame}
47 |
48 | \begin{frame}{Ein Beispiel}
49 | In einem anderen Python-Script kann ich diese Funktionen nutzen:
50 | \lstinputlisting[firstline=17]{resources/04_modules_and_packages/modules.py}
51 | \end{frame}
52 |
53 | \subsection{Der Sinn der Boilerplate}
54 | \begin{frame}{Der Sinn der Boilerplate}
55 | \begin{itemize}
56 | \item Verhindert, dass Code beim Importieren eines Scriptes ausgef\"uhrt wird
57 | \item Beim Aufruf des Moduls \"uber \texttt{import} ist der Name des Moduls \alert{nicht \texttt{\_\_main\_\_}}, sondern der Name des Scriptes (im vorherigen Beispiel w\"are das \texttt{incdec})
58 | \end{itemize}
59 | \end{frame}
60 |
61 |
62 |
63 | \subsection{Suchpfad f\"ur Module}
64 | \begin{frame}{Suchpfad f\"ur Module}
65 | \begin{itemize}
66 | \item Python sucht Module beim Import an allen im \alert{\textbf{PYTHONPATH}} aufgelisteten Ordnern
67 | \item dieser findet sich in Python unter \alert{\texttt{sys.path}}, in der Kommandozeile in der Umgebungsvariable PYTHONPATH
68 | \item \texttt{sys.path} l\"asst sich zur Laufzeit im Interpreter \"andern (z.B. um nachtr\"aglich neue eigene Module hinzuzuf\"ugen)
69 | \end{itemize}
70 | \end{frame}
71 |
72 | \begin{frame}{Suchpfad f\"ur Module}
73 | Standardm\"a\ss{}ig enth\"alt der Suchpfad folgende Module: \\ \ \\
74 | \begin{itemize}
75 | \item die \textit{Standardbibliothek} der derzeitig verwendeten Python-Version
76 | \item das \textit{aktuelle Verzeichnis}, in dem der Interpreter aufgerufen wurde
77 | \item eine \textit{Verzeichnis mit plattfomspezifischen Modulen}, z.B.
78 | "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/
79 | Versions/3.5/lib/python3.5/plat-darwin" f\"ur Mac
80 | \item \textit{Benutzerspezifische Module f\"ur die jeweilige Python Version}, z.B. "/usr/local/lib/python3.5/site-packages" f\"ur Python 3.5
81 | \end{itemize}
82 | \end{frame}
83 |
84 |
85 |
86 | \subsection{Suchpfad modifizieren}
87 | \begin{frame}{Suchpfad modifizieren}
88 | Zus\"atzliche Verzeichnisse f\"ur den PYTHONPATH kann man beim Aufruf \"ubergeben:\\
89 | \hspace*{.5cm}\codeline{\$ PYTHONPATH=/my/directory python3 script.py}\\ \ \\
90 | Oder im Programm:
91 | \lstinputlisting{resources/04_modules_and_packages/path.py}
92 | \"Anderungen am Pfad sind erst \textbf{nach} der entsprechenden Codezeile verf\"ugbar.
93 | \end{frame}
94 |
95 |
96 |
97 | \subsection{Standardmodule}
98 | \begin{frame}{Standardmodule}
99 | Python liefert viele n\"utzliche Module bereits in der Standardbibliothek mit, z.B.:
100 | \texttt{sys}, \texttt{os}, \texttt{http}, \texttt{re}, \texttt{fuctools}, \texttt{itertools}, \texttt{collections}, \texttt{hashlib}, \texttt{urllib} und viele mehr. \\ \ \\
101 | Daher bezeichnet man Python oft auch als \textbf{Batteries included}.
102 | \end{frame}
103 |
104 | % --------------------------------- Packages ---------------------------------
105 |
106 | \section{Packages}
107 | \begin{frame}{Packages}
108 | \begin{itemize}
109 | \item Packages sind Ordner, die mindestens ein \alert{\texttt{\_\_init\_\_.py}} Modul enthalten.
110 | \item der Inhalt dieses Moduls ist prinzipiell egal
111 | \item Packages k\"onnen genau wie Module importiert werden
112 | \item Wird das Package selbst importiert, sind alle Definitionen in \texttt{\_\_init\_\_.py} \"uber das importierte Package erreichbar.
113 | \item wird benutzt, um Module in sinnvolle Gruppen zusammenzufassen
114 | \end{itemize}
115 | \end{frame}
116 |
117 | % -------------------- merged from presentation about 'pip' -------------------
118 |
119 | \section{PIP}
120 | \subsection{Installation von PIP}
121 | \begin{frame}{Installation von PIP}
122 | Nicht jedes Modul ist in der Standardbibliothek vorhanden, muss aber nicht zwingen manuell als Datei hinzugef\"ugt werden. Man kann ganz einfach PIP zur Hilfe nehmen.\\[.5cm]
123 | \textbf{Installation:}\\
124 | \begin{enumerate}
125 | \item Downloaden der \texttt{get-pip.py} von pypa \href{https://bootstrap.pypa.io/get-pip.py}{(hier)}
126 | \item Installieren via \texttt{python3 get-pip.py}\\[.5cm]
127 | \end{enumerate}
128 |
129 | Hinweis f\"ur Mac-Nutzer:\\
130 | Bei der Pythoninstallation via \textit{Homebrew} wird pip gleich mit installiert.
131 | \end{frame}
132 |
133 |
134 |
135 | \subsection{Verwendung}
136 | \begin{frame}{Verwendung}
137 | Die Installation von Modulen ist einfach und es gibt mehrere M\"oglichkeiten:
138 | \begin{itemize}
139 | \item die aktuellste Version eines Moduls:\\
140 | \noindent\hspace*{.5cm} \texttt{pip install Modulname}
141 | \item eine bestimmte Version:\\
142 | \noindent\hspace*{.5cm} \texttt{pip install Modulname==2.1}
143 | \item alle Versionen ab einem Minimum:\\
144 | \noindent\hspace*{.5cm} \texttt{pip install Modulname>=2.1}
145 | \item alle Versionen bis zu einem Maximum:\\
146 | \noindent\hspace*{.5cm} \texttt{pip install Modulname<=2.1}
147 | \end{itemize}
148 | \end{frame}
149 |
150 |
151 |
152 | \subsection{Die requirements.txt}
153 | \begin{frame}{Die requirements.txt}
154 | Wenn jemand Scripte ausf\"uhren m\"ochte, in denen Module verwendet werden, die mit Hilfe von PIP installiert wurden, ist es hilfreich eine \alert{\texttt{requirements.txt}} mitzuliefern.\\
155 | In dieser sind alle Module aufgelistet, die ben\"otigt werden.\\[.5cm]
156 | \lstinputlisting{resources/05_pip/requirements.txt}
157 |
158 | Via \alert{\texttt{pip install -r requirements.txt}} k\"onnen alle Module von der Liste installiert werden
159 | \end{frame}
160 |
161 | \end{document}
162 |
--------------------------------------------------------------------------------
/latex/slides/05_decorators.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 | \usepackage{comment}
7 | % Presentation title
8 | \title{Decorators}
9 | \date{\today}
10 |
11 |
12 | \begin{document}
13 |
14 | \maketitle
15 |
16 | \begin{frame}{Gliederung}
17 | \setbeamertemplate{section in toc}[sections numbered]
18 | \tableofcontents
19 | \end{frame}
20 |
21 |
22 | \section{Fakten über Funktionen}
23 | \begin{frame}{Fakten über Funktionen}
24 | \begin{itemize}
25 | \item Funktionen können Variablen zugewiesen werden,
26 | \lstinputlisting[lastline=8]{resources/06_decorators/functions.py}
27 | \item Sie können in Funktionen definiert werden,
28 | \lstinputlisting[firstline=11, lastline=19]{resources/06_decorators/functions.py}
29 | \end{itemize}
30 | \end{frame}
31 | \begin{frame}{Fakten über Funktionen}
32 | \begin{itemize}
33 | \item Sie können andere Funktionen zurückgeben,
34 | \lstinputlisting[firstline=22, lastline=29]{resources/06_decorators/functions.py}
35 | \end{itemize}
36 | \end{frame}
37 | \begin{frame}{Fakten über Funktionen}
38 | \begin{itemize}
39 | \item Sie können als Parameter mitgegeben werden
40 | \lstinputlisting[firstline=32]{resources/06_decorators/functions.py}
41 | \end{itemize}
42 | \end{frame}
43 |
44 | \section{Decorator}
45 | \subsection{einfache Decorator}
46 | \begin{frame}{einfache Decorator}
47 | Decorator sind Wrapper über existierende Funktionen. Dabei werden die zuvor genannten Eigenschaften verwendet.\\
48 | Eine Funktion, die eine weitere als Argument hat, erstellt eine neue Funktion.
49 | \lstinputlisting[lastline=9]{resources/06_decorators/decorator.py}
50 | \end{frame}
51 | \begin{frame}{einfache Decorator}
52 | \lstinputlisting[firstline=11,lastline=18]{resources/06_decorators/decorator.py}
53 | \end{frame}
54 |
55 | \begin{frame}[fragile]{einfache Decorator}
56 | Durch das \alert{\texttt{@} Symbol} lässt sich der Decorator wesentlich einfacher verwenden.
57 | \lstinputlisting[firstline=22, lastline=35]{resources/06_decorators/decorator.py}
58 | Es können auch mehrere Decorator übereinander geschrieben werden.
59 | \end{frame}
60 |
61 | \subsection{Decorator mit Argumenten}
62 | \begin{frame}{Decorator mit Argumenten}
63 | Decorator erwarten Funktionen als Argumente. Aus diesem Grund kann man nicht einfach andere Argumente mitgeben, sondern man muss eine Funktion schreiben, die dann den Decorator erstellt.
64 | \lstinputlisting[firstline= 38]{resources/06_decorators/decorator.py}
65 | \end{frame}
66 |
67 | % nothing to do from here on
68 | \end{document}
69 |
--------------------------------------------------------------------------------
/latex/slides/06_comprehensions.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | \title{Comprehensions}
9 | \date{\today}
10 |
11 |
12 | \begin{document}
13 |
14 | \maketitle
15 |
16 | \begin{frame}{Gliederung}
17 | \setbeamertemplate{section in toc}[sections numbered]
18 | \tableofcontents
19 | \end{frame}
20 |
21 |
22 | \section{Basics}
23 | \begin{frame}{Basics}
24 | Comprehensions sind eine bequeme Art und Weise, um Funktoren (Datenstrukturen, die andere Datenstrukturen beinhalten) mit kleinen Expressions zu erstellen und zu füllen und sind in allen modernen Sprachen vorhanden.
25 | \end{frame}
26 |
27 |
28 |
29 | \section{List Comprehension}
30 | \begin{frame}{List Comprehension}
31 | Grundlegender Syntax: \alert{\texttt{[ EXPRESSION for LAUFVARIABLE in ITERABLE (if FILTER) ]}}\\
32 | \begin{description}
33 | \item[EXPRESSION] Ist ein beliebiger Ausdruck (man stelle sich ein implizites \texttt{return} vor), etwa ein Wert, eine Variable, eine Gleichung, etc ... \\
34 | \texttt{EXPRESSION} wird am Ende in der Liste abgelegt.
35 | \item[LAUFVARIABLE] Eine beliebige Variable, die in \textit{EXPRESSION} und \textit{FILTER} zur Verfügung steht
36 | \item[ITERABLE] Ist häufig etwas wie \texttt{range()} oder eine andere Liste.
37 | \item[FILTER] Eine optionale boolean expression, womit Einträge gefiltert werden (falls \texttt{False}). N\"utzlich, wenn z.B. nur gerade Zahlen \"ubernommen werden sollen, usw...
38 | \end{description}
39 |
40 | \end{frame}
41 |
42 | \begin{frame}{List Comprehension - Beispiel}
43 | \lstinputlisting{resources/06_comprehensions/lists.py}
44 | \end{frame}
45 |
46 |
47 |
48 | \section{Dict Comprehension}
49 | \begin{frame}{Dict Comprehension}
50 | Grundlegender Syntax: \alert{\texttt{\{ KEY : VALUE for LAUFVARIABLE in ITERABLE (if FILTER) \}}}\\[.75cm]
51 | Fast der gleiche Syntax, nur dieses Mal mit 2 Expressions: \textit{KEY} und \textit{VALUE}. Ansonsten gelten die gleichen Regeln.
52 | \end{frame}
53 |
54 | \begin{frame}{Dict Comprehension - Beispiel}
55 | \lstinputlisting{resources/06_comprehensions/dicts.py}
56 | \end{frame}
57 |
58 |
59 |
60 | \section{Generators}
61 | \begin{frame}{Generators}
62 | \begin{description}
63 | \item[Generator] Ein Objekt, \"uber das iteriert werden kann. Wenn ein Element daraus verwendet wurde, ist es nicht mehr in dem Generatorobjekt enthalten.\\[.5cm]
64 | \end{description}
65 |
66 | Die grundlegende Syntax ist gleich der einer \textit{List Comprehension}.
67 | Da sich \alert{\texttt{list}} und \alert{\texttt{dict}} auch aus Iterables bauen lassen, gilt prinzipiell:\\[.25cm]
68 |
69 | \alert{\texttt{list(EXPRESSION for VARIABLE in ITERABLE) == [EXPRESSION for VARIABLE in ITERABLE]}}\\[.25cm]
70 | und\\[.25cm]
71 | \alert{\texttt{dict((KEY, VALUE) for VARIABLE in ITERABLE) == \{KEY:VALUE for VARIABLE in ITERABLE\}}}\\[.25cm]
72 |
73 | \textbf{Aber:} Generators verhalten sich anders als Lists oder Dicts!
74 |
75 | \end{frame}
76 |
77 |
78 | %\section{Misc}
79 | %\begin{frame}{Misc}
80 | % Mit \texttt{tuple()} und der generator expression lassen sich theoretisch auch tuple comprehensions bauen, ist aber konzeptionell eher Unsinn.
81 | %\end{frame}
82 |
83 |
84 | % nothing to do from here on
85 | \end{document}
86 |
--------------------------------------------------------------------------------
/latex/slides/07_functions_advanced.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | \title{Funktionen (fortgeschritten)}
9 | \date{\today}
10 |
11 |
12 | \begin{document}
13 |
14 | \maketitle
15 |
16 | \begin{frame}{Gliederung}
17 | \begin{multicols}{2}
18 | \setbeamertemplate{section in toc}[sections numbered]
19 | \tableofcontents
20 | \end{multicols}
21 | \end{frame}
22 |
23 |
24 | \section{Nutzung von Funktionen}
25 | \begin{frame}[fragile]{Funktionen als Werte}
26 | Funktionen k\"onnen wie alle anderen Werte zugewiesen werden\\[.25cm]
27 | \lstinputlisting[lastline=5]{resources/07_funtions_advanced/use_func.py}
28 |
29 | \ \\[.25cm]
30 | Oder als Parameter mitgegeben werden\\[.25cm]
31 | \lstinputlisting[firstline=8, lastline=12]{resources/07_funtions_advanced/use_func.py}
32 | \end{frame}
33 |
34 | \begin{frame}[fragile]{Methoden sind Funktionen}
35 | \lstinputlisting[firstline=15]{resources/07_funtions_advanced/use_func.py}
36 | \end{frame}
37 |
38 |
39 | \subsection{Default Parameter}
40 | \begin{frame}[fragile]{Default Parameter}
41 | \begin{itemize}
42 | \item Funktionen k\"onnen vordefinierte Werte für Parameter haben.
43 | \item Parameter ohne \texttt{default}-Werten werden positionale Argumente genannt
44 | \item Parameter mit \texttt{default}-Werten werden name
45 | \end{itemize}
46 | \lstinputlisting[lastline=5]{resources/07_funtions_advanced/default.py}
47 | \end{frame}
48 |
49 | \begin{frame}{ACHTUNG!}
50 | \center{\alert{\textbf{Niemals \texttt{mutable Values} (änderbare Werte) als \texttt{default}-Parameter verwenden!}}}\\[1cm]
51 | \begin{description}
52 | \item[mutable Values] \ \ \ \texttt{list}, \texttt{dict}, \texttt{set} und eigene Klassen \\
53 | \ \ \ \ \ (bzw. deren Attribute)
54 | \item[immutable Values] \texttt{string}, \texttt{function}, \texttt{int}, \texttt{type} und \texttt{None}
55 | \end{description}
56 | \end{frame}
57 |
58 | \begin{frame}{ACHTUNG!}
59 | \textbf{Warum?}\\[.25cm]
60 | \lstinputlisting[firstline=8, lastline=10]{resources/07_funtions_advanced/default.py}
61 | Man denkt, die Funktion hat jedes mal eine leere List, jedoch passiert folgendes:\\[.25cm]
62 | \lstinputlisting[firstline=12, lastline=14]{resources/07_funtions_advanced/default.py}
63 | Die Liste wird einmalig zum Start angelegt und fortgeführt.
64 | \end{frame}
65 |
66 | \begin{frame}[fragile]{ACHTUNG!}
67 | So sollte man es machen:\\[.5cm]
68 | \lstinputlisting[firstline=16, lastline=19]{resources/07_funtions_advanced/default.py}
69 | \ \\[.5cm]
70 | Den \texttt{default}-Parameter als \texttt{None} setzten und dann, falls er \texttt{None} ist als z.B. leere Liste setzen.
71 | \end{frame}
72 |
73 |
74 | \subsection{Aufruf mit Namen}
75 | \begin{frame}[fragile]{Aufruf mit Namen}
76 | Funktionsparameter können direkt mit ihrem Namen aufgerufen werden, dann spielt die Aufrufreihenfolge keine Rolle mehr.\\[.25cm]
77 | \lstinputlisting[firstline=22]{resources/07_funtions_advanced/default.py}
78 | \end{frame}
79 |
80 | \begin{frame}{Aufruf mit Namen}
81 | Es gelten folgende Regeln:
82 | \begin{itemize}
83 | \item Alle Parameter können an ihrer Position angesprochen werden
84 | \item Es können auch alle mit ihrem Namen angesprochen werden
85 | \item Wenn eins mit dem Namen angesprochen wurde, m\"ussen die folgenden ebenfalls mit Namen angesprochen werden
86 | \end{itemize}
87 | \end{frame}
88 |
89 | % ------------------------------- Aggregatoren -------------------------------
90 | \section{Aggregatoren}
91 | \begin{frame}{Aggregatoren}
92 | \textbf{Aggregatoren} (auch Sammler genannt), sind sehr n\"utzlich, wenn man,
93 | zus\"atzlich zu bereits definierten Parametern, in einer Funktion eine unbestimmte
94 | Anzahl an Funktionsargumenten entgegen nehmen will.
95 | \end{frame}
96 |
97 |
98 | \subsection{Positionale Aggregatoren}
99 | \begin{frame}[fragile]{Positionale Aggregatoren}
100 | \begin{itemize}
101 | \item jede Funktion kann einen Aggregator haben
102 | \item dieser muss der \textit{letzte} positionale Parameter sein
103 | \item Positionale Aggregatoren werden durch einen \texttt{*} gekennzeichnet
104 | \item nach einem Aggregator k\"onnen nur noch benamte Parameter definiert werden,
105 | diese m\"ussen auch mit Namen aufgerufen werden \\[.5cm]
106 | \end{itemize}
107 | Der Inhalt des Aggregators wird in einem \textit{Tupel} gespeichert:
108 | \lstinputlisting[firstline=1, lastline=2]{resources/07_funtions_advanced/positional_aggregators.py}
109 | \end{frame}
110 |
111 | \begin{frame}{Positionale Aggregatoren - Beispiel}
112 | \lstinputlisting[firstline=5]{resources/07_funtions_advanced/positional_aggregators.py}
113 | \end{frame}
114 |
115 | \begin{frame}[fragile]{Positionale Aggregatoren}
116 | \begin{itemize}
117 | \item Eine Funktion kann auch nur einen Aggregator als Parameter entgegennehmen (keine anderen Parameter)
118 | \item Ohne Argumente ergibt sich f\"ur \texttt{len(args)} 0
119 | \item Werden keine anderen Parameter erwartet, nennt man den Aggregator meist
120 | \texttt{args} (kurz für \textit{Arguments}) \\[.75cm]
121 | \end{itemize}
122 | In \textbf{Python 3} kann man Aggregatoren auch ohne Namen definieren:
123 | \lstinputlisting{resources/07_funtions_advanced/nameless_aggr.py}
124 | Auf diesen Aggregator kann nicht zugegriffen werden. Er erzwingt lediglich, dass
125 | alle folgenden Parameter mit Namen aufgerufen werden.
126 | \end{frame}
127 |
128 |
129 | \subsection{Benannte Aggregatoren}
130 | \begin{frame}[fragile]{Benannte Aggregatoren}
131 | Analog zu Parametern gibt es auch benannte Aggregatoren. Diese werden mit \texttt{**}
132 | vor dem Parameternamen definiert. Diese Aggregatoren akzeptieren lediglich
133 | benannte Parameter und sind vom Typ \texttt{dict}.
134 | \end{frame}
135 |
136 | \begin{frame}[fragile]{Benannte Aggregatoren - Beispiel}
137 | \lstinputlisting{resources/07_funtions_advanced/named_aggr.py} \ \\[.75cm]
138 | Wenn eine Funktion keine anderen Parameter erwartet, nennt man den Aggregator meist
139 | \texttt{**kwargs} (kurz für \textit{Keyword Arguments})
140 | \end{frame}
141 |
142 |
143 | \subsection{Benannte und Positionale Aggregatoren}
144 | \begin{frame}{Benannte und Positionale Aggregatoren}
145 | Beide Aggregatoren können gleichzeitig in einer Funktion verwendet werden.
146 | Die Regel dabei ist: Von jeder Sorte nur \textit{ein} Aggregator. \\[.5cm]
147 | Ein Beispiel:
148 | \lstinputlisting[firstline=12, lastline=18]{resources/07_funtions_advanced/mixed_aggr.py}
149 | \textit{Eckige Klammern stehen für optionale Parameter/Namen.}
150 | \end{frame}
151 |
152 | \begin{frame}{Generelle Funktionsstruktur}
153 | Wenn beide Aggregatoren zum Einsatz kommen sollen, ergibt sich folgende Funktionsstruktur: \\[.25cm]
154 | \lstinputlisting[firstline=1, lastline=9]{resources/07_funtions_advanced/mixed_aggr.py}
155 |
156 | \end{frame}
157 |
158 | % nothing to do from here on
159 | \end{document}
160 |
--------------------------------------------------------------------------------
/latex/slides/08_process.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | \title{Subprozesse in Python}
9 | \date{\today}
10 |
11 |
12 | \begin{document}
13 |
14 | \maketitle
15 |
16 | \begin{frame}{Gliederung}
17 | \begin{multicols}{2}
18 | \setbeamertemplate{section in toc}[sections numbered]
19 | \tableofcontents
20 | \end{multicols}
21 | \end{frame}
22 |
23 |
24 | \section{Grundlagen}
25 | \begin{frame}[fragile]{Das Modul subprocess}
26 | Das Modul \alert{subprocess} erlaubt die Ausf\"uhrung externer Befehle und
27 | Skripte von einem Python Skript aus. Man kann sich die Funktionsweise \"ahnlich
28 | der eines Terminals vorstellen.
29 | \end{frame}
30 |
31 |
32 | \subsection{Eigenschaften}
33 | \begin{frame}[fragile]{Eigenschaften}
34 | \begin{itemize}
35 | \item Subprozesse laufen \alert{asynchron}
36 | \item Sie laufen direkt auf dem System, nicht in einer Shell
37 | (wenn nicht anders festgelegt)
38 | \item Verf\"ugbare Programme h\"angen vom System ab, auf dem sie ausgef\"uhrt werden
39 | \item Der Aufruf ist allgemeing\"ultig, die Bibliothek verwandelt den
40 | Aufruf unter Windows in einen kompatiblen \texttt{CreateProcess()} String
41 | \end{itemize}
42 | \end{frame}
43 |
44 |
45 | \section{Konstanten}
46 | \subsection{File Descriptoren}
47 | \begin{frame}{File Descriptoren}
48 | \begin{description}
49 | \item[DEVNULL] Der systeminterne 'M\"ulleimer'
50 | \item[PIPE] Die Verbindung zwischen zwei Prozessen
51 | \item[STDOUT] Die Standardausgabe oder der laufende Prozess
52 | \end{description}
53 | \end{frame}
54 |
55 | \subsection{Exceptions}
56 | \begin{frame}[fragile]{Exceptions}
57 | \begin{description}
58 | \item[\texttt{SubprocessError}] Der Standardfehler dieses Moduls
59 | \item[\texttt{TimeoutError}] Ein Timeout ist aufgetreten
60 | \item[\texttt{CalledProcessError}] Der Subprozess endete auf eine unerwartete Art
61 | \end{description}
62 | \end{frame}
63 |
64 |
65 | \section{Popen Klasse}
66 | \begin{frame}[fragile]{Die Popen Klasse}
67 | Die \texttt{Popen} Klasse bildet die Basis des Moduls \texttt{subprocess}. \\
68 | Die Funktionssignatur sieht wie folgt aus:
69 | \lstinputlisting{resources/08_process/popen_call.py}
70 | \end{frame}
71 |
72 | \subsection{Wichtige Argumente}
73 | \begin{frame}[fragile]{Einige wichtige Argumente}
74 | \begin{description}
75 | \item[\texttt{args}] Die aufzurufenden Argumente. Sollten vom Typ
76 | \alert{tuple} oder \alert{list} sein. Im Prinzip splittet man den
77 | Konsolenbefehl an den Leerzeichen: \\
78 | \texttt{ls -A *.md} entspricht \texttt{['ls', '-A', '*.md']}
79 | \item[\texttt{shell}] F\"uhrt den Befehl in einer Shell aus.
80 | Sollte \texttt{False} sein (Standard), sonst ist der Aufruf unsicher.
81 | \item[\texttt{stdout}] zusammen mit \texttt{stdin} und \texttt{stderr} die Input- und
82 | Output-Verbindungen des Subprozesses \\
83 | (hier sind \texttt{DEVNULL}, \texttt{PIPE} und \texttt{STDOUT} n\"utzlich)
84 | \item[\texttt{env}] Umgebungsvariablen des Kindprozesses. Standard ist ein
85 | Subset von \texttt{os.environ} (dem Python Prozess Environment)
86 | \item[\texttt{cwd}] Das Arbeitsverzeichnis des Subprozesses
87 | \end{description}
88 | \end{frame}
89 |
90 |
91 | \section{Popen Objekte}
92 | \begin{frame}{Popen Objekte}
93 | Wenn Popen instanziiert wird, wird der darin enthaltene Prozess gestartet und
94 | das zur\"uckgegebene \texttt{Popen} Objekt enth\"alt Informationen \"uber den
95 | laufenden Prozess.
96 | \end{frame}
97 |
98 | \subsection{Informationen sammeln}
99 | \begin{frame}[fragile]{Informationen sammeln}
100 | \begin{itemize}
101 | \item \texttt{process.args} \\
102 | Gibt die Argumente zur\"uck, mit denen der Prozess aufgerufen wurde.
103 | \item \texttt{obj.stdout}, \texttt{obj.stdin}, \texttt{obj.stderr} \\
104 | Input- und Output-Verbindungen, die beim Start gesetzt wurden
105 | \item \texttt{process.pid} \\
106 | Vom System zugewiesene \textit{Prozess ID}.
107 | \item \texttt{process.poll()} \\
108 | Pr\"uft, ob der Prozess beendet wurde. Gibt den \textit{R\"uckgabewert}
109 | des Prozesses zur\"uck oder \texttt{None}, wenn der Prozess noch l\"auft.
110 | \item \texttt{process.returncode} \\
111 | Der R\"uckgabewert von \texttt{process.poll()} (der R\"uckgabewert des Prozesses)
112 | \end{itemize}
113 | \end{frame}
114 |
115 | \subsection{Interaktion mit dem Prozess}
116 | \begin{frame}[fragile]{Interaktion mit dem Prozess}
117 | \begin{itemize}
118 | \item \texttt{process.wait(timeout=None)} \\
119 | Wartet \textit{timeout} Sekunden auf die Terminierung des Prozesses
120 | (wartet unendlich lang, wenn timeout \textit{None} ist). \\
121 | Wirft nach Ablauf von \textit{timeout} eine \texttt{TimeoutExpired} Exception.
122 | \item \texttt{process.send\_signal(signal)} \\
123 | Sendet das Signal \textit{signal} an den Prozess (z.B. \texttt{SIGTERM}).
124 | \item \texttt{process.communicate(input=None, timeout=None)} \\
125 | Schreibt die Daten aus \textit{input} in den Standardinput (\texttt{stdin})
126 | des Prozesses (wenn stdin PIPE ist), wartet auf die Terminierung
127 | des Prozesses und liest die Daten, die der Prozess in \texttt{stdout}
128 | geschrieben hat (wenn stdout PIPE ist). \textit{timeout} funktioniert wie oben.
129 | \end{itemize}
130 | \end{frame}
131 |
132 | \begin{frame}[fragile]{Interaktion mit dem Prozess}
133 | \begin{itemize}
134 | \item \texttt{process.terminate()} \\
135 | Sendet ein Terminationssignal an den Prozess (\texttt{SIGTERM}).
136 | \item \texttt{process.kill()} \\
137 | Erzwingt die Beendigung des Prozesses (\texttt{SIGKILL}).
138 | \end{itemize}
139 | \end{frame}
140 |
141 | \subsection{Nutzung des Kontextmanagers}
142 | \begin{frame}{Popen im Kontextmanager}
143 | Popen kann mit dem Kontextmanager verwendet werden (siehe \textit{File Handling}). \\
144 | Der Code daf\"ur w\"urde wie folgt aussehen:
145 | \lstinputlisting{resources/08_process/context_mgr.py}
146 | \end{frame}
147 |
148 | \section{N\"utzliche Funktionen}
149 | \begin{frame}[fragile]{N\"utzliche Funktionen}
150 | \texttt{subprocess} enth\"alt einige Kurzfassungen f\"ur h\"aufig genutzte Arbeitsabl\"aufe.
151 | Intern rufen diese allerdings auch nur \texttt{Popen} auf.
152 | \end{frame}
153 |
154 | \begin{frame}[fragile]{run}
155 | Die wohl n\"utzlichste Funktion ist \texttt{subprocess.run()}:
156 | \lstinputlisting[lastline=2]{resources/08_process/defs.py}
157 | \begin{itemize}
158 | \item eingef\"uhrt in Python 3.5
159 | \item ruft durch \texttt{args} definierten Prozess auf
160 | \item wartet auf Beendigung des Prozesses (wenn \textit{timeout} \texttt{None} ist)
161 | \item gibt ein \texttt{CompletedProcess} Objekt zur\"uck
162 | \item \textbf{Beachte:} Einsatz eines unbenannten Aggregators
163 | \end{itemize}
164 | \end{frame}
165 |
166 | \begin{frame}[fragile]{CompletedProcess Objekt}
167 | Ist der Rückgabewert von \texttt{run()}, der zur\"uckgegeben wird, wenn der Prozess beendet wurde.
168 | Enth\"alt folgende Eigenschaften: \\[.25cm]
169 | \begin{description}
170 | \item[\texttt{args}] Argumente, mit denen der Prozess aufgerufen wurde.
171 | \item[\texttt{returncode}] R\"uckgabewert des Prozesses
172 | \item[\texttt{stdout}] Ausgabe des Prozesses
173 | \item[\texttt{stderr}] stderr Output des Prozesses \\[.5cm]
174 | \end{description}
175 | Au{\ss}erdem gibt es die Funktion \texttt{check\_returncode()}, die einen \texttt{CalledProcessError}
176 | beim Aufruf wirft, wenn der R\"uckgabewert nicht 0 ist.
177 | \end{frame}
178 |
179 | \begin{frame}[fragile]{call}
180 | \lstinputlisting[firstline=5, lastline=6]{resources/08_process/defs.py}
181 | \begin{itemize}
182 | \item Ruft einen Prozess auf, wartet auf Terminierung
183 | \item gibt Returncode des Prozesses zur\"uck \\[.5cm]
184 | \end{itemize}
185 | Diese Funktion macht das selbe, wie \\
186 | \hspace*{1.5cm}\texttt{run(...).returncode}, \\
187 | nur dass \textit{check} und \textit{input} nicht unterst\"utzt werden.
188 | \end{frame}
189 |
190 | \begin{frame}[fragile]{check\_call}
191 | Argumente entsprechen den Argumenten von \texttt{call()}.
192 | \begin{itemize}
193 | \item Ruft Prozess auf, wartet auf Terminierung
194 | \item gibt nichts zur\"uck, wenn Ausf\"uhrung erfolgreich (Returncode == 0)
195 | \item wenn Aufruf nicht erfolgreich, wird \texttt{CalledProcessError} geworfen \\[.5cm]
196 | \end{itemize}
197 | Diese Funktion macht das selbe, wie \\
198 | \hspace*{1.5cm}\texttt{run(..., check=True)}, \\
199 | nur dass \textit{input} nicht unterst\"utzt wird.
200 | \end{frame}
201 |
202 | \begin{frame}[fragile]{check\_output}
203 | \lstinputlisting[firstline=9]{resources/08_process/defs.py}
204 | \begin{itemize}
205 | \item f\"uhrt Kommando aus und gibt den Prozessoutput zur\"uck
206 | \item wirft ebenfalls \texttt{CalledProcessError}, wenn der Returncode nicht 0 ist \\[.5cm]
207 | \end{itemize}
208 | Diese Funktion macht das selbe, wie \\
209 | \hspace*{1.5cm}\texttt{run(..., check=True, stdout=PIPE).stdout}
210 | \end{frame}
211 |
212 | % nothing to do from here on
213 | \end{document}
214 |
--------------------------------------------------------------------------------
/latex/slides/09_web_client.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | % TODO Change the topic of the lesson
9 | \title{Python als Webclient}
10 | \date{\today}
11 |
12 |
13 | \begin{document}
14 |
15 | \maketitle
16 |
17 | \begin{frame}{Gliederung}
18 | \setbeamertemplate{section in toc}[sections numbered]
19 | \tableofcontents
20 | \end{frame}
21 |
22 |
23 | \begin{frame}[fragile]{Das Package urllib}
24 | Das Package \texttt{urllib} ist eine nützliche Sammlung mehrerer Module
25 | zur Arbeit mit URLs.
26 | \end{frame}
27 |
28 |
29 | \section{urllib.request}
30 | \begin{frame}[fragile]{urllib.request}
31 | Das Modul \alert{\texttt{urllib.request}} enthält Funktionen und Klassen, welche
32 | beim Öffnen von URLs (vor allem über HTTP) helfen. \\[.5cm]
33 | Unterstützt werden:
34 | \begin{itemize}
35 | \item verschiedene Authentifizierungsarten
36 | \item Weiterleitungen
37 | \item Cookies
38 | \item und mehr...
39 | \end{itemize}
40 | \end{frame}
41 |
42 | \subsection{Öffnen einer URL}
43 | \begin{frame}[fragile]{Öffnen einer URL}
44 | Das Öffnen einer URL wird über die Funktion \alert{\texttt{urlopen()}} realisiert:
45 | \lstinputlisting[lastline=5]{resources/09_web_client/urllib_calls.py}
46 | \end{frame}
47 |
48 | \begin{frame}[fragile]{Öffnen einer URL}
49 | \begin{description}
50 | \item[\textbf{url}] ein String für simple URLs oder ein \texttt{Request} Objekt für komplexere Anfragen
51 | \item[\textbf{data}] Daten, die an den Server gesendet werden sollen. \\
52 | vom Typ \texttt{bytes} oder ein Iterable von \texttt{bytes} Objekten \\[.75cm]
53 | \end{description}
54 | \textbf{Rückgabewerte}
55 | \begin{description}
56 | \item bei URLs mit http-Requests \\
57 | \hspace*{1cm}\texttt{httplib.client.HTTPResponse} Objekt
58 | \item bei ftp, file und data \\
59 | \hspace*{1cm}\texttt{urllib.addinfourl} Objekt
60 | \end{description}
61 | \end{frame}
62 |
63 | \subsection{Request Klasse}
64 | \begin{frame}{Request Klasse}
65 | Um komplexere Anfragen stellen zu können, kann man Request Objekte verwenden:
66 | \lstinputlisting[firstline=8, lastline=10]{resources/09_web_client/urllib_calls.py}
67 | \end{frame}
68 |
69 | \begin{frame}{Request Klasse}
70 | \begin{description}
71 | \item[\textbf{url}] muss String mit gültiger URl sein
72 | \item[\textbf{data}] wie bei \textit{urlopen}
73 | \item[\textbf{headers}] \texttt{dict} mit \texttt{\{Header-Name : Header-Value, ...\}} oder \\
74 | \texttt{list} von Tupeln mit \texttt{[(Header-Name, Header-Value), ...]}
75 | \item[\textbf{method}] String, der Art des HTTP Request angibt (\texttt{HEAD}, \texttt{GET}, \texttt{POST}, ...)
76 | \end{description}
77 | \end{frame}
78 |
79 | \begin{frame}{Beispiel}
80 | \lstinputlisting{resources/09_web_client/req_example.py} \ \\[.5cm]
81 | Die Request Klasse kann man Verwenden zum:
82 | \begin{itemize}
83 | \item Kontrollieren der gesendeten Header \textit{(z.B. Content-Type oder User-Agent)}
84 | \item Kontrollieren der Method \texttt{POST}, \texttt{PUT} oder \texttt{HEAD}
85 | % TODO
86 | \end{itemize}
87 | \end{frame}
88 |
89 | \subsection{HTTPResponse Klasse}
90 | \begin{frame}[fragile]{HTTPResponse Klasse}
91 | Objekte dieser Klasse werden nicht direkt vom User erstellt.
92 | \lstinputlisting[firstline=13]{resources/09_web_client/urllib_calls.py} \ \\[.5cm]
93 | Klasse enthält Funktionen und Variablen wie:
94 | \begin{itemize}
95 | \item \texttt{read()} - gibt zurückgelieferten Inhalt zurück
96 | \item \texttt{getheader()} oder \texttt{getheaders()} liefert einen/alle Header zurück
97 | \item \texttt{status} gibt den HTTP Statuscode zurück
98 | \item \texttt{version} gibt die HTTP Version zurück
99 | \end{itemize}
100 | \end{frame}
101 |
102 |
103 | \section{Andere Module}
104 | \begin{frame}[fragile]{Andere Module}
105 | Das Package \alert{\texttt{urllib}} enthält au{\ss}erdem folgende Module:
106 | \begin{itemize}
107 | \item \texttt{urllib.error} \ \\
108 | Enthält Exceptions, die von \texttt{urllib.request} geworfen werden.
109 | \item \texttt{urllib.parse} \ \\
110 | Zum Parsen von URLs.
111 | \item \texttt{urllib.robotparse} \ \\
112 | Zum Parsen der \textit{robots.txt} von Webseiten.
113 | \end{itemize}
114 | \end{frame}
115 |
116 |
117 | \section{Das Requests-Modul}
118 | \subsection{Installation}
119 | \begin{frame}{Das Requests Modul}
120 | Das Requests Modul ist eine gute und für Menschen verständliche Alternative
121 | zu \texttt{urllib.requests}, das HTTP Requests vereinfacht. \\[.75cm]
122 |
123 | Das Requests Package lässt sich ganz einfach über \textbf{pip} installieren: \\
124 | \texttt{pip install requests}
125 | \end{frame}
126 |
127 | \begin{frame}{Beispiel}
128 | \lstinputlisting{resources/09_web_client/requests_example.py} \ \\[.5cm]
129 | Ruft die API-Seite von \textbf{GitHub} auf und authentifiziert sich mit Nutzername und Passwort.
130 | \end{frame}
131 |
132 | % nothing to do from here on
133 | \end{document}
134 |
--------------------------------------------------------------------------------
/latex/slides/11_smtplib.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | % TODO Change the topic of the lesson
9 | \title{Mails in Python senden}
10 | \date{\today}
11 |
12 |
13 | \begin{document}
14 |
15 | \maketitle
16 |
17 | \begin{frame}{Gliederung}
18 | \setbeamertemplate{section in toc}[sections numbered]
19 | \tableofcontents
20 | \end{frame}
21 |
22 | \begin{frame}
23 | Die folgenden Folien enthalten eine praktische Anleitung zum Senden von Mails in Python.
24 | \end{frame}
25 |
26 |
27 | \section{Grundlagen: Mails senden}
28 | \subsection{Das Modul \texttt{smtplib}}
29 | \begin{frame}[fragile]{Das Modul \texttt{smtplib}}
30 | Das Modul \texttt{\alert{smtplib}} definiert eine SMTP\textbf{*}-Client Session, die genutzt werden kann, um von jedem beliebigen, internetf\"ahigen Ger\"at E-Mails zu verschicken. \\[1cm]
31 |
32 | \textbf{*}\textit{SMTP} steht für \textbf{S}imple \textbf{M}ail \textbf{T}ransfer
33 | \textbf{P}rotocol und ist das Standard-Protokoll zum E-Mail Versand.
34 | \end{frame}
35 |
36 | \begin{frame}[fragile]{Verbindung zum Server}
37 | Die smtplib kann sich zu einem SMTP-Server verbinden\\[.5cm]
38 | \lstinputlisting[firstline=3, lastline=3]{resources/11_sendmail/defs.py}
39 |
40 | \ \\[.25cm]
41 | Der Server kann zum einen als einheitlicher \texttt{String} (inkl. Port) oder einzeln als \texttt{host} und \texttt{port} angeben werden.
42 | \end{frame}
43 |
44 | \begin{frame}[fragile]{Login auf dem Server}
45 | Heutzutage arbeiten die meisten SMTP-Server mit \texttt{TLS}, um eine sichere Verbindung zu gewährleisten. Diese muss mithilfe der Methode \texttt{\alert{starttls()}} hergestellt werden.\\[.25cm]
46 | Der eigentliche Login erfolgt im Anschluss durch:\\[.25cm]
47 | \lstinputlisting[firstline=5, lastline=5]{resources/11_sendmail/defs.py}
48 | \ \\[.25cm]
49 | Der Parameter \texttt{initial\_response\_ok} kann in unserem Fall vernachlässigt werden.
50 | \end{frame}
51 |
52 | \begin{frame}[fragile]{Senden der Mail}
53 | Das tatsächliche Versenden der Mail funktioniert dann mit folgender Methode:\\[.25cm]
54 | \lstinputlisting[firstline=7]{resources/11_sendmail/defs.py}
55 | \ \\[.25cm]
56 | Jedoch l\"asst sich das ganze auch mit einem \texttt{MIME}-Objekt vereinfachen, auf das später noch eingegangen wird. \\
57 | Dieses wird mit \texttt{\alert{send\_message()}} versendet.
58 | \end{frame}
59 |
60 | \begin{frame}{Schließen der Verbindung}
61 | Zum Schluss darf nicht vergessen werden, die Verbindung zum SMTP-Server wieder zu schließen.\\
62 | Dies geschieht mit der Methode \texttt{\alert{quit()}} oder man stellt die Verbindung mithilfe eines \textit{Filehandlers} her.
63 | \end{frame}
64 |
65 | \begin{frame}[fragile]{Die vollst\"andige Serverkommunikation}
66 | \lstinputlisting[linerange={3-3,19-34}]{resources/11_sendmail/mailer.py}
67 | %\ \\[1cm]
68 | Auf \texttt{buildmessage()} wird im folgenden Teil eingegangen.
69 | \end{frame}
70 |
71 | \section{Komplexere Mails senden}
72 | \subsection{Das Modul \texttt{email}}
73 | \begin{frame}[fragile]{Das Modul \texttt{email}}
74 | Um mehr Möglichkeiten zur Gestaltung der E-Mail zu haben, lohnt sich die Verwendung des Moduls \texttt{email}.\\[.5cm]
75 | Mit \texttt{\alert{email.mime}} lassen sich Emails individuell bauen und zusammensetzen. Außerdem kann man mehrteilige Mails und Mails mit Anhängen (z.B. Bildern) erstellen.
76 | \end{frame}
77 |
78 | \begin{frame}[fragile]{Die Klasse \texttt{MIMEText}}
79 | Die Klasse \texttt{email.mime.text.MIMEText()} erstellt ein MIME Objekt, welches hautps\"achlich aus Text besteht und einfach dem SMTP-Objekt \"ubergeben werden kann: \\ \ \\
80 | \lstinputlisting[lastline=1]{resources/11_sendmail/defs.py} \ \\
81 |
82 | \begin{description}
83 | \item[\_text] Ein String, der den Inhalt der Nachricht enth\"alt.
84 | \item[\_subtype] Der Untertyp des Objekts, per default \texttt{plain}
85 | \item[charset] Der Zeichensatz, der zur Kodierung der Zeichen verwendet werden soll. Standardm\"a\ss{}ig \texttt{us-ascii} oder \texttt{utf8}, abh\"angig von dem eingegebenen Text.
86 | \end{description}
87 | \end{frame}
88 |
89 | \begin{frame}[fragile]{Die Meta-Felder}
90 | Wenn das \texttt{MIMEText} Objekt instanziiert ist, muss dieses mit weiteren Informationen erg\"anzt werden:
91 | \lstinputlisting[firstline=10,lastline=15]{resources/11_sendmail/mailer.py}
92 | \begin{description}
93 | \item[From] Daten des Absenders (nur Mail oder Name und Mail)
94 | \item[To] Daten des Empfängers (nur Mail oder Name und Mail)
95 | \item[Subject] Betreff der Mail
96 | \end{description}
97 | Die Message l\"asst sich au\ss{}erdem noch um einen \texttt{Cc} oder einen \texttt{Bcc} erweitern.
98 | \end{frame}
99 |
100 | \begin{frame}{Das fertige Mail-Skript}
101 | \lstinputlisting[firstline=4,lastline=17]{resources/11_sendmail/mailer.py}
102 | \end{frame}
103 |
104 | % nothing to do from here on
105 | \end{document}
106 |
--------------------------------------------------------------------------------
/latex/slides/12_curses.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | \title{\texttt{ncurses} in Python}
9 | \date{\today}
10 |
11 |
12 | \begin{document}
13 |
14 | \maketitle
15 |
16 | \begin{frame}{Gliederung}
17 | \setbeamertemplate{section in toc}[sections numbered]
18 | \tableofcontents
19 | \end{frame}
20 |
21 |
22 |
23 | \section{Das Modul \texttt{curses}}
24 |
25 | \begin{frame}{Das Modul \texttt{curses}}
26 | \texttt{\alert{curses}} bietet ein Interface für die \glqq{}curses\grqq{}-Bibliothek, den de-facto Standard für fortgeschrittenes Terminal Handling.
27 | \end{frame}
28 |
29 | \begin{frame}{Das Modul \texttt{curses}}
30 | \begin{itemize}
31 | \item curses ist vor allem in Unix-Umgebungen weit verbreitet
32 | \item dieses Modul wurde auf die API von \emph{ncurses}, einer Open-Source Library für curses, zugeschnitten und funktioniert nur unter Linux und BSD Varianten von Unix
33 | \end{itemize}
34 | \end{frame}
35 |
36 | \begin{frame}{Mitgelieferte Submodule}
37 | \begin{description}
38 | \item [\texttt{curses.ascii}] zur Arbeit mit ASCII-kodierten Zeichen
39 | \item [\texttt{curses.panel}] Support für Panels, also mehrere Fenster übereinander (Fenster mit Ebenen)
40 | \item [\texttt{curses.textpad}] Widget zum editieren von Text mit \emph{emacs}-artigen Key-Bindings
41 | \end{description}
42 | \end{frame}
43 |
44 |
45 | \section{Erstellen eines simplen Fensters}
46 |
47 | \subsection{Grundlegende Funktionen}
48 |
49 | \begin{frame}{Grundlegende Funktionen}
50 | Zum Erstellen eines \texttt{curses}-Fensters benutzt man den Befehl
51 |
52 | \lstinputlisting[lastline=1]{resources/12_curses/functions.py}
53 |
54 | \begin{itemize}
55 | \item instanziiert die Bibliothek, gibt ein \texttt{WindowObject} zurück, welches den gesamten Screen repräsentiert
56 | \item Fehler beim Terminal öffnen können zum Beenden des Interpreters führen!
57 | \end{itemize}
58 | \end{frame}
59 |
60 | \begin{frame}{Grundlegende Funktionen}
61 | \lstinputlisting[firstline=3, lastline=3]{resources/12_curses/functions.py}
62 |
63 | \begin{itemize}
64 | \item deinitialisiert Bibliothek
65 | \item führt Terminal in normalen Zustand zurück
66 | \end{itemize}
67 | \end{frame}
68 |
69 | \begin{frame}
70 | \texttt{curses} liefert einen eigenen Wrapper zum Starten und Beenden:
71 |
72 | \lstinputlisting[firstline=5, lastline=5]{resources/12_curses/functions.py}
73 |
74 | \begin{itemize}
75 | \item setzt nützliche Standards, initialisiert curses und ruft \emph{func} auf
76 | \item Wrapper fängt Exceptions, stellt Terminal wieder her und wirft Exception erneut
77 | \item \emph{func} muss \alert{\texttt{stdscr}} als erstes Argument akzeptieren (für das \texttt{WindowObject})
78 | \end{itemize}
79 | \end{frame}
80 |
81 |
82 | \subsection{Darstellen von Symbolen}
83 |
84 | \begin{frame}{Darstellen von Symbolen}
85 | Zur Darstellung einzelner Symbole verwendet man \texttt{addch}:
86 |
87 | \lstinputlisting[firstline=7, lastline=8]{resources/12_curses/functions.py}
88 |
89 | \begin{description}
90 | \item [\texttt{ch}] zu schreibendes ASCII-Zeichen (im ASCII-Format!) \\ Zum konvertieren ggf. auf \texttt{ord()} zurück greifen.
91 | \item [\texttt{y, x}] Koordinaten, an die das Zeichen geschrieben wird. Beachte invertierte Reihenfolge!
92 | \item [\texttt{attr}] zu setzende Attribute
93 | \end{description}
94 | \end{frame}
95 |
96 | \begin{frame}{Darstellen von Symbolen}
97 | Zum Darstellen eines Strings existiert die Funktion \texttt{addstr()}:
98 |
99 | \lstinputlisting[firstline=10, lastline=11]{resources/12_curses/functions.py}
100 |
101 | \begin{itemize}
102 | \item fügt ab \texttt{(y, x)} den gegebenen String ein
103 | \item überschreibt alle vorher vorhandenen Zeichen
104 | \end{itemize}
105 | \end{frame}
106 |
107 |
108 | \begin{frame}{Zeichen entfernen}
109 | \lstinputlisting[firstline=13, lastline=15]{resources/12_curses/functions.py}
110 |
111 | \begin{itemize}
112 | \item Funktionen zum löschen einzelner Zeichen, einer ganzen Zeile oder dem gesamten Fenster
113 | \end{itemize}
114 | \end{frame}
115 |
116 |
117 | \subsection{Allgemeine Hinweise}
118 |
119 | \begin{frame}{Allgemeine Hinweise}
120 | \begin{itemize}
121 | \item Werden bei Funktionen \texttt{x} und \texttt{y} weg gelassen und sind optional, wird die Funktion an der aktuellen Cursorstelle ausgeführt.
122 | \item Beachte die invertierte Zählweise!
123 | \begin{itemize}
124 | \item Punkt (0, 0) liegt oben links in der Ecke vom Terminal
125 | \item x zählt von da nach rechts aufwärts
126 | \item y zählt von da nach unten aufwärts
127 | \end{itemize}
128 | \end{itemize}
129 | \end{frame}
130 |
131 | \section{Arbeiten mit \texttt{curses.textpad}}
132 | \begin{frame}{\texttt{rectangle}}
133 | \lstinputlisting[firstline=17, lastline=17]{resources/12_curses/functions.py}
134 | \begin{itemize}
135 | \item erzeugt im WindowObject \texttt{win} ein Rechteck
136 | \item Anfangspunkt ist (\texttt{ulx}, \texttt{uly}) (ul $\hat=$ upper left corner)
137 | \item Endpunkt ist (\texttt{lrx}, \texttt{lry}) (lr $\hat=$ lower right corner)
138 | \end{itemize}
139 | \end{frame}
140 |
141 | \begin{frame}{\texttt{Textbox}}
142 | \lstinputlisting[firstline=19, lastline=23]{resources/12_curses/functions.py}
143 | \begin{itemize}
144 | \item Eine \texttt{Textbox} wird mit einem WindowObject erstellt und hat diese drei Funktionen
145 | \item \texttt{edit()} \glqq{}Editormodus\grqq{} wobei \texttt{validator} eine Funktion ist
146 | \item \texttt{do\_command()} f\"uhrt einen Befehl aus \href{http://bit.ly/29sJ8QJ}{(Link hier)}
147 | \item \texttt{gather()} gibt den Inhalt der Textbox zur\"uck
148 | \end{itemize}
149 | \end{frame}
150 |
151 |
152 | \end{document}
153 |
--------------------------------------------------------------------------------
/latex/slides/beamercolorthememetropolis.sty:
--------------------------------------------------------------------------------
1 | %%
2 | %% This is file `beamercolorthememetropolis.sty',
3 | %% generated with the docstrip utility.
4 | %%
5 | %% The original source files were:
6 | %%
7 | %% beamercolorthememetropolis.dtx (with options: `package')
8 | %% ---------------------------------------------------------------------------
9 | %% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
10 | %% contributors can be found at
11 | %%
12 | %% https://github.com/matze/mtheme/graphs/contributors
13 | %%
14 | %% and the original template was based on the HSRM theme by Benjamin Weiss.
15 | %%
16 | %% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
17 | %% International License (https://creativecommons.org/licenses/by-sa/4.0/).
18 | %% ---------------------------------------------------------------------------
19 | \NeedsTeXFormat{LaTeX2e}
20 | \ProvidesPackage{beamercolorthememetropolis}[2016/02/21 Metropolis color theme]
21 | \RequirePackage{pgfopts}
22 | \pgfkeys{
23 | /metropolis/color/block/.cd,
24 | .is choice,
25 | transparent/.code=\metropolis@block@transparent,
26 | fill/.code=\metropolis@block@fill,
27 | }
28 | \pgfkeys{
29 | /metropolis/color/background/.cd,
30 | .is choice,
31 | dark/.code=\metropolis@colors@dark,
32 | light/.code=\metropolis@colors@light,
33 | }
34 | \newcommand{\metropolis@color@setdefaults}{
35 | \pgfkeys{/metropolis/color/.cd,
36 | background=light,
37 | block=transparent,
38 | }
39 | }
40 | \definecolor{mDarkBrown}{HTML}{604c38}
41 | \definecolor{mDarkTeal}{HTML}{23373b}
42 | \definecolor{mLightBrown}{HTML}{EB811B}
43 | \definecolor{mLightGreen}{HTML}{14B03D}
44 | \newcommand{\metropolis@colors@dark}{
45 | \setbeamercolor{normal text}{%
46 | fg=black!2,
47 | bg=mDarkTeal
48 | }
49 | }
50 | \newcommand{\metropolis@colors@light}{
51 | \setbeamercolor{normal text}{%
52 | fg=mDarkTeal,
53 | bg=black!2
54 | }
55 | }
56 | \setbeamercolor{alerted text}{%
57 | fg=mLightBrown
58 | }
59 | \setbeamercolor{example text}{%
60 | fg=mLightGreen
61 | }
62 | \setbeamercolor{titlelike}{use=normal text, parent=normal text}
63 | \setbeamercolor{author}{use=normal text, parent=normal text}
64 | \setbeamercolor{date}{use=normal text, parent=normal text}
65 | \setbeamercolor{institute}{use=normal text, parent=normal text}
66 | \setbeamercolor{structure}{use=normal text, fg=normal text.fg}
67 | \setbeamercolor{palette primary}{%
68 | use=normal text,
69 | fg=normal text.bg,
70 | bg=normal text.fg
71 | }
72 | \setbeamercolor{frametitle}{%
73 | use=palette primary,
74 | parent=palette primary
75 | }
76 | \setbeamercolor{progress bar}{%
77 | use=alerted text,
78 | fg=alerted text.fg,
79 | bg=alerted text.fg!50!black!30
80 | }
81 | \setbeamercolor{title separator}{
82 | use=progress bar,
83 | parent=progress bar
84 | }
85 | \setbeamercolor{progress bar in head/foot}{%
86 | use=progress bar,
87 | parent=progress bar
88 | }
89 | \setbeamercolor{progress bar in section page}{
90 | use=progress bar,
91 | parent=progress bar
92 | }
93 | \newcommand{\metropolis@block@transparent}{
94 | \setbeamercolor{block title}{%
95 | use=normal text,
96 | fg=normal text.fg,
97 | bg=
98 | }
99 | \setbeamercolor{block body}{
100 | bg=
101 | }
102 | }
103 | \newcommand{\metropolis@block@fill}{
104 | \setbeamercolor{block title}{%
105 | use=normal text,
106 | fg=normal text.fg,
107 | bg=normal text.bg!80!fg
108 | }
109 | \setbeamercolor{block body}{
110 | use={block title, normal text},
111 | bg=block title.bg!50!normal text.bg
112 | }
113 | }
114 | \setbeamercolor{block title alerted}{%
115 | use={block title, alerted text},
116 | bg=block title.bg,
117 | fg=alerted text.fg
118 | }
119 | \setbeamercolor{block title example}{%
120 | use={block title, example text},
121 | bg=block title.bg,
122 | fg=example text.fg
123 | }
124 | \setbeamercolor{block body alerted}{use=block body, parent=block body}
125 | \setbeamercolor{block body example}{use=block body, parent=block body}
126 | \setbeamercolor{footnote}{fg=normal text.fg!90}
127 | \setbeamercolor{footnote mark}{fg=.}
128 | \metropolis@color@setdefaults
129 | \ProcessPgfPackageOptions{/metropolis/color}
130 | \mode
131 | \endinput
132 | %%
133 | %% End of file `beamercolorthememetropolis.sty'.
134 |
--------------------------------------------------------------------------------
/latex/slides/beamercolorthemesolarized.sty:
--------------------------------------------------------------------------------
1 | % Beamer Color Theme using the Solarized Palette,
2 | % http://ethanschoonover.com/solarized.
3 | %
4 | % Copyright 2012 Jeffrey B. Arnold
5 | %
6 | % This program is free software: you can redistribute it and/or modify
7 | % it under the terms of the GNU General Public License as published by
8 | % the Free Software Foundation, either version 3 of the License, or
9 | % (at your option) any later version.
10 | %
11 | % This program is distributed in the hope that it will be useful,
12 | % but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | % GNU General Public License for more details.
15 | %
16 | % You should have received a copy of the GNU General Public License
17 | % along with this program. If not, see .
18 |
19 | \ProvidesPackage{beamercolorthemesolarized}[2013/10/11 1.0.1 Solarized color theme for beamer]
20 | \RequirePackage{etoolbox}
21 | \RequirePackage{kvoptions}
22 |
23 | %% This is ugly. First time using options and conditionals in LaTeX
24 | \SetupKeyvalOptions{
25 | family=solarized,
26 | prefix=solarized@,
27 | }
28 | \DeclareBoolOption[false]{dark}
29 | \DeclareComplementaryOption{light}{dark}
30 | \DeclareStringOption[yellow]{accent}[yellow]
31 | \ProcessKeyvalOptions*
32 |
33 | % Solarized palette
34 | \definecolor{solarizedBase03}{HTML}{002B36}
35 | \definecolor{solarizedBase02}{HTML}{073642}
36 | \definecolor{solarizedBase01}{HTML}{586e75}
37 | \definecolor{solarizedBase00}{HTML}{657b83}
38 | \definecolor{solarizedBase0}{HTML}{839496}
39 | \definecolor{solarizedBase1}{HTML}{93a1a1}
40 | \definecolor{solarizedBase2}{HTML}{EEE8D5}
41 | \definecolor{solarizedBase3}{HTML}{FDF6E3}
42 | \definecolor{solarizedYellow}{HTML}{B58900}
43 | \definecolor{solarizedOrange}{HTML}{CB4B16}
44 | \definecolor{solarizedRed}{HTML}{DC322F}
45 | \definecolor{solarizedMagenta}{HTML}{D33682}
46 | \definecolor{solarizedViolet}{HTML}{6C71C4}
47 | \definecolor{solarizedBlue}{HTML}{268BD2}
48 | \definecolor{solarizedCyan}{HTML}{2AA198}
49 | \definecolor{solarizedGreen}{HTML}{859900}
50 |
51 | % Set Accent color
52 | % Ugly. Should be done with a switch
53 | \ifdefstring{\solarized@accent}{yellow}{
54 | \colorlet{solarizedAccent}{solarizedYellow}
55 | }{}
56 | \ifdefstring{\solarized@accent}{orange}{
57 | \colorlet{solarizedAccent}{solarizedOrange}
58 | }{}
59 | \ifdefstring{\solarized@accent}{red}{
60 | \colorlet{solarizedAccent}{solarizedRed}
61 | }{}
62 | \ifdefstring{\solarized@accent}{magenta}{
63 | \colorlet{solarizedAccent}{solarizedMagenta}
64 | }{}
65 | \ifdefstring{\solarized@accent}{violet}{
66 | \colorlet{solarizedAccent}{solarizedViolet}
67 | }{}
68 | \ifdefstring{\solarized@accent}{blue}{
69 | \colorlet{solarizedAccent}{solarizedBlue}
70 | }{}
71 | \ifdefstring{\solarized@accent}{cyan}{
72 | \colorlet{solarizedAccent}{solarizedCyan}
73 | }{}
74 | \ifdefstring{\solarized@accent}{green}{
75 | \colorlet{solarizedAccent}{solarizedGreen}
76 | }{}
77 |
78 | %% Set base colors for dark or light versions
79 | %% Dark
80 | % Switch between light and dark themes using the method in the CSS
81 | % stylesheet http://ethanschoonover.com/solarized
82 | \ifboolexpe{ bool {solarized@dark}}{
83 | \colorlet{solarizedRebase03}{solarizedBase03}
84 | \colorlet{solarizedRebase02}{solarizedBase02}
85 | \colorlet{solarizedRebase01}{solarizedBase01}
86 | \colorlet{solarizedRebase00}{solarizedBase00}
87 | \colorlet{solarizedRebase0}{solarizedBase0}
88 | \colorlet{solarizedRebase1}{solarizedBase1}
89 | \colorlet{solarizedRebase2}{solarizedBase2}
90 | \colorlet{solarizedRebase3}{solarizedBase3}
91 | }{
92 | %% Light
93 | \colorlet{solarizedRebase03}{solarizedBase3}
94 | \colorlet{solarizedRebase02}{solarizedBase2}
95 | \colorlet{solarizedRebase01}{solarizedBase1}
96 | \colorlet{solarizedRebase00}{solarizedBase0}
97 | \colorlet{solarizedRebase0}{solarizedBase00}
98 | \colorlet{solarizedRebase1}{solarizedBase01}
99 | \colorlet{solarizedRebase2}{solarizedBase02}
100 | \colorlet{solarizedRebase3}{solarizedBase03}
101 | }
102 |
103 | \mode
104 |
105 | \setbeamercolor{normal text}{fg=solarizedRebase0, bg=solarizedRebase03}
106 | \setbeamercolor{alerted text}{fg=solarizedAccent}
107 | % based css pre element
108 | \setbeamercolor{example text}{fg=solarizedRebase1, bg=solarizedRebase02}
109 |
110 | % Header and footer from CSS
111 | \setbeamercolor{footline}{bg=solarizedRebase02,fg=solarizedRebase01}
112 | \setbeamercolor{headline}{bg=solarizedRebase01,fg=solarizedRebase1}
113 |
114 | % Titles
115 | \setbeamercolor*{titlelike}{fg=solarizedAccent}
116 | \setbeamercolor*{frametitle}{fg=solarizedAccent}
117 | \setbeamercolor*{title}{fg=solarizedAccent}
118 |
119 | % Structure elements use css style for header
120 | \setbeamercolor*{structure}{bg=solarizedRebase01, fg=solarizedRebase1}
121 |
122 | % Do not mess with subtle colors in palette. I don't like it.
123 | \setbeamercolor*{palette primary}{bg=solarizedRebase01, fg=solarizedRebase1}
124 | \setbeamercolor*{palette secondary}{bg=solarizedRebase01, fg=solarizedRebase1}
125 | \setbeamercolor*{palette tertiary}{bg=solarizedRebase01, fg=solarizedRebase1}
126 | \setbeamercolor*{palette quaternary}{bg=solarizedRebase01, fg=solarizedRebase1}
127 |
128 | % Make Blocks slightly lighter/darker
129 | \setbeamercolor{block title}{fg=solarizedAccent, bg=solarizedRebase02}
130 | %\setbeamercolor{block title alerted}{}
131 | %\setbeamercolor{block title example}{}
132 |
133 | \setbeamercolor{block body}{parent=normal text, bg=solarizedRebase02}
134 | % \setbeamercolor{block body alerted}{}
135 | % \setbeamercolor{block body example}{}
136 |
137 | % same as footline
138 | % Set Sidebar and footline to use the css style for footer
139 | \setbeamercolor*{sidebar}{parent=headline}
140 | \setbeamercolor*{palette sidebar primary}{fg=solarizedRebase01, fg=solarizedRebase1}
141 | \setbeamercolor*{palette sidebar secondary}{fg=solarizedRebase01, fg=solarizedRebase1}
142 | \setbeamercolor*{palette sidebar tertiary}{fg=solarizedRebase01, fg=solarizedRebase1}
143 | \setbeamercolor*{palette sidebar quaternary}{fg=solarizedRebase01, fg=solarizedRebase1}
144 |
145 | % border-color for headings
146 | \setbeamercolor{separation line}{fg=solarizedRebase0}
147 | \setbeamercolor{fine separation line}{fg=solarizedRebase0}
148 |
149 | \setbeamercolor*{section in sidebar shaded}{parent=palette sidebar primary}
150 | % a.hover.navlink in CSS
151 | \setbeamercolor*{section in sidebar}{parent=palette sidebar primary, fg=solarizedRebase02}
152 | \setbeamercolor*{subsection in sidebar}{parent=section in sidebar}
153 | \setbeamercolor*{subsection in sidebar shaded}{parent=section in sidebar shaded}
154 |
155 | \mode
156 |
157 |
--------------------------------------------------------------------------------
/latex/slides/beamerinnerthememetropolis.sty:
--------------------------------------------------------------------------------
1 | %%
2 | %% This is file `beamerinnerthememetropolis.sty',
3 | %% generated with the docstrip utility.
4 | %%
5 | %% The original source files were:
6 | %%
7 | %% beamerinnerthememetropolis.dtx (with options: `package')
8 | %% ---------------------------------------------------------------------------
9 | %% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
10 | %% contributors can be found at
11 | %%
12 | %% https://github.com/matze/mtheme/graphs/contributors
13 | %%
14 | %% and the original template was based on the HSRM theme by Benjamin Weiss.
15 | %%
16 | %% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
17 | %% International License (https://creativecommons.org/licenses/by-sa/4.0/).
18 | %% ---------------------------------------------------------------------------
19 | \NeedsTeXFormat{LaTeX2e}
20 | \ProvidesPackage{beamerinnerthememetropolis}[2016/02/21 Metropolis inner theme]
21 | \RequirePackage{etoolbox}
22 | \RequirePackage{calc}
23 | \RequirePackage{pgfopts}
24 | \RequirePackage{tikz}
25 | \pgfkeys{
26 | /metropolis/inner/sectionpage/.cd,
27 | .is choice,
28 | none/.code=\metropolis@sectionpage@none,
29 | simple/.code=\metropolis@sectionpage@simple,
30 | progressbar/.code=\metropolis@sectionpage@progressbar,
31 | }
32 | \newcommand{\metropolis@inner@setdefaults}{
33 | \pgfkeys{/metropolis/inner/.cd,
34 | sectionpage=progressbar,
35 | }
36 | }
37 | \setbeamertemplate{title page}{
38 | \begin{minipage}[b][\paperheight]{\textwidth}
39 | \ifx\inserttitlegraphic\@empty\else\usebeamertemplate*{title graphic}\fi
40 | \vfill%
41 | \ifx\inserttitle\@empty\else\usebeamertemplate*{title}\fi
42 | \ifx\insertsubtitle\@empty\else\usebeamertemplate*{subtitle}\fi
43 | \usebeamertemplate*{title separator}
44 | \ifx\beamer@shortauthor\@empty\else\usebeamertemplate*{author}\fi
45 | \ifx\insertdate\@empty\else\usebeamertemplate*{date}\fi
46 | \ifx\insertinstitute\@empty\else\usebeamertemplate*{institute}\fi
47 | \vfill
48 | \vspace*{1mm}
49 | \end{minipage}
50 | }
51 | \def\maketitle{%
52 | \ifbeamer@inframe
53 | \titlepage
54 | \else
55 | \frame[plain,noframenumbering]{\titlepage}
56 | \fi
57 | }
58 | \def\titlepage{%
59 | \usebeamertemplate{title page}
60 | }
61 | \setbeamertemplate{title graphic}{
62 | \vbox to 0pt {
63 | \vspace*{2em}
64 | \inserttitlegraphic%
65 | }%
66 | \nointerlineskip%
67 | }
68 | \setbeamertemplate{title}{
69 | \raggedright%
70 | \linespread{1.0}%
71 | \inserttitle%
72 | \par%
73 | \vspace*{0.5em}
74 | }
75 | \setbeamertemplate{subtitle}{
76 | \insertsubtitle%
77 | \par%
78 | \vspace*{0.5em}
79 | }
80 | \setbeamertemplate{title separator}{
81 | \begin{tikzpicture}
82 | \draw[fg, fill=fg] (0,0) rectangle (\textwidth, 0.4pt);
83 | \end{tikzpicture}%
84 | \par%
85 | }
86 | \setbeamertemplate{author}{
87 | \vspace*{2em}
88 | \insertauthor%
89 | \par%
90 | \vspace*{0.25em}
91 | }
92 | \setbeamertemplate{date}{
93 | \insertdate%
94 | \par%
95 | }
96 | \setbeamertemplate{institute}{
97 | \vspace*{3mm}
98 | \insertinstitute%
99 | \par%
100 | }
101 | \newcommand{\metropolis@sectionpage@none}{
102 | \AtBeginSection{
103 | % intenionally empty
104 | }
105 | }
106 | \defbeamertemplate{section page}{simple}{
107 | \centering
108 | \usebeamercolor[fg]{section title}
109 | \usebeamerfont{section title}
110 | \insertsectionhead\\
111 | }
112 | \newcommand{\metropolis@sectionpage@simple}{
113 | \setbeamertemplate{section page}[simple]
114 | \AtBeginSection{
115 | \ifbeamer@inframe
116 | \sectionpage
117 | \else
118 | \frame[plain,c,noframenumbering]{\sectionpage}
119 | \fi
120 | }
121 | }
122 | \defbeamertemplate{section page}{progressbar}{
123 | \centering
124 | \begin{minipage}{22em}
125 | \raggedright
126 | \usebeamercolor[fg]{section title}
127 | \usebeamerfont{section title}
128 | \insertsectionhead\\[-1ex]
129 | \usebeamertemplate*{progress bar in section page}
130 | \end{minipage}
131 | \par
132 | \vspace{\baselineskip}
133 | }
134 | \newcommand{\metropolis@sectionpage@progressbar}{
135 | \setbeamertemplate{section page}[progressbar]
136 | \AtBeginSection{
137 | \ifbeamer@inframe
138 | \sectionpage
139 | \else
140 | \frame[plain,c,noframenumbering]{\sectionpage}
141 | \fi
142 | }
143 | }
144 | \newlength{\metropolis@progressonsectionpage}
145 | \setbeamertemplate{progress bar in section page}{
146 | \setlength{\metropolis@progressonsectionpage}{%
147 | \textwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}%
148 | }%
149 | \begin{tikzpicture}
150 | \draw[bg, fill=bg] (0,0) rectangle (\textwidth, 0.4pt);
151 | \draw[fg, fill=fg] (0,0) rectangle (\metropolis@progressonsectionpage, 0.4pt);
152 | \end{tikzpicture}%
153 | }
154 | \def\inserttotalframenumber{100}
155 | \newlength{\metropolis@blocksep}
156 | \newlength{\metropolis@blockadjust}
157 | \setlength{\metropolis@blocksep}{0.75ex}
158 | \setlength{\metropolis@blockadjust}{0.25ex}
159 | \providecommand{\metropolis@strut}{%
160 | \vphantom{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz()}%
161 | }
162 | \newcommand{\metropolis@block}[1]{
163 | \par\vskip\medskipamount%
164 | \setlength{\parskip}{0pt}
165 | \ifbeamercolorempty[bg]{block title}{%
166 | \begin{beamercolorbox}[rightskip=0pt plus 4em]{block title#1}%
167 | }%
168 | {%
169 | \begin{beamercolorbox}[
170 | sep=\dimexpr\metropolis@blocksep-\metropolis@blockadjust\relax,
171 | leftskip=\metropolis@blockadjust,
172 | rightskip=\dimexpr\metropolis@blockadjust plus 4em\relax
173 | ]{block title#1}%
174 | }%
175 | \usebeamerfont*{block title#1}%
176 | \metropolis@strut%
177 | \insertblocktitle%
178 | \metropolis@strut%
179 | \end{beamercolorbox}%
180 | \nointerlineskip%
181 | \ifbeamercolorempty[bg]{block body}{
182 | \begin{beamercolorbox}[vmode]{block body#1}%
183 | }{%
184 | \begin{beamercolorbox}[sep=\metropolis@blocksep, vmode]{block body#1}%
185 | \vspace{-\metropolis@parskip}
186 | }%
187 | \usebeamerfont{block body#1}%
188 | \setlength{\parskip}{\metropolis@parskip}%
189 | }
190 | \setbeamertemplate{block begin}{\metropolis@block{}}
191 | \setbeamertemplate{block alerted begin}{\metropolis@block{ alerted}}
192 | \setbeamertemplate{block example begin}{\metropolis@block{ example}}
193 | \setbeamertemplate{block end}{\end{beamercolorbox}\vspace*{0.2ex}}
194 | \setbeamertemplate{block alerted end}{\end{beamercolorbox}\vspace*{0.2ex}}
195 | \setbeamertemplate{block example end}{\end{beamercolorbox}\vspace*{0.2ex}}
196 | \setbeamertemplate{itemize items}{\textbullet}
197 | \setbeamertemplate{caption label separator}{: }
198 | \setbeamertemplate{caption}[numbered]
199 | \setbeamertemplate{footnote}{%
200 | \parindent 0em\noindent%
201 | \raggedright
202 | \usebeamercolor{footnote}\hbox to 0.8em{\hfil\insertfootnotemark}\insertfootnotetext\par%
203 | }
204 | \newlength{\metropolis@parskip}
205 | \setlength{\metropolis@parskip}{0.5em}
206 | \setlength{\parskip}{\metropolis@parskip}
207 | \linespread{1.15}
208 | \define@key{beamerframe}{c}[true]{% centered
209 | \beamer@frametopskip=0pt plus 1fill\relax%
210 | \beamer@framebottomskip=0pt plus 1fill\relax%
211 | \beamer@frametopskipautobreak=0pt plus .4\paperheight\relax%
212 | \beamer@framebottomskipautobreak=0pt plus .6\paperheight\relax%
213 | \def\beamer@initfirstlineunskip{}%
214 | }
215 | \metropolis@inner@setdefaults
216 | \ProcessPgfPackageOptions{/metropolis/inner}
217 | \endinput
218 | %%
219 | %% End of file `beamerinnerthememetropolis.sty'.
220 |
--------------------------------------------------------------------------------
/latex/slides/beamerouterthememetropolis.sty:
--------------------------------------------------------------------------------
1 | %%
2 | %% This is file `beamerouterthememetropolis.sty',
3 | %% generated with the docstrip utility.
4 | %%
5 | %% The original source files were:
6 | %%
7 | %% beamerouterthememetropolis.dtx (with options: `package')
8 | %% ---------------------------------------------------------------------------
9 | %% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
10 | %% contributors can be found at
11 | %%
12 | %% https://github.com/matze/mtheme/graphs/contributors
13 | %%
14 | %% and the original template was based on the HSRM theme by Benjamin Weiss.
15 | %%
16 | %% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
17 | %% International License (https://creativecommons.org/licenses/by-sa/4.0/).
18 | %% ---------------------------------------------------------------------------
19 | \NeedsTeXFormat{LaTeX2e}
20 | \ProvidesPackage{beamerouterthememetropolis}[2016/02/21 Metropolis outer theme]
21 | \RequirePackage{etoolbox}
22 | \RequirePackage{calc}
23 | \RequirePackage{pgfopts}
24 | \pgfkeys{
25 | /metropolis/outer/numbering/.cd,
26 | .is choice,
27 | none/.code=\setbeamertemplate{frame numbering}[none],
28 | counter/.code=\setbeamertemplate{frame numbering}[counter],
29 | fraction/.code=\setbeamertemplate{frame numbering}[fraction],
30 | }
31 | \pgfkeys{
32 | /metropolis/outer/progressbar/.cd,
33 | .is choice,
34 | none/.code={%
35 | \setbeamertemplate{headline}[plain]
36 | \setbeamertemplate{frametitle}[plain]
37 | \setbeamertemplate{footline}[plain]
38 | },
39 | head/.code={\pgfkeys{/metropolis/outer/progressbar=none}
40 | \addtobeamertemplate{headline}{}{%
41 | \usebeamertemplate*{progress bar in head/foot}
42 | }
43 | },
44 | frametitle/.code={\pgfkeys{/metropolis/outer/progressbar=none}
45 | \addtobeamertemplate{frametitle}{}{%
46 | \usebeamertemplate*{progress bar in head/foot}
47 | }
48 | },
49 | foot/.code={\pgfkeys{/metropolis/outer/progressbar=none}
50 | \addtobeamertemplate{footline}{}{%
51 | \usebeamertemplate*{progress bar in head/foot}%
52 | }
53 | },
54 | }
55 | \newcommand{\metropolis@outer@setdefaults}{
56 | \pgfkeys{/metropolis/outer/.cd,
57 | numbering=counter,
58 | progressbar=none,
59 | }
60 | }
61 | \setbeamertemplate{navigation symbols}{}
62 | \defbeamertemplate{frame footer}{none}{}
63 | \defbeamertemplate{frame footer}{custom}[1]{ #1 }
64 | \defbeamertemplate{frame numbering}{none}{}
65 | \defbeamertemplate{frame numbering}{counter}{\insertframenumber}
66 | \defbeamertemplate{frame numbering}{fraction}{
67 | \insertframenumber/\inserttotalframenumber
68 | }
69 | \defbeamertemplate{headline}{plain}{}
70 | \defbeamertemplate{footline}{plain}{%
71 | \begin{beamercolorbox}[wd=\textwidth, sep=3ex]{footline}%
72 | \usebeamerfont{page number in head/foot}%
73 | \usebeamertemplate*{frame footer}
74 | \hfill%
75 | \usebeamertemplate*{frame numbering}
76 | \end{beamercolorbox}%
77 | }
78 | \newlength{\metropolis@frametitle@padding}
79 | \setlength{\metropolis@frametitle@padding}{1.5ex}
80 | \newcommand{\metropolis@frametitlestrut@start}{
81 | \rule{0pt}{\metropolis@frametitle@padding +%
82 | \totalheightof{%
83 | \ifcsdef{metropolis@frametitleformat}{\metropolis@frametitleformat X}{X}%
84 | }%
85 | }%
86 | }
87 | \newcommand{\metropolis@frametitlestrut@end}{
88 | \rule[-\metropolis@frametitle@padding]{0pt}{\metropolis@frametitle@padding}
89 | }
90 | \defbeamertemplate{frametitle}{plain}{%
91 | \nointerlineskip%
92 | \begin{beamercolorbox}[%
93 | wd=\paperwidth,%
94 | sep=0pt,%
95 | leftskip=\metropolis@frametitle@padding,%
96 | rightskip=\metropolis@frametitle@padding,%
97 | ]{frametitle}%
98 | \metropolis@frametitlestrut@start\insertframetitle\metropolis@frametitlestrut@end%
99 | \end{beamercolorbox}%
100 | }
101 | \newlength{\metropolis@progressinheadfoot}
102 | \setbeamertemplate{progress bar in head/foot}{
103 | \nointerlineskip
104 | \setlength{\metropolis@progressinheadfoot}{%
105 | \paperwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}%
106 | }%
107 | \begin{beamercolorbox}[wd=\paperwidth]{progress bar in head/foot}
108 | \begin{tikzpicture}
109 | \draw[bg, fill=bg] (0,0) rectangle (\paperwidth, 0.4pt);
110 | \draw[fg, fill=fg] (0,0) rectangle (\metropolis@progressinheadfoot, 0.4pt);
111 | \end{tikzpicture}%
112 | \end{beamercolorbox}
113 | }
114 | \AtBeginDocument{%
115 | \apptocmd{\appendix}{%
116 | \pgfkeys{%
117 | /metropolis/outer/.cd,
118 | numbering=none,
119 | progressbar=none}
120 | }{}{}
121 | }
122 | \metropolis@outer@setdefaults
123 | \ProcessPgfPackageOptions{/metropolis/outer}
124 | \endinput
125 | %%
126 | %% End of file `beamerouterthememetropolis.sty'.
127 |
--------------------------------------------------------------------------------
/latex/slides/beamerthememetropolis.sty:
--------------------------------------------------------------------------------
1 | %%
2 | %% This is file `beamerthememetropolis.sty',
3 | %% generated with the docstrip utility.
4 | %%
5 | %% The original source files were:
6 | %%
7 | %% beamerthememetropolis.dtx (with options: `package')
8 | %% ---------------------------------------------------------------------------
9 | %% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
10 | %% contributors can be found at
11 | %%
12 | %% https://github.com/matze/mtheme/graphs/contributors
13 | %%
14 | %% and the original template was based on the HSRM theme by Benjamin Weiss.
15 | %%
16 | %% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
17 | %% International License (https://creativecommons.org/licenses/by-sa/4.0/).
18 | %% ---------------------------------------------------------------------------
19 | \NeedsTeXFormat{LaTeX2e}
20 | \ProvidesPackage{beamerthememetropolis}
21 | [2016/02/21 v1.1 Metropolis Beamer theme]
22 | \RequirePackage{etoolbox}
23 | \RequirePackage{pgfopts}
24 | \pgfkeys{/metropolis/.cd,
25 | .search also={
26 | /metropolis/inner,
27 | /metropolis/outer,
28 | /metropolis/color,
29 | /metropolis/font,
30 | }
31 | }
32 | \pgfkeys{
33 | /metropolis/titleformat plain/.cd,
34 | .is choice,
35 | regular/.code={%
36 | \let\metropolis@plaintitleformat\@empty%
37 | \setbeamerfont{plain title}{shape=\normalfont}%
38 | },
39 | smallcaps/.code={%
40 | \let\metropolis@plaintitleformat\@empty%
41 | \setbeamerfont{plain title}{shape=\scshape}%
42 | },
43 | allsmallcaps/.code={%
44 | \let\metropolis@plaintitleformat\MakeLowercase%
45 | \setbeamerfont{plain title}{shape=\scshape}%
46 | \PackageWarning{beamerthememetropolis}{%
47 | Be aware that titleformat plain=allsmallcaps can lead to problems%
48 | }
49 | },
50 | allcaps/.code={%
51 | \let\metropolis@plaintitleformat\MakeUppercase%
52 | \setbeamerfont{plain title}{shape=\normalfont}%
53 | \PackageWarning{beamerthememetropolis}{%
54 | Be aware that titleformat plain=allcaps can lead to problems%
55 | }
56 | },
57 | }
58 | \pgfkeys{
59 | /metropolis/titleformat/.code=\pgfkeysalso{
60 | font/titleformat title=#1,
61 | font/titleformat subtitle=#1,
62 | font/titleformat section=#1,
63 | font/titleformat frame=#1,
64 | titleformat plain=#1,
65 | }
66 | }
67 | \pgfkeys{/metropolis/.cd,
68 | usetitleprogressbar/.code=\pgfkeysalso{outer/progressbar=frametitle},
69 | noslidenumbers/.code=\pgfkeysalso{outer/numbering=none},
70 | usetotalslideindicator/.code=\pgfkeysalso{outer/numbering=fraction},
71 | nosectionslide/.code=\pgfkeysalso{inner/sectionpage=none},
72 | darkcolors/.code=\pgfkeysalso{color/background=dark},
73 | blockbg/.code=\pgfkeysalso{color/block=fill, inner/block=fill},
74 | }
75 | \newcommand{\metropolis@setdefaults}{
76 | \pgfkeys{/metropolis/.cd,
77 | titleformat plain=regular,
78 | }
79 | }
80 | \useinnertheme{metropolis}
81 | \useoutertheme{metropolis}
82 | \usecolortheme{metropolis}
83 | \usefonttheme{metropolis}
84 | \AtEndPreamble{%
85 | \@ifpackageloaded{pgfplots}{%
86 | \RequirePackage{pgfplotsthemetol}
87 | }{}
88 | }
89 | \newcommand{\metroset}[1]{\pgfkeys{/metropolis/.cd,#1}}
90 | \def\metropolis@plaintitleformat#1{#1}
91 | \newcommand{\plain}[2][]{%
92 | \begingroup
93 | \ifbeamercolorempty[bg]{palette primary}{
94 | \setbeamercolor{background canvas}{
95 | use=palette primary,
96 | bg=-palette primary.fg
97 | }
98 | }{
99 | \setbeamercolor{background canvas}{
100 | use=palette primary,
101 | bg=palette primary.bg
102 | }
103 | }
104 | \begin{frame}[c,noframenumbering]{#1}
105 | \begin{center}
106 | \usebeamercolor[fg]{palette primary}
107 | \usebeamerfont{plain title}
108 | \metropolis@plaintitleformat{#2}
109 | \end{center}
110 | \end{frame}
111 | \endgroup
112 | }
113 | \newcommand{\mreducelistspacing}{\vspace{-\topsep}}
114 | \metropolis@setdefaults
115 | \ProcessPgfOptions{/metropolis}
116 | \endinput
117 | %%
118 | %% End of file `beamerthememetropolis.sty'.
119 |
--------------------------------------------------------------------------------
/latex/slides/resources/01_getting_started/attributes.py:
--------------------------------------------------------------------------------
1 | class A:
2 | """
3 | This is the class definition
4 |
5 | this is where mehtods and class attributes are defined
6 | """
7 |
8 | class_attribute_2 = 'I am a class attribute'
9 |
10 | def __init__(self, argument_1):
11 | """
12 | This is the class initializer
13 |
14 | this is where typically instance attributes are defined
15 | """
16 |
17 | self.instance_attribute_1 = 'I am an instance attribute'
18 | self.instance_attribute_2 = argument_1
19 |
20 |
21 | a = A('argument') # instantiating a new instace of 'A'
22 | b = A(6)
23 |
24 | # attrbute access
25 | a.instance_attribute_2 # ==> 'argument'
26 | b.instance_attribute_2 # ==> 6
27 |
28 | a.class_attribute_2 # ==> 'I am a class attribute'
29 | b.class_attribute_2 # ==> 'I am a class attribute'
30 |
31 | a.instance_attribute_1 == b.instance_attribute_1 # ==> True
32 |
33 | # setting the attribute
34 | a.instance_attribute_1 = 5
35 |
36 | a.instance_attribute_1 == b.instance_attribute_1 # ==> False
--------------------------------------------------------------------------------
/latex/slides/resources/01_getting_started/comments.py:
--------------------------------------------------------------------------------
1 | # in python nur einzeilige Kommentare
2 |
3 | def my_function(params):
4 | """
5 | Oder docstrings wie dieser,
6 | aber nur zu beginn einer Funktions-
7 | oder Klassendefinition
8 | """
9 | pass
10 |
--------------------------------------------------------------------------------
/latex/slides/resources/01_getting_started/hello_world.py:
--------------------------------------------------------------------------------
1 | def my_function():
2 | print('Hallo Welt!')
3 |
4 | if __name__ == '__main__':
5 | my_function()
6 |
--------------------------------------------------------------------------------
/latex/slides/resources/01_getting_started/string_concatenation.py:
--------------------------------------------------------------------------------
1 | 'Hallo' + '_' + 'Welt' # => 'Hallo_Welt'
2 |
3 | '_'.join(['Hallo', 'Welt']) # => 'Hallo_Welt'
4 |
--------------------------------------------------------------------------------
/latex/slides/resources/01_getting_started/string_format.py:
--------------------------------------------------------------------------------
1 | # mit `str.format()`
2 |
3 | 'my string {} {}'.format(4, 'vier')
4 | # in Reihenfolge der argumente
5 |
6 | 'my string {number} {name}'.format(name='vier', number=4)`
7 | # via Name, Reihenfolge egal
8 |
9 | 'my string {number} {}'.format('vier', number=4)
10 | # oder beides kombiniert
11 |
12 | # und mit dem %-Operator
13 |
14 | 'string %d %s' % (4, 'vier')
15 | # in Reihenfolge
16 |
17 | 'string %(number)d %(name)s' % {number:4, name:'vier'}
18 | # via Name
19 |
--------------------------------------------------------------------------------
/latex/slides/resources/02_grundlagen/boilerplate.py:
--------------------------------------------------------------------------------
1 | def main():
2 | pass
3 |
4 | if __name__ == '__main__':
5 | main()
6 |
--------------------------------------------------------------------------------
/latex/slides/resources/02_grundlagen/classattributes.py:
--------------------------------------------------------------------------------
1 | class TestClass:
2 | # jeder Instanz wird bei Erstellung bereits dieses Attribut zugewiesen
3 | num = 12
4 |
5 | def main():
6 | a = TestClass()
7 | b = TestClass()
8 | # beide Variablen haben fuer 'num' von der Erstellung an den gleichen Wert
9 |
10 | # das Aendern der Variable ueberschreibt das Klassenattribut mit einem Instanzattribut
11 | a.num = -3
12 | print(b.num) # -> liefert immer noch 12
13 |
--------------------------------------------------------------------------------
/latex/slides/resources/02_grundlagen/inheritance.py:
--------------------------------------------------------------------------------
1 | class Human():
2 | def __init__(self, fistname, lastname, dob):
3 | self.firstname = firstname
4 | self.lastname = lastname
5 | self.dob = dob
6 |
7 |
8 | class Child(Human):
9 | # Ein Child ist einfach nur ein Human mit den
10 | # zusaetzlichen Attributen father und mother
11 | def __init__(self, fistname, lastname, dob, father, mother):
12 | super.__init__(fistname, lastname, dob)
13 | self.father = father
14 | self.mother = mother
15 |
--------------------------------------------------------------------------------
/latex/slides/resources/02_grundlagen/instanceattributes.py:
--------------------------------------------------------------------------------
1 | class Human:
2 | def __init__(self, firstname, lastname):
3 | # die beiden Parameterwerte werden in Instanzattributen gespeichert.
4 | self.firstname = firstname
5 | self.lastame = lastname
6 |
7 | def main():
8 | # instanziiert zwei Objekte vom Typ 'Human'
9 | matthias = Human("Matthias", "Stuhlbein")
10 | john = Human("John", "Doe")
11 |
--------------------------------------------------------------------------------
/latex/slides/resources/02_grundlagen/scope.py:
--------------------------------------------------------------------------------
1 | var = 12
2 |
3 | def foo():
4 | # erwarteter Effekt: var wird auf 9 gesetzt
5 | var = 9
6 |
7 | def main():
8 | print(var) # -> gibt 12 zurueck
9 | foo()
10 | print(var) # -> Erwartung: gibt 9 aus.
11 | # Realitaet: gibt 12 aus.
12 |
13 | if __name__ == '__main__':
14 | main()
15 |
--------------------------------------------------------------------------------
/latex/slides/resources/02_grundlagen/scope_fix.py:
--------------------------------------------------------------------------------
1 | var = 12
2 |
3 | def foo():
4 | global var
5 | # global sagt dem Interpreter, dass er hier auf die oberhalb definierte Variable zurueckgreifen soll
6 | var = 9
7 |
8 | def main():
9 | print(var) # -> gibt 12 zurueck
10 | foo()
11 | print(var) # -> gibt jetzt 9 aus
12 |
13 | if __name__ == '__main__':
14 | main()
15 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/cm.py:
--------------------------------------------------------------------------------
1 | class MyManager:
2 | def __enter__(self):
3 | # tue dinge
4 | pass
5 |
6 | def __exit__(self):
7 | # schliesse handler etc ...
8 | pass
9 |
10 | def do_things(self):
11 | # ...
12 | pass
13 |
14 | with MyManager() as m:
15 | m.do_things()
16 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/dict.py:
--------------------------------------------------------------------------------
1 | d = { 'm': 4, 3: 'val2', object: 'auch typen koennen keys sein' }
2 |
3 | d[3] # ==> "val2"
4 | d['q'] # ==> KeyError: 'q'
5 | d.get('q') # ==> None
6 | d.get('q', 5) # ==> 5
7 |
8 | d[0] = 7
9 | d # ==> {3: 'val2', 'm': 4, 'q': 5, : 'auch typen koennen keys sein'}
10 |
11 | d.setdefault('m') # ==> 4
12 | d.setdefault('q', 5) # ==> 5
13 | d # ==> { 'm': 4, 3: 'val2', object: 'auch typen koennen keys sein', 0:7, 'q': 5 }
14 | len(d) # ==> 5
15 | d.keys() # ==> dict_keys([3, 0, 'm', 'q', ])
16 | d.values() # ==> dict_values(['val2', 7, 4, 5, 'auch typen koennen keys sein'])
17 | d.items() # ==> dict_items([(3, 'val2'), (0, 7), ('m', 4), ('q', 5), (, 'auch typen koennen keys sein')])
18 |
19 | 'm' in d # ==> True
20 | object in d # ==> True
21 | tuple in d # ==> False
22 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/exceptions.py:
--------------------------------------------------------------------------------
1 | class MyException(Exception):
2 | def __init__(self, message):
3 | self.message = message
4 |
5 | def __repr__(self):
6 | return '{} mit nachricht {}'.format(self.__class__, self.message)
7 |
8 | try:
9 | # code
10 | raise KeyError('message')
11 | # mit nur einer exception
12 | # except MyException as error:
13 | except (KeyError, MyException) as error:
14 | print(error)
15 | pass
16 | finally:
17 | # was unbedingt zu tun ist
18 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/file.py:
--------------------------------------------------------------------------------
1 | with open(myfile, mode='r') as f:
2 | for line in f:
3 | # code
4 |
5 |
6 | with open(myfile, mode='w+') as f:
7 | for line in document:
8 | f.write(line)
9 | # oder
10 | print(line, file=f)
11 |
12 | f = open(myfile)
13 |
14 | # code
15 |
16 | f.close()
17 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/iterate.py:
--------------------------------------------------------------------------------
1 | for i in [1,2,3]:
2 | if i > 9:
3 | break
4 | # code
5 | else:
6 | pass
7 | # wenn kein break vorkommt
8 |
9 | for i in (1,2,3):
10 | # code
11 | pass
12 |
13 | for i in {1:'value1', 2:'value2'}:
14 | # iteration ueber die keys
15 | pass
16 |
17 |
18 | for i in {1:'value1', 2:'value2'}.items():
19 | # i ist tuple von (key, value)
20 | pass
21 |
22 | for value1, value2 in [
23 | (1, 'werner'),
24 | (3, 'geh mal in den keller'),
25 | (42, 'ich glaub die russen komm\'')
26 | ]:
27 | # iteration mit tuple unpacking
28 | # code
29 |
30 | # oder auch
31 |
32 | for value1, value2 in zip([1,3,42], ['werner', 'geh mal in den keller', 'ich glaub die russen komm\'', 'dieser string wird in der iteration nicht auftauchen', 'dieser auch nicht'])
33 |
34 | for key, value in {1:'value1', 2:'value2'}.items():
35 | # iteration ueber keys und values mit tuple unpacking
36 | pass
37 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/list.py:
--------------------------------------------------------------------------------
1 | l = [1, 9, 'string', object]
2 |
3 | isinstance(l[0], int) # ==> True
4 | l[1] == 9 # ==> True
5 | len(l) # ==> 4
6 |
7 | 9 in l # ==> True
8 |
9 | l.pop() # ==> object
10 | len(l) # ==> 3
11 | l.append([]) # ==> None
12 |
13 | l # ==> [1, 9, 'string', []]
14 | len(l) # ==> 4
15 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/set.py:
--------------------------------------------------------------------------------
1 | s1 = {1, 2, 'string', object, ('ein', 'tuple')}
2 |
3 | 2 in s1 # ==> True
4 | 'ein' in s1 # ==> False
5 | ('ein', 'tuple') in s1 # ==> True
6 | set(('ein', 'tuple')) # ==> {'ein', 'tuple'}
7 |
8 | s2 = {'anderes', 'set'}
9 | s1 > s2 # ==> False
10 | s1.isdisjoint(s2) # ==> True
11 |
12 | s1.add('anderes')
13 | s1 | s2 # ==> {1, 2, 'string', object, ('ein', 'tuple'), 'set'}
14 | s1 & s2 # ==> {'anderes'}
15 | s2 - s1 # ==> {'set'}
16 |
17 | s2 = frozenset(s2)
18 | s1.add(s2)
19 | s2.add(5) # ==> AttributeError: 'frozenset' object has no attribute 'add'
20 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/tuple.py:
--------------------------------------------------------------------------------
1 | # Tupel mit 3 Elementen
2 | t = (1, 3, 'ein string')
3 | isinstance(t, tuple) # ==> True
4 |
5 | t[0] == 1 # ==> True
6 | t[1] == 3 # ==> True
7 | t[2] == 'ein string' # ==> True
8 | t[4] == 'ein string' # ==> IndexError: tuple index out of range
9 | t[2] = 'ein anderer string' # ==> TypeError: 'tuple' object does not support item assignment
10 |
11 | # oder auch ohne klammern
12 | t = 1, 3, 'ein string'
13 | # macht es (manchmal) besser lesbar, z.b. bei
14 | return 1, 2, 5
15 |
--------------------------------------------------------------------------------
/latex/slides/resources/03_builtins/unpacking.py:
--------------------------------------------------------------------------------
1 | # unpacking (geht auch mit listen)
2 | t = 1, 3, 'ein string' # tuple ohne klammern gebaut
3 |
4 | x, y, z = t
5 | x is t[0] # ==> True
6 | y is t[1] # ==> True
7 |
8 | # oder
9 | x, *y = t
10 | x # ==> 1
11 | y # ==> [3, 'ein string']
12 |
13 | a, b, c = 1, 2, 4
14 |
15 | d, e, f, *g = [3, 0, 8, 7, 46, 42]
16 | f # ==> 8
17 | g # ==> [7, 46, 42]
18 |
--------------------------------------------------------------------------------
/latex/slides/resources/04_modules_and_packages/incdec.py:
--------------------------------------------------------------------------------
1 | def increment(a):
2 | return a+1
3 |
4 |
5 | def decrement(a):
6 | return a-1
7 |
--------------------------------------------------------------------------------
/latex/slides/resources/04_modules_and_packages/modules.py:
--------------------------------------------------------------------------------
1 | # Importieren des kompletten Moduls incdec
2 | import incdec
3 |
4 | # Die Funktionen koennen wie folgt aufgerufen werden:
5 | incdec.increment(3)
6 | # => 4
7 | incdec.decrement(3)
8 | # => 2
9 |
10 | # Importieren einzelner Funktionen
11 | from incdec import increment
12 |
13 | # Diese kann jetzt sofort aufgerufen werden
14 | increment(3)
15 | # => 4
16 |
17 | # Alias fuer Module verwenden
18 | import incdec as plusoneminusone
19 |
20 | plusoneminusone.inrement(3)
21 | # => 4
22 |
--------------------------------------------------------------------------------
/latex/slides/resources/04_modules_and_packages/path.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | sys.path.append('my/directory')
4 |
--------------------------------------------------------------------------------
/latex/slides/resources/05_pip/requirements.txt:
--------------------------------------------------------------------------------
1 | pathlib>=1.0
2 | pyyaml>=3.08
3 | markdown
4 |
5 |
--------------------------------------------------------------------------------
/latex/slides/resources/06_comprehensions/dicts.py:
--------------------------------------------------------------------------------
1 | liste = ["Fritz", "Alex", "Nadine", "Peter", "Anna"]
2 |
3 | names = {key: len(key) for key in liste}
4 | # => {'Peter': 5, 'Fritz': 5, 'Alex': 4, 'Anna': 4, 'Nadine': 6}
5 |
--------------------------------------------------------------------------------
/latex/slides/resources/06_comprehensions/lists.py:
--------------------------------------------------------------------------------
1 | varList = [var*8 for var in range(10)]
2 | # => [0, 8, 16, 24, 32, 40, 48, 56, 64, 72]
3 |
4 |
5 | # Mit Filter (hier: Fuer i ist gerade)
6 | evenVarList = [var*8 for var in range(10) if var % 2 == 0]
7 | # => [0, 16, 32, 48, 64]
8 |
--------------------------------------------------------------------------------
/latex/slides/resources/06_decorators/decorator.py:
--------------------------------------------------------------------------------
1 | def get_date(date):
2 | return ", today it's {}.".format(date)
3 |
4 |
5 | # unser decorator
6 | def tell_the_world(func):
7 | def complete_sentence(date):
8 | return "Hello World{}".format(func(date))
9 | return complete_sentence
10 |
11 | # normaler Aufruf:
12 | print(tell_the_world(get_date)("25th June 2015"))
13 |
14 | # als decorator
15 | get_date = tell_the_world(get_date)
16 |
17 | print(get_date("25th June 2015"))
18 | # => Hello World, today it's 25th June 2015.
19 |
20 |
21 |
22 | # Nutzung des @ Syntaxes
23 | def tell_the_world(func):
24 | def complete_sentence(date):
25 | return "Hello World, {}".format(func(date))
26 | return complete_sentence
27 |
28 |
29 | @tell_the_world
30 | def get_date(date):
31 | return "today it's {}.".format(date)
32 |
33 | print(get_date("25th June 2015"))
34 | # => Hello World, today it's 25th June 2015.
35 |
36 |
37 | # Decorator mit Argumenten
38 | def tell_the_date_to(name):
39 | def name_decorator(func):
40 | def complete_sentence(date):
41 | return "Hello {name}, {date}".format(name=name, date=func(date))
42 | return complete_sentence
43 | return name_decorator
44 |
45 |
46 | @tell_the_date_to("John Doe")
47 | def get_date(date):
48 | return "today it's {}.".format(date)
49 |
50 | print(get_date("25th June 2015"))
51 | # => Hello John Doe, today it's 25th June 2015.
52 |
--------------------------------------------------------------------------------
/latex/slides/resources/06_decorators/functions.py:
--------------------------------------------------------------------------------
1 | # Funktionen Variablen zuweisen
2 | def return_hello():
3 | return "Hello"
4 |
5 | say_hello = return_hello
6 |
7 | print(say_hello())
8 | # => Hello
9 |
10 |
11 | # Funktionen in Funktionen definieren
12 | def greet(name):
13 | def return_hello():
14 | return "Hello "
15 | greeting = return_hello() + name
16 | return greeting
17 |
18 | print(greet("World"))
19 | # => Hello World
20 |
21 |
22 | # Rueckgabe von Funktionen
23 | def greet():
24 | def say_hello():
25 | return "Hello"
26 | return say_hello
27 |
28 | print(greet())
29 | # Hello
30 |
31 |
32 | # Uebergabe von Funktionen
33 | def say_date(date):
34 | return "Today it's {date}".format(date=date)
35 |
36 | def which_date(function):
37 | date = "25th June 2015"
38 | return function(date)
39 |
40 | print(which_date(say_date))
41 | # => Today it's 25th June 2015
42 |
--------------------------------------------------------------------------------
/latex/slides/resources/07_funtions_advanced/default.py:
--------------------------------------------------------------------------------
1 | def greet(name, greeting='Hello'):
2 | return '{} {}'.format(greeting, name)
3 |
4 | greet('Herbert') # ==> 'Hallo Herbert'
5 | greet('Herbert', 'Gruess Gott') # ==> 'Gruess Gott Herbert'
6 |
7 |
8 | def func(param1, param2=[]):
9 | print(param2)
10 | param2.append(param1)
11 |
12 | func(1) # ==> []
13 | func(2) # ==> [1]
14 | func('j') # ==> [1,2]
15 |
16 |
17 | def func(param1, param2=None):
18 | param2 = [] if param2 is None else param2
19 | pass
20 |
21 |
22 | def land(house, tree, pond):
23 | return 'You own land with a {} a {} and a {}'.format(house, tree, pond)
24 |
25 | land('green house', 'maple', 'fish pond')
26 |
27 | # oder mit Aufruf durch Namen:
28 | land(house='green house', pond='fish pond', tree='maple')
29 |
30 | # or vermischt
31 | land('green house', pond='fish pond', tree='maple')
32 |
33 | # folgendes funktioniert NICHT!
34 | land('maple', house='green house', tree='maple'
35 |
--------------------------------------------------------------------------------
/latex/slides/resources/07_funtions_advanced/mixed_aggr.py:
--------------------------------------------------------------------------------
1 | def function(
2 | param1,
3 | param2,
4 | *args,
5 | kwparam1=0,
6 | kwparam2=None,
7 | **kwargs
8 | ):
9 | pass
10 |
11 |
12 | def name(
13 | [params, ...]
14 | [, *[aggregator]]
15 | [, kwparams=kwvalue, ...]
16 | [**kwaggreg]
17 | ):
18 | pass
19 |
--------------------------------------------------------------------------------
/latex/slides/resources/07_funtions_advanced/named_aggr.py:
--------------------------------------------------------------------------------
1 | def function(param1, **aggr):
2 | pass
3 |
4 |
5 | function(1) # korrekt, aggr = {}
6 | function(1, some=9) # korrekt, agar = {'some': 9}
7 | function(some=6) # inkorrekt, param1 braucht einen Wert
8 | function(some=0, param1=8, param2=4)
9 | # korrekt, agar = {'some': 0, 'param2': 4}
10 |
--------------------------------------------------------------------------------
/latex/slides/resources/07_funtions_advanced/nameless_aggr.py:
--------------------------------------------------------------------------------
1 | def function(param1, param2, *, param3=6):
2 | pass
3 |
--------------------------------------------------------------------------------
/latex/slides/resources/07_funtions_advanced/positional_aggregators.py:
--------------------------------------------------------------------------------
1 | def f(*args):
2 | print(type(args)) # ==> tuple
3 |
4 |
5 | def function(param1, *aggr, param2=0):
6 | pass
7 |
8 |
9 | function(1, 2, 3, 4) # korrekt, aggr = (2,3,4)
10 | function(1, 2, 4, 5, 6, 78, 9, 90, 0)
11 | # auch korrekt, aggr = (2,4,5,6,78,9,90,0)
12 | function() # inkorrekt, param1 braucht mindestens ein Argument
13 | function(1, param2=7) # korrekt, aggr = ()
14 | function(param2=8) # inkorrekt, param1 braucht einen Wert
15 | function(param2=0, param1=6) # korrekt
16 |
--------------------------------------------------------------------------------
/latex/slides/resources/07_funtions_advanced/use_func.py:
--------------------------------------------------------------------------------
1 | def function(params):
2 | return 4
3 |
4 | my_var = function
5 | my_var(2) # ==> 4
6 |
7 |
8 | def callif(boolean, callback):
9 | if boolean:
10 | callback()
11 |
12 | callif(True, lambda: print("hello world"))
13 |
14 |
15 | class MyClass(object):
16 | def function(self, param):
17 | return 4
18 |
19 | my_var = MyClass.function
20 | my_var(MyClass(), 2) # ==> 4
21 |
--------------------------------------------------------------------------------
/latex/slides/resources/08_process/context_mgr.py:
--------------------------------------------------------------------------------
1 | with subprocess.Popen(['ls']) as process:
2 | pass
3 |
--------------------------------------------------------------------------------
/latex/slides/resources/08_process/defs.py:
--------------------------------------------------------------------------------
1 | run(args, *, stdin=None, input=None,
2 | stdout=None, stderr=None, shell=False, timeout=None, check=False)
3 |
4 |
5 | call(args, *, stdin=None, stdout=None,
6 | stderr=None, shell=False, timeout=None)
7 |
8 |
9 | check_output(args, *, stdin=None, stdout=None,
10 | stderr=None, shell=False, timeout=None)
11 |
--------------------------------------------------------------------------------
/latex/slides/resources/08_process/popen_call.py:
--------------------------------------------------------------------------------
1 | import subprocess
2 |
3 | Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None,
4 | stderr=None, preexec_fn=None, close_fds=True, shell=False,
5 | cwd=None, env=None, universal_newlines=False, startupinfo=None,
6 | creationflags=0, restore_signals=True, start_new_session=False,
7 | pass_fds=())
8 |
--------------------------------------------------------------------------------
/latex/slides/resources/09_web_client/req_example.py:
--------------------------------------------------------------------------------
1 | import urllib.request
2 |
3 | r = urllib.request.Request(
4 | 'http://python.org',
5 | headers={'content-type': 'application/json'},
6 | method='PUT'
7 | )
8 |
--------------------------------------------------------------------------------
/latex/slides/resources/09_web_client/requests_example.py:
--------------------------------------------------------------------------------
1 | r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
2 |
3 | r.status_code # -> 200
4 | r.headers['content-type']
5 | # -> 'application/json; charset=utf8'
6 | r.encoding # -> 'utf-8'
7 | r.text # -> u'{"type":"User"...'
8 | r.json()
9 | # -> {u'private_gists': 419, u'total_private_repos': 77, ...}
10 |
--------------------------------------------------------------------------------
/latex/slides/resources/09_web_client/urllib_calls.py:
--------------------------------------------------------------------------------
1 | import urllib.request
2 |
3 | urllib.request.urlopen(url, data=None, [timeout, ] *,
4 | cafile=None, capath=None,
5 | cadefault=False, context=None)
6 |
7 |
8 | urllib.request.Request(url, data=None, headers={},
9 | origin_req_host=None,
10 | unverifiable=False, method=None)
11 |
12 |
13 | http.client.HTTPResponse(sock, debuglevel=0,
14 | method=None, url=None)
15 |
--------------------------------------------------------------------------------
/latex/slides/resources/10_regex/match.py:
--------------------------------------------------------------------------------
1 | start([group])
2 |
3 | end([group])
4 |
5 | span([group])
6 |
7 |
--------------------------------------------------------------------------------
/latex/slides/resources/10_regex/methods.py:
--------------------------------------------------------------------------------
1 | compile(pattern, flags=0)
2 |
3 | search(pattern, string, flags=0)
4 |
5 | match(pattern, string, flags=0)
6 |
7 | fullmatch(pattern, string, flags=0)
8 |
9 | findall(pattern, string, flags=0)
10 |
11 | finditer(pattern, string, flags=0)
12 |
--------------------------------------------------------------------------------
/latex/slides/resources/11_sendmail/defs.py:
--------------------------------------------------------------------------------
1 | email.mime.text.MIMEText(_text, _subtype='plain', _charset=None)
2 |
3 | smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)
4 |
5 | SMTP.login(user, password, *, initial_response_ok=True)
6 |
7 | SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])
8 |
--------------------------------------------------------------------------------
/latex/slides/resources/11_sendmail/mailer.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | import smtplib
4 | from email.mime.text import MIMEText
5 |
6 |
7 | def buildmessage():
8 | message = MIMEText('Text der E-Mail.')
9 |
10 | # set the sender of your mail
11 | message['From'] = 'Sender name '
12 | # set the receiver of your mail
13 | message['To'] = 'Receiver name '
14 |
15 | message['Subject'] = 'Betreff der E-Mail'
16 |
17 | return message
18 |
19 |
20 | def main():
21 | message = buildmessage()
22 | server = 'Servername'
23 | port = 587 # This is the default Port of an smtp server
24 |
25 | try:
26 | with smtplib.SMTP(host=server, port=port) as smtpObj:
27 | smtpObj.starttls()
28 | smtpObj.login('user', 'pass')
29 | smtpObj.send_message(message)
30 | except SMTPException:
31 | print("Error: unable to send email.")
32 |
33 | if __name__ == '__main__':
34 | main()
35 |
--------------------------------------------------------------------------------
/latex/slides/resources/12_curses/functions.py:
--------------------------------------------------------------------------------
1 | curses.initscr()
2 |
3 | curses.endwin()
4 |
5 | curses.wrapper(func, ...)
6 |
7 | window.addch(ch[, attr])
8 | window.addch(y, x, ch[, attr])
9 |
10 | window.addstr(str[, attr])
11 | window.addstr(y, x, str[, attr])
12 |
13 | window.delch([y, x])
14 | window.deleteln()
15 | window.erase()
16 |
17 | curses.textpad.rectangle(win, uly, ulx, lry, lrx)
18 |
19 | curses.textpad.Textbox(win)
20 |
21 | Textbox().edit([validator])
22 | Textbox().do_command(ch)
23 | Textbox().gather()
24 |
--------------------------------------------------------------------------------
/latex/slides/resources/list_example.py:
--------------------------------------------------------------------------------
1 | list_1 = [1, 2, 3] # lists can be created using square brakets
2 |
3 | type(list_1) == list # ==> True
4 |
5 | list_2 = [ # lists can contain different types
6 | 1, # an integer
7 | 'a string', # a string
8 | int # a type
9 | ]
10 |
11 | list_3 = list(list_2) # lists can be created from other iterables using the list() constructor
12 |
13 | list_1[1] == 2 # indexing with square brackets
14 | list_1[0] = 4 # settings using quare brackets
15 |
16 | list_1.append('new string') # append to the end
17 | list_1 == [4, 1, 3, 'new string'] # ==> True
18 | # pop from the end
19 | # removes and returns the element
20 | list_1.pop() # ==> 'new string'
21 |
22 | list_1 == [4, 1, 3] # ==> True
23 |
24 | # new in python 3.4
25 | list_1.clear()
26 | list_1 == [] # ==> True
27 |
--------------------------------------------------------------------------------
/latex/templates/course_definitions.tex:
--------------------------------------------------------------------------------
1 | %document
2 | \documentclass[10pt]{beamer}
3 | %theme
4 | \usetheme{metropolis}
5 | % packages
6 | \usepackage{color}
7 | \usepackage{listings}
8 | \usepackage[ngerman]{babel}
9 | \usepackage[utf8]{inputenc}
10 | \usepackage{multicol}
11 |
12 |
13 | % color definitions
14 | \definecolor{mygreen}{rgb}{0,0.6,0}
15 | \definecolor{mygray}{rgb}{0.5,0.5,0.5}
16 | \definecolor{mymauve}{rgb}{0.58,0,0.82}
17 |
18 | \lstset{
19 | backgroundcolor=\color{white},
20 | % choose the background color;
21 | % you must add \usepackage{color} or \usepackage{xcolor}
22 | basicstyle=\footnotesize\ttfamily,
23 | % the size of the fonts that are used for the code
24 | breakatwhitespace=false,
25 | % sets if automatic breaks should only happen at whitespace
26 | breaklines=true, % sets automatic line breaking
27 | captionpos=b, % sets the caption-position to bottom
28 | commentstyle=\color{mygreen}, % comment style
29 | % deletekeywords={...},
30 | % if you want to delete keywords from the given language
31 | extendedchars=true,
32 | % lets you use non-ASCII characters;
33 | % for 8-bits encodings only, does not work with UTF-8
34 | frame=single, % adds a frame around the code
35 | keepspaces=true,
36 | % keeps spaces in text,
37 | % useful for keeping indentation of code
38 | % (possibly needs columns=flexible)
39 | keywordstyle=\color{blue}, % keyword style
40 | % morekeywords={*,...},
41 | % if you want to add more keywords to the set
42 | numbers=left,
43 | % where to put the line-numbers; possible values are (none, left, right)
44 | numbersep=5pt,
45 | % how far the line-numbers are from the code
46 | numberstyle=\tiny\color{mygray},
47 | % the style that is used for the line-numbers
48 | rulecolor=\color{black},
49 | % if not set, the frame-color may be changed on line-breaks
50 | % within not-black text (e.g. comments (green here))
51 | stepnumber=1,
52 | % the step between two line-numbers.
53 | % If it's 1, each line will be numbered
54 | stringstyle=\color{mymauve}, % string literal style
55 | tabsize=4, % sets default tabsize to 4 spaces
56 | % show the filename of files included with \lstinputlisting;
57 | % also try caption instead of title
58 | language = Python,
59 | showspaces = false,
60 | showtabs = false,
61 | showstringspaces = false,
62 | escapechar = ,
63 | }
64 |
65 | \def\ContinueLineNumber{\lstset{firstnumber=last}}
66 | \def\StartLineAt#1{\lstset{firstnumber=#1}}
67 | \let\numberLineAt\StartLineAt
68 |
69 |
70 |
71 | \newcommand{\codeline}[1]{
72 | \alert{\texttt{#1}}
73 | }
74 |
--------------------------------------------------------------------------------
/latex/templates/course_information.tex:
--------------------------------------------------------------------------------
1 | % This Document contains the information about this course.
2 |
3 | % Authors of the slides
4 | \author{Felix Döring, Felix Wittwer}
5 |
6 | % Name of the Course
7 | \institute{Python-Kurs}
8 |
9 | % Fancy Logo
10 | \titlegraphic{\hfill\includegraphics[height=1.25cm]{../templates/fsr_logo_cropped}}
11 |
12 |
13 |
14 | % Custom Bindings
15 | % \newcommand{\codeline}[1]{
16 | % \alert{\texttt{#1}}
17 | %}
18 |
--------------------------------------------------------------------------------
/latex/templates/fsr_logo.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fsr/python-lessons/3a5e58a374658fdbcbdccf38e1e1660a31f0e2e4/latex/templates/fsr_logo.pdf
--------------------------------------------------------------------------------
/latex/templates/fsr_logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
127 |
--------------------------------------------------------------------------------
/latex/templates/fsr_logo_cropped.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fsr/python-lessons/3a5e58a374658fdbcbdccf38e1e1660a31f0e2e4/latex/templates/fsr_logo_cropped.pdf
--------------------------------------------------------------------------------
/latex/templates/new_slide.tex:
--------------------------------------------------------------------------------
1 | % The Slide Definitions
2 | \input{../templates/course_definitions}
3 |
4 | % Author and Course information
5 | \input{../templates/course_information}
6 |
7 | % Presentation title
8 | % TODO Change the topic of the lesson
9 | \title{Cool Topic}
10 | \date{\today}
11 |
12 |
13 | \begin{document}
14 |
15 | \maketitle
16 |
17 | \begin{frame}{Gliederung}
18 | \setbeamertemplate{section in toc}[sections numbered]
19 | \tableofcontents
20 | \end{frame}
21 |
22 | % TODO: Add your content right below here.
23 |
24 |
25 |
26 | \end{document}
27 |
--------------------------------------------------------------------------------
/md/01_getting_started.md:
--------------------------------------------------------------------------------
1 | # Über diesen Kurs
2 |
3 | ---
4 |
5 | - 12 Kurseinheiten
6 | - setzt grundlegende Programmierkenntnisse voraus
7 | - Ressourcen
8 | - [auditorium](http://auditorium.inf.tu-dresden.de)
9 | - Google (python/python3 meine frage hier) landet oft in der
10 | python 2.7 Doku (Versionsswitcher im Menü)
11 | - [offizielle Dokumentation](docs.python.org)
12 | - unsere [Github-Organisation](https://github.com/fsr)
13 | - Hinweis: SCM’s sind hilfreich ([git](https://git-scm.com),
14 | [mercurial](http://mercurial.selenic.com/))
15 |
16 |
17 |
18 | Es ist für 11 Kurseinheiten offiziell Material vorhanden.
19 | Alle weiteres Stunden sollten sich auf Wünsche der Studenten beziehen.
20 |
21 |
22 |
23 | # Der Python Interpreter
24 |
25 | ---
26 |
27 | - Die zwei verbreitet verwendeten Python Versionen sind 2.7 und 3.5,
28 | wir werden 3.5 nutzen, weil es cooler ist und bessere Features hat
29 | - Python kann [hier](https://www.python.org/downloads/) heruntergeladen und installiert werden oder mit dem
30 | Paketmanager eurer Wahl. (Das Paket sollte `python3` und
31 | `python3-dev` sein, außer unter Arch)
32 |
33 | ---
34 |
35 | - Python funktioniert am besten unter UNIX (ist aber okay
36 | unter Windows)
37 | - Den Interpreter startet man mit `python3` im Terminal oder mit
38 | `Python.exe`
39 | - Der Interpreter stellt die volle Funktionalität von Python bereit,
40 | einschließlich dem Erstellen von Klassen und Funktionen
41 |
42 |
43 | # Python Scripte
44 |
45 | ## Editor
46 |
47 | empfohlen (benutzen wir im Kurs)
48 |
49 | - [atom](https://atom.io) (weil Github)
50 | - [Sublime Text 3](http://www.sublimetext.com/3) (“Winrar-free”)
51 | - [cloud9](https://c9.i) (online, free für open source Projekte)
52 |
53 | ## IDEs
54 |
55 | hilfreich bei größeren Projekten, hier nicht genutzt
56 |
57 | - [PyCharm](https://jetbrains.com/pycharm) (free + professional für Studenten)
58 |
59 | ## Struktur
60 |
61 | - Python Scripte sind Textdateien, die auf `.py` enden
62 | - Python Packages sind Ordner mit einer `__init__.py` Datei (behandeln wir später)
63 |
64 |
65 | # Grundlagen der Sprache
66 |
67 | ---
68 |
69 | Python ist eine schwach typisierte Scriptsprache (weakly typed scripting language). Es gibt
70 | Typen (anders als in JavaScript), aber Variablen haben keine festen
71 | Typen.
72 |
73 | ---
74 |
75 | ## Kommentare:
76 | ```python
77 | # in python nur einzeilige Kommentare
78 |
79 | def my_function(params):
80 | """
81 | Oder docstrings wie dieser,
82 | aber nur zu beginn einer Funktions-
83 | oder Klassendefinition
84 | """
85 | pass
86 | ```
87 |
88 | ---
89 |
90 | ## builtin Datentypen:
91 |
92 | | Name | Funktion |
93 | | :------------- | :------------- |
94 | | `object` |Basistyp, alles erbt von `object`|
95 | | `int` |Ganzzahl “beliebiger” Größe|
96 | | `float` |Kommazahl “beliebiger” Größe|
97 | | `bool` | Wahrheitswert (`True`, `False`)|
98 | | `None` | Typ des `None`-Objektes|
99 | | `type` | Grundtyp aller Typen (z.B. `int` ist eine Instanz von `int`)|
100 |
101 | ---
102 |
103 | | Name | Funktion |
104 | | :------------- | :------------- |
105 | | `list` | standard Liste|
106 | | `tuple` | unveränderbares n-Tupel|
107 | | `set` |(mathematische) Menge von Objekten|
108 | | `frozenset`| unveränderbare (mathematische) Menge von Objekten|
109 | | `dict` |Hash-Map|
110 |
111 | # Das erste Programm
112 |
113 | ---
114 |
115 | Ein simples “Hallo
116 | Welt”-Programm:
117 | ```python
118 | def my_function():
119 | print('Hallo Welt!')
120 |
121 | if __name__ == '__main__':
122 | my_function()
123 | ```
124 |
125 | ---
126 |
127 | ## Wichtige Eigenschaften:
128 |
129 | - Keine Semikolons
130 | - Keine geschweiften Klammern für Codeblöcke
131 | - Einrückungen zeigen Codeblöcke an
132 | - Funktionsaufrufe immer mit runden Klammern
133 |
134 | ---
135 |
136 | - Funktionen definieren mit
137 | ```python
138 | def ([parameter_liste, ...]):
139 | ```
140 | - Variablen mit der Struktur `__name__` sind spezielle Werte (gewöhnlich aus `builtin` oder Methoden von Standardtypen)
141 |
142 | # Operatoren
143 |
144 | ---
145 |
146 | ## mathematisch
147 |
148 | `+`, `-`, `*`, `/`
149 |
150 | ## vergleichend
151 |
152 | `<`, `>`, `<=`, `>=`, `==` (Wert gleich), `is` (gleiches Objekt/gleiche Referenz)
153 |
154 | ---
155 |
156 | ## logisch
157 |
158 | `and`, `or`, `not`
159 | `(a && b) || (!c)` aus C oder Java entspricht in Python
160 | `(a and b) or not c`
161 |
162 | ## bitweise
163 |
164 | `&`, `|`, `<<`, `>>`, `^` (xor), `~` (invertieren)
165 |
166 | ## Accessoren
167 |
168 | `.` (für Methoden und Attribute), `[]` (für Datenstrukturen mit Index)
169 |
170 | # Namenskonvention
171 |
172 | ---
173 |
174 |
175 | ## Klassen
176 |
177 | *PascalCase*, alles direkt zusammen, groß beginnend und jedes neue Wort groß
178 |
179 | ## Variablen, Funktionen, Methoden
180 |
181 | *snake\_case*, alles klein und Wörter mit Unterstrich getrennt
182 | **Merke:** Da `-` ein Operator ist, ist es in Namen von Variablen,
183 | Funktionen etc. **nicht** zulässig (damit Python eine Kontextfreie Sprache ist)
184 |
185 | ---
186 |
187 | ## protected Variablen, Funktionen, Methoden
188 |
189 | beginnen mit einem Unterstrich `_` oder mit zweien `__` für private
190 |
191 | ---
192 |
193 | **Merke**
194 | Python hat kein Zugriffsmanagement. Die Regel mit dem Unterstrich
195 | ist nur eine Konvention um zu verhindern, dass andere Teile des
196 | Codes nutzen, der eine hohe Wahrscheinlichkeit hat in Zukunft
197 | verändert zu werden.
198 |
199 | # Strings
200 |
201 | ---
202 |
203 | ## Grundlagen
204 |
205 |
206 | - Der Typ eines Strings ist `str`.
207 |
208 | - Strings sind in Python immutable (nicht veränderbar). Jede String
209 | Operation erzeugt einen neuen String.
210 |
211 | - Ein String kann erzeugt werden mit einer Zeichenkette in
212 | Anführungszeichen, `''` oder `""` (beide sind äquivalent).
213 |
214 | - rohe Strings mir dem Präfix `r`, `r"mystring"` oder `r'mystring'`
215 |
216 | - Strings in Python3 sind UTF-8 encoded.
217 |
218 | ---
219 |
220 | ### Verknüpfen
221 |
222 | - Strings können durch Konkatenation verknüpft werden
223 | ```python
224 | ’Hallo’ + ’_’ + ’Welt’ # => ’Hallo_Welt’
225 | ```
226 | - Listen, Tupel etc. von Strings können via `str.join` verknüpft
227 | werden
228 | ```python
229 | ’_’.join([’Hallo’, ’Welt’]) # => ’Hallo_Welt’
230 | ```
231 | Dabei ist der String, auf welchem die Methode aufgerufen wird,
232 | der Separator.
233 |
234 | ---
235 |
236 | ## Formatierung
237 |
238 | Wir wollen den String `'my string 4 vier'` erzeugen.
239 | ```python
240 | # mit str.format()
241 |
242 | 'my string {} {}'.format(4, 'vier')
243 | # in Reihenfolge der argumente
244 |
245 | 'my string {number} {name}'.format(name='vier', number=4)‘
246 | # via Name, Reihenfolge egal
247 |
248 | 'my string {number} {}'.format('vier', number=4)
249 | # oder beides kombiniert
250 | ```
251 | ---
252 |
253 | Wir wollen den String `'my string 4 vier'` erzeugen.
254 | ```python
255 | # und mit dem %−Operator
256 |
257 | 'string%d%s'%(4, 'vier')
258 | # in Reihenfolge
259 |
260 | 'string %(number)d%(name)s' % {number:4, name:'vier'}
261 | # via Name
262 | ```
263 |
--------------------------------------------------------------------------------
/md/02_grundlagen.md:
--------------------------------------------------------------------------------
1 | # Scriptcharakter
2 |
3 | ---
4 |
5 |
6 | - Beim Ausführen oder Importieren wird der Code im obersten Level des
7 | Moduls (der .py Datei) ausgeführt
8 | - Funktionen, Klassen und globale Variablen werden üblicherweise
9 | auf dem obersten Level definiert
10 | - Imports anderer Python Module werden auch hier ausgeführt
11 |
12 | ---
13 |
14 | Soll das entsprechende Modul ausführbar sein und nicht
15 | nur als Bibliothek dienen, definiert man üblicherweise eine _main_-Funktion.
16 | Zusätzlich fügt man am Ende des Moduls die _Boilerplate_ ein.
17 |
18 | ---
19 |
20 | ```python
21 | def main():
22 | pass
23 |
24 | if __name__ == '__main__':
25 | main()
26 |
27 | ```
28 |
29 | ---
30 |
31 | - Python Code wird nicht kompiliert, sondern beim importieren in
32 | Python Bytecode übersetzt
33 | - Bytecode wird auf einer VM ausgeführt
34 | - Kein Memory Management nötig, alles sind Referenzen
35 | - Syntaxerror wird beim Importieren geworfen
36 | - Andere Fehler findet man erst, wenn die betreffende Zeile
37 | ausgeführt wird.
38 |
39 | # Programmierparadigmen
40 |
41 | ## Imperatives Programmieren
42 |
43 | - Python ist vor allem eine imperative und objektorientierte Sprache
44 | - reine Funktionen und Variablen können auf oberster Ebene definiert
45 | werden
46 | - Variablen, Klassen und Funktionen sind ab der Ebene sichtbar, in der
47 | sie eingeführt werden
48 |
49 | ## Das Scoping Problem
50 |
51 | Variablen sind zwar nach innen sichtbar, werden aber beim Reassignment
52 | innerhalb der Funktion neu angelegt und verschwinden so aus dem Scope.
53 |
54 | ---
55 |
56 | ```python
57 | var = 12
58 |
59 | def foo():
60 | # erwarteter Effekt: var wird auf 9 gesetzt
61 | var = 9
62 |
63 | def main():
64 | print(var) # -> gibt 12 zurueck
65 | foo()
66 | print(var) # -> Erwartung: gibt 9 aus.
67 | # Realitaet: gibt 12 aus.
68 |
69 | if __name__ == '__main__':
70 | main()
71 | ```
72 |
73 | ---
74 |
75 | **Die Lösung:**
76 | ```python
77 | var = 12
78 |
79 | def foo():
80 | global var
81 | # global sagt dem Interpreter, dass er hier auf die
82 | # oberhalb definierte Variable zurueckgreifen soll
83 | var = 9
84 |
85 | def main():
86 | print(var) # -> gibt 12 zurueck
87 | foo()
88 | print(var) # -> gibt jetzt 9 aus
89 |
90 | if __name__ == '__main__':
91 | main()
92 | ```
93 |
94 | ## Objektorientiertes Programmieren
95 |
96 | - Python ist auch fundamental objektorientiert
97 | - Alles in Python ist ein Objekt
98 | - Selbst die Datentypen `int`, `bool`, `str` und `type` sind Instanzen
99 | von `object` und haben folglich Methoden und Attribute
100 | - Der Typ jedes Wertes und jeder Variablen lässt sich mit `type()`
101 | ermitteln
102 |
103 |
104 | # Klassen und Attribute
105 |
106 | ---
107 |
108 | - Typen in Python werden ausgedrückt durch Klassen (Keyword `class`)
109 | - Klassen dienen als Vorlage bzw. Schablone -> Objekte sind dann
110 | Instanzen davon
111 | - Die Besonderheit: alle Variablen und Werte sind Instanzen von
112 | `object`
113 |
114 | ---
115 |
116 | `object` und alle Typen selbst sind widerum Objekte, genauer gesagt
117 | Instanzen vom Typ `type` und `type` widerum ist eine Subklasse von
118 | `object`.
119 |
120 | ---
121 |
122 | - Klassen und Objekte können selbst auch Variablen tragen (ähnlich wie
123 | in Java)
124 | - Man unterscheidet dabei zwischen Klassenattributen und
125 | Instanzattributen
126 |
127 | ---
128 |
129 | **Klassenattribute**
130 | werden für die Klasse definiert und sind für alle Instanzen gleich
131 |
132 | **Instanzattribute**
133 | werden außerhalb der Klassendefnition hinzugefügt (normalerweise
134 | im Initialisierer) und sind für jede Instanz unterschiedlich.
135 |
136 | ---
137 |
138 | - Zugriff auf Attribute über Punktnotation (wie in Ruby/Java)
139 | - Attribute werden wie Variablen mithilfe von `=` gesetzt
140 | - Man kann Objekten jederzeit neue Attribute hinzufügen (auch
141 | `type`-Objekten)
142 | - Ist außerhalb des Initialisierers nicht empfehlenswert
143 |
144 |
145 | ## Klassen- und Objektattribute im Detail
146 |
147 | ---
148 |
149 | Klassenattribute sind für jede Instanz eines Objektes gleich.
150 | ```python
151 | class TestClass:
152 | # jeder Instanz wird bei Erstellung bereits
153 | # dieses Attribut zugewiesen
154 | num = 12
155 |
156 | def main():
157 | a = TestClass()
158 | b = TestClass()
159 | # beide Variablen haben fuer 'num' von der
160 | # Erstellung an den gleichen Wert
161 |
162 | # das Aendern der Variable ueberschreibt das
163 | # Klassenattribut mit einem Instanzattribut
164 | a.num = -3
165 | print(b.num) # -> liefert immer noch 12
166 | ```
167 |
168 | ---
169 |
170 | Gewöhnlich definiert man Instanzattribute allerdings im
171 | *Initialisierer*.
172 | ```python
173 | class Human:
174 | def __init__(self, firstname, lastname):
175 | # die beiden Parameterwerte werden in Instanz-
176 | # attributen gespeichert.
177 | self.firstname = firstname
178 | self.lastame = lastname
179 |
180 | def main():
181 | # instanziiert zwei Objekte vom Typ 'Human'
182 | matthias = Human("Matthias", "Stuhlbein")
183 | john = Human("John", "Doe")
184 | ```
185 | Instanzattribute sollten immer in \_\_init\_\_ definiert werden, um
186 | sicherzustellen, dass alle Instanzen die gleichen Attribute haben
187 |
188 |
189 | ## Super- und Subklassen
190 |
191 | Eine Klasse kann Attribute einer anderen Klasse erben, indem sie mit
192 | ```python
193 | class subclass(superclass):
194 | ```
195 | definiert wird.
196 |
197 | ---
198 |
199 | - Subklassen enthalten von Anfang an alle Attribute der Superklasse.
200 | - Es können neue Variablen und Methoden hinzugefügt, und auch alte überschrieben werden.
201 | - Die Attribute der Superklasse können mit `super()` aufgerufen werden.
202 |
203 | ---
204 |
205 | ```python
206 | class Human():
207 | def __init__(self, fistname, lastname, dob):
208 | self.firstname = firstname
209 | self.lastname = lastname
210 | self.dob = dob
211 |
212 |
213 | class Child(Human):
214 | # Ein Child ist einfach nur ein Human mit den
215 | # zusaetzlichen Attributen father und mother
216 | def __init__(self, fistname, lastname, dob, father, mother):
217 | super.__init__(fistname, lastname, dob)
218 | self.father = father
219 | self.mother = mother
220 | ```
221 |
222 | # Methoden
223 |
224 | ---
225 |
226 |
227 | - Methoden sind Funktionen
228 | - Allgemeiner Typ von Methoden ist daher `function`
229 | - Methoden liegen im Namespace der zugehörigen Klasse, müssen daher
230 | mit `ClassName.method_name()` angesteuert werden (oder auf dem
231 | Objekt aufgerufen werden)
232 |
233 | ---
234 |
235 | - Methoden haben ein implizites erstes Argument (typischerweise “self”
236 | genannt, kann aber variieren)
237 | - Beim Aufruf auf einer Instanz wird das Objekt selbst automatisch
238 | übergeben
239 |
240 | ## Spezielle Methoden
241 |
242 | Dies sind Methoden die auf den meisten
243 | Grundlegenden Datenstrukturen implementiert sind, z.B. `object`.\
244 | Die Folgenden beginnen und enden normalerweise mit zwei Unterstrichen.
245 |
246 | ---
247 |
248 | **Initialisierer**
249 | Oft auch (fälschlicherweise) Konstruktor genannt.
250 | Name: `__init__`
251 | Wird immer aufgerufen wenn eine neue Instanz der Klasse erstellt wird.
252 |
253 | ---
254 |
255 | **Finalisierer**
256 | Oft auch (fälschlicherweise) Destructor genannt.
257 | Name: `__del__`
258 | Wird immer aufgerufen wenn das Objekt vom Garbage Collector aufgeräumt wird.
259 | (selten verwendet)
260 |
261 | ---
262 |
263 | **String Konvertierer**
264 | Äquivalent zu Java’s `toString` Methode. Name: `__str__`
265 |
266 | **String Repräsentation**
267 | Ähnlich wie `__str__` aber gedacht für eine für Debug verwendbare Repräsentation anstatt für Output wie `__str__`.
268 |
--------------------------------------------------------------------------------
/md/03_builtins.md:
--------------------------------------------------------------------------------
1 | # Exception Handling
2 |
3 | ---
4 |
5 | - Alle Exceptions erben von `Exception`
6 | - Catching mit try/except
7 | - `finally` um Code auszuführen, der *unbedingt* laufen muss, egal ob
8 | eine Exception vorliegt oder nicht
9 |
10 | ---
11 |
12 | ```python
13 | class MyException(Exception):
14 | def __init__(self, message):
15 | self.message = message
16 |
17 | def __repr__(self):
18 | return '{} mit nachricht {}'.format(self.__class__,
19 | self.message)
20 | ```
21 |
22 | ---
23 |
24 | ```python
25 | try:
26 | # code
27 | raise KeyError('message')
28 | # mit nur einer exception
29 | # except MyException as error:
30 | except (KeyError, MyException) as error:
31 | print(error)
32 | pass
33 | finally:
34 | # was unbedingt zu tun ist
35 |
36 | ```
37 |
38 | # Boolsche Werte
39 |
40 | ---
41 |
42 | - *type* ist `bool`
43 | - Mögliche Werte: `True` oder `False`
44 | - Operationen sind *und*, *oder*, *nicht* (`and, or, not`)
45 |
46 |
47 | # list
48 |
49 | ---
50 |
51 | - enthält variable Anzahl von Objekten
52 | - eine Liste kann beliebig viele verschiedene Datentypen
53 | enthalten (z.B. `bool` und `list`)
54 | - Auch Listen können in Listen gespeichert werden!
55 | - Listenobjekte haben eine feste Reihenfolge (*first in, last out*)
56 | - optimiert für einseitige Benutzung wie z.B. Queue (`append` und
57 | `pop`)
58 |
59 | ---
60 |
61 | ```python
62 | l = [1, 9, 'string', object]
63 |
64 | isinstance(l[0], int) # ==> True
65 | l[1] == 9 # ==> True
66 | len(l) # ==> 4
67 |
68 | 9 in l # ==> True
69 |
70 | l.pop() # ==> object
71 | len(l) # ==> 3
72 | l.append([]) # ==> None
73 |
74 | l # ==> [1, 9, 'string', []]
75 | len(l) # ==> 4
76 | ```
77 |
78 | # tuple
79 |
80 | ---
81 |
82 | - Gruppiert Daten
83 | - kann nicht mehr verändert werden, sobald es erstellt wurde
84 | - Funktionen mit mehreren Rückgabewerten geben ein Tupel zurück
85 |
86 | ---
87 |
88 | ```python
89 | # Tupel mit 3 Elementen
90 | t = (1, 3, 'ein string')
91 | isinstance(t, tuple) # ==> True
92 |
93 | t[0] == 1 # ==> True
94 | t[1] == 3 # ==> True
95 | t[2] == 'ein string' # ==> True
96 | t[4] == 'ein string' # ==> IndexError: tuple index out of range
97 | t[2] = 'ein anderer string' # ==> TypeError: 'tuple' object
98 | # does not support item assignment
99 |
100 | # oder auch ohne klammern
101 | t = 1, 3, 'ein string'
102 | # macht es (manchmal) besser lesbar, z.b. bei
103 | return 1, 2, 5
104 | ```
105 |
106 | # dict
107 |
108 | ---
109 |
110 | - einfache HashMap
111 | - ungeordnet
112 | - jeder hashbare Typ kann ein Key sein
113 | - jedem Key ist dann ein Value zugeordnet
114 |
115 | ---
116 |
117 | ```python
118 | d = { 'm': 4, 3: 'val2', object: 'auch typen koennen keys sein' }
119 |
120 | d[3] # ==> "val2"
121 | d['q'] # ==> KeyError: 'q'
122 | d.get('q') # ==> None
123 | d.get('q', 5) # ==> 5
124 |
125 | d[0] = 7
126 | d # ==> {3: 'val2', 'm': 4, 'q': 5,
127 | # : 'auch typen koennen schluessel sein'}
128 | ```
129 |
130 | ---
131 |
132 | ```python
133 | d.setdefault('m') # ==> 4
134 | d.setdefault('q', 5) # ==> 5
135 | d # ==> { 'm': 4, 3: 'val2',
136 | # object: 'auch typen koennen keys sein',
137 | # 0:7, 'q': 5 }
138 | len(d) # ==> 5
139 | d.keys() # ==> dict_keys([3, 0, 'm', 'q', ])
140 | d.values() # ==> dict_values(['val2', 7, 4, 5,
141 | # 'auch typen koennen keys sein'])
142 | d.items() # ==> dict_items([(3, 'val2'), (0, 7), ('m', 4),
143 | # ('q', 5), (,
144 | # 'auch typen koennen ...')])
145 |
146 | 'm' in d # ==> True
147 | object in d # ==> True
148 | tuple in d # ==> False
149 | ```
150 |
151 | # set/frozenset
152 |
153 | ---
154 |
155 | - kann nur hashbare Einträge enthalten
156 | - `set` selbst ist nicht hashbar
157 | - `frozensets` sind hashbar, jedoch nicht mehr veränderbar
158 | - enthält jedes Element nur einmal
159 |
160 | ---
161 |
162 | - schnellere Überprüfung mit `in` (prüft, ob Element enthalten ist)
163 | - Mögliche Operationen: `superset()`, `subset()`, `isdisjoint()`,
164 | `difference()`, `<`, `>`, `disjoint()`, `-`
165 | - ungeordnet
166 | - (frozen)sets können frozensets enthalten
167 |
168 | ---
169 |
170 | ```python
171 | s1 = {1, 2, 'string', object, ('ein', 'tuple')}
172 |
173 | 2 in s1 # ==> True
174 | 'ein' in s1 # ==> False
175 | ('ein', 'tuple') in s1 # ==> True
176 | set(('ein', 'tuple')) # ==> {'ein', 'tuple'}
177 |
178 | s2 = {'anderes', 'set'}
179 | s1 > s2 # ==> False
180 | s1.isdisjoint(s2) # ==> True
181 |
182 | s1.add('anderes')
183 | s1 | s2 # ==> {1, 2, 'string', object, ('ein', 'tuple'), 'set'}
184 | s1 & s2 # ==> {'anderes'}
185 | s2 - s1 # ==> {'set'}
186 | ```
187 |
188 | ---
189 |
190 | ```python
191 | s2 = frozenset(s2)
192 | s1.add(s2)
193 | s2.add(5) # ==> AttributeError: 'frozenset' object has no attribute 'add'
194 | ```
195 |
196 | # Iteraton
197 |
198 | ---
199 |
200 | - nur foreach
201 | - für Iterationen über Integer gibt es `range([start], stop, step=1)`
202 | - um Iteratoren zu kombinieren kann man
203 | `zip(iterator_1, iterator_2, ..., iterator_n)` verwenden
204 | - alles mit einer `__iter__` Methode ist iterierbar
205 | - `iter(iterable)` konstruiert einen *stateful iterator*
206 |
207 | ---
208 |
209 | ```python
210 | for i in [1,2,3]:
211 | if i > 9:
212 | break
213 | # code
214 | else:
215 | pass
216 | # wenn kein break vorkommt
217 |
218 | for i in (1,2,3):
219 | # code
220 | pass
221 |
222 | for i in {1:'value1', 2:'value2'}:
223 | # iteration ueber die keys
224 | pass
225 | ```
226 |
227 | ---
228 |
229 | ```python
230 | for i in {1:'value1', 2:'value2'}.items():
231 | # i ist tuple von (key, value)
232 | pass
233 |
234 | for value1, value2 in [
235 | (1, 'werner'),
236 | (3, 'geh mal in den keller'),
237 | (42, 'ich glaub die russen komm\'')
238 | ]:
239 | # iteration mit tuple unpacking
240 | # code
241 | ```
242 |
243 | ---
244 |
245 | ```python
246 | # oder auch
247 |
248 | for value1, value2 in zip([1,3,42], ['werner',
249 | 'geh mal in den keller',
250 | 'ich glaub die russen komm\'',
251 | 'dieser string wird in \
252 | der iteration nicht auftauchen', 'dieser auch nicht'])
253 |
254 | for key, value in {1:'value1', 2:'value2'}.items():
255 | # iteration ueber keys und values mit tuple unpacking
256 | pass
257 | ```
258 |
259 | # unpacking
260 |
261 | ---
262 |
263 | - einfaches Auflösen von Listen und Tupeln in einzelne Variablen
264 | - nützlich in `for`-Schleifen
265 |
266 | ---
267 |
268 | ```python
269 | # unpacking (geht auch mit listen)
270 | t = 1, 3, 'ein string' # tuple ohne klammern gebaut
271 |
272 | x, y, z = t
273 | x is t[0] # ==> True
274 | y is t[1] # ==> True
275 |
276 | x, *y = t
277 | x # ==> 1
278 | y # ==> [3, 'ein string']
279 |
280 | a, b, c = 1, 2, 4
281 |
282 | d, e, f, *g = [3, 0, 8, 7, 46, 42]
283 | f # ==> 8
284 | g # ==> [7, 46, 42]
285 | ```
286 |
287 | # Context Manager
288 |
289 | ---
290 |
291 | - Aufruf mit `with`
292 | - kann jedes Objekt sein, welches eine `__enter__` und `__exit__`
293 | Methode hat
294 | - praktisch beim *File Handling*
295 |
296 | ---
297 |
298 | ```python
299 | class MyManager:
300 | def __enter__(self):
301 | # tue dinge
302 | pass
303 |
304 | def __exit__(self):
305 | # schliesse handler etc ...
306 | pass
307 |
308 | def do_things(self):
309 | # ...
310 | pass
311 |
312 | with MyManager() as m:
313 | m.do_things()
314 | ```
315 |
316 | #File Handling
317 |
318 | ---
319 |
320 | - Dateien können mit `open(filename, mode=r)` geöffnet werden
321 | - *File Handler* sind Iteratoren über die Zeilen einer Datei
322 | - **Wichtig:** File Handler müssen auch wieder geschlossen werden
323 | - `r` steht für Lesezugriff, `w` für Schreibzugriff
324 |
325 | **Beachte:** Wird eine Datei mit Schreibzugriff geöffnet, wird
326 | sie geleert! Also wichtige Inhalte vorher auslesen.
327 |
328 | ---
329 |
330 | ```python
331 | with open(myfile, mode='r') as f:
332 | for line in f:
333 | # code
334 |
335 | with open(myfile, mode='w+') as f:
336 |
337 | for line in document:
338 | f.write(line)
339 | # oder
340 | print(line, file=f)
341 |
342 | f = open(myfile)
343 | # code
344 | f.close()
345 | ```
346 |
--------------------------------------------------------------------------------
/md/04_modules_packages_pip.md:
--------------------------------------------------------------------------------
1 | # Module
2 |
3 | ## (Eigene) Module
4 |
5 |
6 | - Ein Modul ist die python-interne Repräsentation einer `.py` Datei
7 | - Der Dateiname setzt sich daher aus Modulname + `.py` zusammen
8 |
9 | ---
10 |
11 | - Module beinhalten eine beliebige Anzahl an Definitionen (Klassen,
12 | Funktionen, Variablen/Konstanten)
13 | - Das komplette Modul wird mit `import` hinzugefügt
14 | - Einzelne Inhalte mit `from` Modul `import` Name
15 | - Mit Hilfe von `as` kann ein Alias für den importierten Namen
16 | angelegt werden
17 |
18 | ---
19 |
20 | ### Ein Beispiel
21 |
22 | Die Datei **incdec.py** enthält eine Reihe von
23 | Funktionen:
24 |
25 | ```python
26 | def increment(a):
27 | return a+1
28 |
29 | def decrement(a):
30 | return a-1
31 | ```
32 |
33 | ---
34 |
35 | In einem anderen Python-Script kann ich diese
36 | Funktionen nutzen:
37 |
38 | ```python
39 | # Importieren des kompletten Moduls incdec
40 | import incdec
41 |
42 | # Die Funktionen koennen wie folgt aufgerufen werden:
43 | incdec.increment(3) # => 4
44 | incdec.decrement(3) # => 2
45 |
46 | # Importieren einzelner Funktionen
47 | from incdec import increment
48 |
49 | # Diese kann jetzt sofort aufgerufen werden
50 | increment(3) # => 4
51 | ```
52 |
53 | ---
54 |
55 | ```python
56 | # Alias fuer Module verwenden
57 | import incdec as plusoneminusone
58 |
59 | plusoneminusone.inrement(3) # => 4
60 | ```
61 |
62 | ---
63 |
64 | ### Der Sinn der Boilerplate
65 |
66 | - Verhindert, dass Code beim Importieren eines Scriptes ausgeführt
67 | wird
68 | - Beim Aufruf des Moduls über `import` ist der Name des Moduls nicht
69 | `__main__`, sondern der Name des Scriptes (im vorherigen Beispiel
70 | wäre das `incdec`)
71 |
72 | ## Suchpfad für Module
73 |
74 | ---
75 |
76 | - Python sucht Module beim Import an allen im **PYTHONPATH**
77 | aufgelisteten Ordnern
78 | - dieser findet sich in Python unter `sys.path`, in der Kommandozeile
79 | in der Umgebungsvariable PYTHONPATH
80 | - `sys.path` lässt sich zur Laufzeit im Interpreter ändern (z.B. um
81 | nachträglich neue eigene Module hinzuzufügen)
82 |
83 | ---
84 |
85 | Standardmäßig enthält der Suchpfad
86 | folgende Module:
87 |
88 | - die *Standardbibliothek* der derzeitig verwendeten Python-Version
89 | - das *aktuelle Verzeichnis*, in dem der Interpreter aufgerufen wurde
90 | - eine *Verzeichnis mit plattfomspezifischen Modulen*, z.B.
91 | “/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/
92 | Versions/3.5/lib/python3.5/plat-darwin” für Mac
93 | - *Benutzerspezifische Module für die jeweilige Python Version*, z.B.
94 | “/usr/local/lib/python3.5/site-packages” für Python 3.5
95 |
96 | ## Suchpfad modifizieren
97 |
98 | ---
99 |
100 | Zusätzliche Verzeichnisse für den
101 | PYTHONPATH kann man beim Aufruf übergeben:
102 |
103 | `$ PYTHONPATH=/my/directory python3 script.py`
104 |
105 | ---
106 |
107 | Oder im Programm:
108 |
109 | ```python
110 | import sys
111 |
112 | sys.path.append('my/directory')
113 | ```
114 |
115 | Änderungen am Pfad sind erst **nach** der
116 | entsprechenden Codezeile verfügbar.
117 |
118 | ## Standardmodule
119 |
120 | ---
121 |
122 | Python liefert viele nützliche Module
123 | bereits in der Standardbibliothek mit, z.B.: `sys`, `os`, `http`, `re`,
124 | `functools`, `itertools`, `collections`, `hashlib`, `urllib` und viele
125 | mehr.
126 |
127 | Daher bezeichnet man Python oft auch als **Batteries included**.
128 |
129 | # Packages
130 |
131 | ---
132 |
133 | - Packages sind Ordner, die mindestens ein `__init__.py`
134 | Modul enthalten.
135 | - der Inhalt dieses Moduls ist prinzipiell egal
136 | - Packages können genau wie Module importiert werden
137 |
138 | ---
139 |
140 | - Wird das Package selbst importiert, sind alle Definitionen in
141 | `__init__.py` über das importierte Package erreichbar.
142 | - wird benutzt, um Module in sinnvolle Gruppen zusammenzufassen
143 |
144 | # PIP
145 |
146 |
147 |
148 | ## Installation von PIP
149 |
150 | ---
151 |
152 | Nicht jedes Modul ist in der Standardbibliothek vorhanden,
153 | muss aber nicht zwingen manuell als Datei hinzugefügt werden.
154 | Man kann ganz einfach PIP zur Hilfe nehmen.
155 |
156 | ---
157 |
158 | **Installation:**
159 |
160 | 1. Downloaden der `get-pip.py` von pypa
161 | 2. Installieren via `python3 get-pip.py`
162 |
163 |
164 | *Hinweis für Mac-Nutzer:*
165 | Bei der Pythoninstallation via *Homebrew* wird pip gleich mit
166 | installiert.
167 |
168 | ## Verwendung
169 |
170 | ---
171 |
172 | Die Installation von Modulen ist einfach und es
173 | gibt mehrere Möglichkeiten:
174 |
175 | - die aktuellste Version eines Moduls:
176 | `pip install Modulname`
177 | - eine bestimmte Version:
178 | `pip install Modulname==2.1`
179 | - alle Versionen ab einem Minimum:
180 | `pip install Modulname>=2.1`
181 | - alle Versionen bis zu einem Maximum:
182 | `pip install Modulname<=2.1`
183 |
184 | ## Die requirements.txt
185 |
186 | ---
187 |
188 | Wenn jemand Scripte ausführen möchte, in denen Module verwendet werden,
189 | die mit Hilfe von PIP installiert wurden, ist es hilfreich eine
190 | `requirements.txt` mitzuliefern. In dieser sind alle Module aufgelistet,
191 | die benötigt werden.
192 | Via `pip install -r requirements.txt` können alle
193 | Module von der Liste installiert werden.
194 |
--------------------------------------------------------------------------------
/md/05_decorators.md:
--------------------------------------------------------------------------------
1 | # Fakten über Funktionen
2 |
3 | ---
4 |
5 |
6 | - Funktionen können Variablen zugewiesen werden,
7 |
8 | ```python
9 | # Funktionen Variablen zuweisen
10 | def return_hello():
11 | return "Hello"
12 |
13 | say_hello = return_hello
14 |
15 | print(say_hello())
16 | # => Hello
17 | ```
18 |
19 | ---
20 |
21 | - Sie können in Funktionen definiert werden,
22 |
23 | ```python
24 | # Funktionen in Funktionen definieren
25 | def greet(name):
26 | def return_hello():
27 | return "Hello "
28 | greeting = return_hello() + name
29 | return greeting
30 |
31 | print(greet("World"))
32 | # => Hello World
33 | ```
34 |
35 | ---
36 |
37 | - Sie können andere Funktionen zurückgeben,
38 |
39 | ```python
40 | # Rueckgabe von Funktionen
41 | def greet():
42 | def say_hello():
43 | return "Hello"
44 | return say_hello
45 |
46 | print(greet())
47 | # Hello
48 | ```
49 |
50 | ---
51 |
52 | - Sie können als Parameter mitgegeben werden
53 |
54 | ```python
55 | # Uebergabe von Funktionen
56 | def say_date(date):
57 | return "Today it's {date}".format(date=date)
58 |
59 | def which_date(function):
60 | date = "25th June 2015"
61 | return function(date)
62 |
63 | print(which_date(say_date))
64 | # => Today it's 25th June 2015
65 | ```
66 |
67 | # Decorator
68 |
69 | ## einfache Decorator
70 |
71 |
72 | Decorator sind Wrapper über existierende Funktionen.
73 | Dabei werden die zuvor genannten Eigenschaften verwendet.
74 | Eine Funktion, die eine weitere als Argument hat, erstellt eine neue
75 | Funktion.
76 |
77 | ---
78 |
79 | ```python
80 | def get_date(date):
81 | return ", today it's {}.".format(date)
82 |
83 |
84 | # unser decorator
85 | def tell_the_world(func):
86 | def complete_sentence(date):
87 | return "Hello World{}".format(func(date))
88 | return complete_sentence
89 | ```
90 |
91 | ---
92 |
93 | ```python
94 | # normaler Aufruf:
95 | print(tell_the_world(get_date)("25th June 2015"))
96 |
97 | # als decorator
98 | get_date = tell_the_world(get_date)
99 |
100 | print(get_date("25th June 2015"))
101 | # => Hello World, today it's 25th June 2015.
102 | ```
103 |
104 | ---
105 |
106 | Durch das `@` Symbol lässt sich der Decorator wesentlich einfacher verwenden.
107 | Es können auch mehrere Decorator übereinander geschrieben werden.
108 |
109 | ---
110 |
111 | ```python
112 | # Nutzung des @ Syntaxes
113 | def tell_the_world(func):
114 | def complete_sentence(date):
115 | return "Hello World, {}".format(func(date))
116 | return complete_sentence
117 |
118 |
119 | @tell_the_world
120 | def get_date(date):
121 | return "today it's {}.".format(date)
122 |
123 | print(get_date("25th June 2015"))
124 | # => Hello World, today it's 25th June 2015.
125 | ```
126 |
127 | ## Decorator mit Argumenten
128 |
129 |
130 | Decorator erwarten Funktionen als
131 | Argumente. Aus diesem Grund kann man nicht einfach andere Argumente
132 | mitgeben, sondern man muss eine Funktion schreiben, die dann den
133 | Decorator erstellt.
134 |
135 | ---
136 |
137 | ```python
138 | # Decorator mit Argumenten
139 | def tell_the_date_to(name):
140 | def name_decorator(func):
141 | def complete_sentence(date):
142 | return "Hello {name}, {date}".format(name=name,
143 | date=func(date))
144 | return complete_sentence
145 | return name_decorator
146 |
147 |
148 | @tell_the_date_to("John Doe")
149 | def get_date(date):
150 | return "today it's {}.".format(date)
151 |
152 | print(get_date("25th June 2015"))
153 | # => Hello John Doe, today it's 25th June 2015.
154 | ```
155 |
--------------------------------------------------------------------------------
/md/06_comprehensions.md:
--------------------------------------------------------------------------------
1 | # Basics
2 |
3 | ---
4 |
5 | Comprehensions sind eine bequeme Art und Weise, um
6 | _Funktoren_ (Datenstrukturen, die andere Datenstrukturen beinhalten) mit
7 | kleinen Expressions zu erstellen und zu füllen und sind in allen
8 | modernen Sprachen vorhanden.
9 |
10 |
11 | # List Comprehensions
12 |
13 | ---
14 |
15 |
16 | Grundlegender Syntax:
17 |
18 | ```python
19 | [EXPRESSION for LAUFVARIABLE in ITERABLE (if FILTER)]
20 | ```
21 |
22 |
23 | ### EXPRESSION
24 |
25 | ein beliebiger Ausdruck (man stelle sich ein implizites
26 | `return` vor), etwa ein Wert, eine Variable, eine Gleichung, etc ...
27 |
28 | `EXPRESSION` wird am Ende in der Liste abgelegt.
29 |
30 | ---
31 |
32 | ### LAUFVARIABLE
33 |
34 | Eine beliebige Variable, die in *EXPRESSION* und *FILTER* zur
35 | Verfügung steht
36 |
37 | ---
38 |
39 | ### ITERABLE
40 |
41 | Ist häufig etwas wie `range()` oder eine andere Liste.
42 |
43 | ---
44 |
45 | ### FILTER
46 |
47 | Eine optionale boolean expression, womit Einträge gefiltert werden
48 | (falls Expression `false`) Nützlich, wenn z.B. nur gerade Zahlen übernommen werden
49 | sollen, usw...
50 |
51 | ---
52 |
53 | ### Beispiel
54 |
55 | ```python
56 | varList = [var * 8 for var in range(10)]
57 | # => [0, 8, 16, 24, 32, 40, 48, 56, 64, 72]
58 |
59 |
60 | # mit Filter (hier: für i ist gerade)
61 | evenVarList = [var * 8 for var in range(10) if var % 2 == 0]
62 | # => [0, 16, 32, 48, 64]
63 | ```
64 |
65 |
66 | # Dict Comprehension
67 |
68 | ---
69 |
70 | Grundlegender Syntax:
71 |
72 | ```python
73 | {KEY: VALUE for LAUFVARIABLE in ITERABLE (if FILTER)}
74 | ```
75 |
76 | ---
77 |
78 | Fast der gleiche Syntax, nur diesmal mit 2 Expressions: __KEY__ und
79 | __VALUE__. Ansonsten gelten die gleichen Regeln.
80 |
81 |
82 | ## Beispiel
83 |
84 | ```python
85 | liste = ["Fritz", "Alex", "Nadine", "Peter", "Anna"]
86 |
87 | names = {key: len(key) for key in liste}
88 | # => {'Peter': 5, 'Fritz': 5, 'Alex': 4, 'Anna': 4, 'Nadine': 6}
89 | ```
90 |
91 |
92 | # Generators
93 |
94 | ## Generator
95 |
96 | Ein Objekt, über das iteriert werden kann. Wenn ein Element daraus
97 | verwendet wurde, ist es nicht mehr in dem Generatorobjekt
98 | enthalten.
99 |
100 | ---
101 |
102 | Die grundlegende Syntax ist gleich der einer *List Comprehension*. Da
103 | sich `list` und `dict` auch aus Iterables bauen lassen, gilt prinzipiell:
104 |
105 | ```python
106 | list(EXPR for VAR in ITERABLE) == [EXPR for VAR in ITERABLE]
107 | ```
108 | und
109 | ```python
110 | dict((KEY, VAL) for VAR in ITERABLE) == {KEY: VAL for VAR in ITERABLE}
111 | ```
112 |
113 | ---
114 |
115 | **Aber:** Generators verhalten sich anders als Lists oder Dicts!
116 |
--------------------------------------------------------------------------------
/md/07_functions_advanced.md:
--------------------------------------------------------------------------------
1 | # Nutzung von Funktionen
2 |
3 |
4 | ## Funktionen als Werte
5 |
6 | ---
7 |
8 | Funktionen können wie alle
9 | anderen Werte zugewiesen werden
10 |
11 | ```python
12 | def function(params):
13 | return 4
14 |
15 | my_var = function
16 | my_var(2) # ==> 4
17 | ```
18 |
19 | ---
20 |
21 | Oder als Parameter mitgegeben werden
22 |
23 | ```python
24 | def callif(boolean, callback):
25 | if boolean:
26 | callback()
27 |
28 | callif(True, lambda: print("hello world"))
29 | ```
30 |
31 | ---
32 |
33 | ## Methoden sind Funktionen
34 |
35 | ```python
36 | class MyClass(object):
37 | def function(self, param):
38 | return 4
39 |
40 | my_var = MyClass.function
41 | my_var(MyClass(), 2) # ==> 4
42 | ```
43 |
44 |
45 | ## Default Parameter
46 |
47 | ---
48 |
49 |
50 | - Funktionen können vordefinierte Werte für Parameter haben.
51 |
52 | - Parameter ohne `default`-Werten werden positionale Argumente genannt
53 |
54 | - Parameter mit `default`-Werten werden benannte Argumente genannt
55 |
56 | ---
57 |
58 | ```python
59 | def greet(name, greeting='Hello'):
60 | return '{} {}'.format(greeting, name)
61 |
62 | greet('Herbert')
63 | # ==> 'Hallo Herbert'
64 |
65 | greet('Herbert', 'Gruess Gott')
66 | # ==> 'Gruess Gott Herbert'
67 | ```
68 |
69 | ---
70 |
71 | ## ACHTUNG!
72 |
73 | ---
74 |
75 | __Niemals `mutable Values` (änderbare Werte) als `default`-Parameter verwenden!__
76 |
77 | ---
78 |
79 | __mutable Values:__
80 |
81 | `list`, `dict`, `set` und eigene Klassen (bzw. deren Attribute)
82 |
83 | __immutable Values:__
84 |
85 | `string`, `function`, `int`, `type` und `None`
86 |
87 | ---
88 |
89 | __Warum?__
90 |
91 | ```python
92 | def func(param1, param2=[]):
93 | print(param2)
94 | param2.append(param1)
95 | ```
96 |
97 | ---
98 |
99 | Man denkt, die Funktion hat jedes mal eine leere
100 | List, jedoch passiert folgendes:
101 |
102 | ```python
103 | func(1) # ==> []
104 | func(2) # ==> [1]
105 | func('j') # ==> [1,2]
106 | ```
107 |
108 | Die Liste wird einmalig zum Start angelegt und fortgeführt.
109 |
110 | ---
111 |
112 | So sollte man es machen:
113 |
114 | ```python
115 | def func(param1, param2=None):
116 | param2 = [] if param2 is None else param2
117 | pass
118 | ```
119 |
120 | Den `default`-Parameter als `None` setzten und dann, falls er `None` ist
121 | als z.B. leere Liste setzen.
122 |
123 | ---
124 |
125 | ## Aufruf mit Namen
126 |
127 | ---
128 |
129 | Funktionsparameter können
130 | direkt mit ihrem Namen aufgerufen werden, dann spielt die
131 | Aufrufreihenfolge keine Rolle mehr.
132 |
133 | ---
134 |
135 | ```python
136 | def land(house, tree, pond):
137 | return 'You own land with a {} \
138 | a {} and a {}'.format(house, tree, pond)
139 |
140 | land('green house', 'maple', 'fish pond')
141 |
142 | # oder mit Aufruf durch Namen:
143 | land(house='green house', pond='fish pond', tree='maple')
144 |
145 | # oder vermischt
146 | land('green house', pond='fish pond', tree='maple')
147 |
148 | # folgendes funktioniert NICHT!
149 | land('maple', house='green house', tree='maple')
150 | ```
151 |
152 | ---
153 |
154 | __Es gelten folgende Regeln:__
155 |
156 | - Alle Parameter können an ihrer Position angesprochen werden
157 | - Es können auch alle mit ihrem Namen angesprochen werden
158 | - Wenn eins mit dem Namen angesprochen wurde, müssen die folgenden
159 | ebenfalls mit Namen angesprochen werden
160 |
161 |
162 | # Aggregatoren
163 |
164 | ---
165 |
166 | **Aggregatoren** (auch Sammler genannt), sind
167 | sehr nützlich, wenn man, zusätzlich zu bereits definierten Parametern,
168 | in einer Funktion eine unbestimmte Anzahl an Funktionsargumenten
169 | entgegen nehmen will.
170 |
171 | ## Positionale Aggregatoren
172 |
173 | ---
174 |
175 | - jede Funktion kann einen Aggregator haben
176 | - dieser muss der *letzte* positionale Parameter sein
177 | - Positionale Aggregatoren werden durch einen `*` gekennzeichnet
178 | - nach einem Aggregator können nur noch benamte Parameter definiert
179 | werden, diese müssen auch mit Namen aufgerufen werden\
180 |
181 | ---
182 |
183 | Der Inhalt des Aggregators wird in einem *Tupel* gespeichert:
184 |
185 | ```python
186 | def f(*args):
187 | print(type(args)) # ==> tuple
188 | ```
189 |
190 | ---
191 |
192 | ### Beispiel
193 |
194 | ```python
195 | def function(param1, *aggr, param2=0):
196 | pass
197 |
198 | function(1, 2, 3, 4) # korrekt, aggr = (2,3,4)
199 | function(1, 2, 4, 5, 6, 78, 9, 90, 0)
200 | # auch korrekt, aggr = (2,4,5,6,78,9,90,0)
201 | function() # inkorrekt, param1 braucht mindestens ein Argument
202 | function(1, param2=7) # korrekt, aggr = ()
203 | function(param2=8) # inkorrekt, param1 braucht einen Wert
204 | function(param2=0, param1=6) # korrekt
205 | ```
206 |
207 | ---
208 |
209 | - Eine Funktion kann auch nur einen Aggregator als Parameter
210 | entgegennehmen (keine anderen Parameter)
211 | - Ohne Argumente ergibt sich `len(args)` zu 0
212 | - Werden keine anderen Parameter erwartet, nennt man den Aggregator
213 | meist `args` (kurz für *Arguments*)\
214 |
215 | ---
216 |
217 | In **Python 3** kann man Aggregatoren auch ohne Namen definieren:
218 | ```python
219 | def function(param1, param2, *, param3=6):
220 | pass
221 | ```
222 | Auf diesen Aggregator kann nicht zugegriffen werden. Er erzwingt lediglich,
223 | dass alle folgenden Parameter mit Namen aufgerufen werden.
224 |
225 | ## Benannte Aggregatoren
226 |
227 | ---
228 |
229 | Analog zu Parametern gibt es auch benannte Aggregatoren. Diese werden mit `**` vor dem
230 | Parameternamen definiert. Diese Aggregatoren akzeptieren lediglich
231 | benannte Parameter und sind vom Typ `dict`.
232 |
233 | ---
234 |
235 | ### Beispiel
236 |
237 | ```python
238 | def function(param1, **aggr):
239 | pass
240 |
241 |
242 | function(1) # korrekt, aggr = {}
243 | function(1, some=9) # korrekt, agar = {'some': 9}
244 | function(some=6) # inkorrekt, param1 braucht einen Wert
245 | function(some=0, param1=8, param2=4)
246 | # korrekt, agar = {'some': 0, 'param2': 4}
247 | ```
248 |
249 | Wenn eine Funktion keine anderen Parameter erwartet, nennt man den
250 | Aggregator meist `**kwargs` (kurz für *Keyword Arguments*)
251 |
252 |
253 | ## Benannte und Positionale Aggregatoren
254 |
255 | ---
256 |
257 | Beide Aggregatoren können gleichzeitig in einer Funktion verwendet werden.
258 | Die Regel dabei ist: Von jeder Sorte nur *ein* Aggregator.
259 |
260 | ---
261 |
262 | ### Beispiel
263 |
264 | ```python
265 | def function(
266 | param1,
267 | param2,
268 | *args,
269 | kwparam1=0,
270 | kwparam2=None,
271 | **kwargs
272 | ):
273 | pass
274 | ```
275 |
276 | ---
277 |
278 | ### Generelle Funktionsstruktur
279 |
280 | Wenn beide Aggregatoren zum Einsatz kommen sollen, ergibt sich folgende Funktionsstruktur:
281 |
282 |
283 | ```python
284 | def name(
285 | [params, ...]
286 | [, *[aggregator]]
287 | [, kwparams=kwvalue, ...]
288 | [**kwaggreg]
289 | ):
290 | pass
291 | ```
292 | *Eckige Klammern stehen für optionale Parameter/Namen.*
293 |
--------------------------------------------------------------------------------
/md/08_process.md:
--------------------------------------------------------------------------------
1 | # Grundlagen
2 |
3 | ---
4 |
5 | Das Modul `subprocess` erlaubt die Ausführung externer Befehle und Skripte von
6 | einem Python Skript aus.
7 |
8 | Man kann sich die Funktionsweise ähnlich der eines Terminals vorstellen.
9 |
10 | ---
11 |
12 | ## Eigenschaften
13 |
14 | - Subprozesse laufen asynchron
15 |
16 | - Sie laufen direkt auf dem System, nicht in einer Shell (wenn nicht
17 | anders festgelegt)
18 |
19 | - Verfügbare Programme hängen vom System ab, auf dem sie ausgeführt
20 | werden
21 |
22 | - Der Aufruf ist allgemeingültig, die Bibliothek verwandelt den Aufruf
23 | unter Windows in einen kompatiblen `CreateProcess()` String
24 |
25 | # Konstanten
26 |
27 | ---
28 |
29 | ### File Descriptoren
30 |
31 | `DEVNULL`
32 |
33 | Der systeminterne ’Mülleimer’
34 |
35 | `PIPE`
36 |
37 | Die Verbindung zwischen zwei Prozessen
38 |
39 | `STDOUT`
40 |
41 | Die Standardausgabe oder der laufende Prozess
42 |
43 | ---
44 |
45 | ### Exceptions
46 |
47 | `SubprocessError`
48 |
49 | Der Standardfehler dieses Moduls
50 |
51 | `TimeoutError`
52 |
53 | Ein Timeout ist aufgetreten
54 |
55 | `CalledProcessError`
56 |
57 | Der Subprozess endete auf eine unerwartete Art
58 |
59 | # Popen Klasse
60 |
61 | ---
62 |
63 | Die `Popen` Klasse bildet die Basis des Moduls `subprocess`.
64 |
65 | Die Funktionssignatur sieht wie folgt aus:
66 |
67 | ```python
68 | from subprocess import Popen
69 |
70 | Popen(args, bufsize=-1, executable=None, stdin=None,
71 | stdout=None, stderr=None, preexec_fn=None,
72 | close_fds=True, shell=False, cwd=None, env=None,
73 | universal_newlines=False, startupinfo=None,
74 | creationflags=0, restore_signals=True,
75 | start_new_session=False, pass_fds=())
76 | ```
77 |
78 | ---
79 |
80 | ## Wichtige Argumente
81 |
82 | `args`
83 |
84 | Die aufzurufenden Argumente. Sollten vom Typ `tuple` oder `list` sein.
85 | Im Prinzip splittet man den Konsolenbefehl an den Leerzeichen:
86 |
87 | `ls -A *.md` entspricht `[’ls’, ’-A’, ’*.md’]`
88 |
89 | ---
90 |
91 | `shell`
92 |
93 | Führt den Befehl in einer Shell aus. Sollte `False` sein (Standard),
94 | sonst ist der Aufruf unsicher.
95 |
96 | ---
97 |
98 | `stdout`
99 |
100 | zusammen mit `stdin` und `stderr` die Input- und Output-Verbindungen
101 | des Subprozesses
102 |
103 | (hier sind `DEVNULL`, `PIPE` und `STDOUT` nützlich)
104 |
105 | ---
106 |
107 | `env`
108 |
109 | Umgebungsvariablen des Kindprozesses. Standard ist ein Subset von
110 | `os.environ` (dem Python Prozess Environment)
111 |
112 | `cwd`
113 |
114 | Das Arbeitsverzeichnis des Subprozesses
115 |
116 | # Popen Objekte
117 |
118 | ---
119 |
120 | Wenn Popen instanziiert wird, wird der darin enthaltene Prozess gestartet und
121 | das zurückgegebene `Popen` Objekt enthält Informationen über den laufenden Prozess.
122 |
123 | ---
124 |
125 | ## Informationen sammeln
126 |
127 | ---
128 |
129 | `process.args`
130 |
131 | Gibt die Argumente zurück, mit denen der Prozess aufgerufen wurde.
132 |
133 | `obj.stdout`, `obj.stdin`, `obj.stderr`
134 |
135 | Input- und Output-Verbindungen, die beim Start gesetzt wurden
136 |
137 | `process.pid`
138 |
139 | Vom System zugewiesene *Prozess ID*.
140 |
141 |
142 | ---
143 |
144 | `process.poll()`
145 | Prüft, ob der Prozess beendet wurde. Gibt den *Rückgabewert* des Prozesses zurück oder `None`, wenn der Prozess noch läuft.
146 |
147 | `process.returncode`
148 |
149 | Der Rückgabewert von `process.poll()` (der Rückgabewert des Prozesses)
150 |
151 | ---
152 |
153 | ## Interaktion mit dem Prozess
154 |
155 | `process.wait(timeout=None)`
156 |
157 | Wartet *timeout* Sekunden auf die Terminierung des Prozesses (wartet
158 | unendlich lang, wenn timeout *None* ist).
159 | Wirft nach Ablauf von *timeout* eine `TimeoutExpired` Exception.
160 |
161 | ---
162 |
163 | `process.send_signal(signal)`
164 |
165 | Sendet das Signal *signal* an den Prozess (z.B. `SIGTERM`).
166 |
167 | ---
168 |
169 | `process.communicate(input=None, timeout=None)`
170 |
171 | Schreibt die Daten aus *input* in den Standardinput (`stdin`) des Prozesses (wenn stdin PIPE ist), wartet auf die Terminierung des Prozesses und liest Daten, die der Prozess in `stdout` geschrieben hat (wenn stdout PIPE ist).
172 |
173 | ---
174 |
175 | `process.terminate()`
176 |
177 | Sendet ein Terminationssignal an den Prozess (`SIGTERM`).
178 |
179 | `process.kill()`
180 |
181 | Erzwingt die Beendigung des Prozesses (`SIGKILL`).
182 |
183 | ---
184 |
185 | ## Nutzung des Kontextmanagers
186 |
187 | Popen kann mit dem Kontextmanager verwendet werden (siehe *File Handling*).
188 | Der Code dafür würde wie folgt aussehen:
189 | ```python
190 | with subprocess.Popen(['ls']) as process:
191 | pass
192 | ```
193 |
194 | # Nützliche Funktionen
195 |
196 | ---
197 |
198 | `subprocess` enthält einige Kurzfassungen für häufig genutzte Arbeitsabläufe.
199 | Intern rufen diese allerdings auch nur `Popen` auf.
200 |
201 | ---
202 |
203 | Die wohl nützlichste Funktion ist `subprocess.run()`:
204 |
205 | ```python
206 | subprocess.run(args, *, stdin=None, input=None,
207 | stdout=None, stderr=None, shell=False,
208 | timeout=None, check=False)
209 | ```
210 |
211 | ---
212 |
213 | - eingeführt in Python 3.5
214 |
215 | - ruft durch `args` definierten Prozess auf
216 |
217 | - wartet auf Beendigung des Prozesses (wenn *timeout* `None` ist)
218 |
219 | - gibt ein `CompletedProcess` Objekt zurück
220 |
221 | - **Beachte:** Einsatz eines unbenannten Aggregators
222 |
223 | ---
224 |
225 | ### CompletedProcess Objekt
226 |
227 | ist der Rückgabewert von `run()`, der zurückgegeben wird, wenn der Prozess
228 | beendet wurde. Enthält folgende Eigenschaften:
229 |
230 | `args`
231 |
232 | Argumente, mit denen der Prozess aufgerufen wurde.
233 |
234 | ---
235 |
236 | `returncode`
237 |
238 | Rückgabewert des Prozesses
239 |
240 | `stdout`
241 |
242 | Ausgabe des Prozesses
243 |
244 | `stderr`
245 |
246 | stderr Output des Prozesses
247 |
248 | ---
249 |
250 | Außerdem gibt es die Funktion `check_returncode()`, die einen
251 | `CalledProcessError` beim Aufruf wirft, wenn der Rückgabewert nicht 0 ist.
252 |
253 | ---
254 |
255 | ### subprocess.call()
256 |
257 | - Ruft einen Prozess auf, wartet auf Terminierung
258 |
259 | - gibt Returncode des Prozesses zurück
260 |
261 | Diese Funktion macht das selbe, wie
262 | `run(...).returncode`,
263 | nur dass *check* und *input* nicht unterstützt werden.
264 |
265 | ---
266 |
267 | ### subprocess.check_call()
268 |
269 | Argumente entsprechen den Argumenten von `call()`.
270 |
271 | - Ruft Prozess auf, wartet auf Terminierung
272 |
273 | - gibt nichts zurück, wenn Ausführung erfolgreich (Returncode == 0)
274 |
275 | - wenn Aufruf nicht erfolgreich, wird `CalledProcessError` geworfen
276 |
277 | ---
278 |
279 | Diese Funktion macht das selbe, wie
280 | `run(..., check=True)`,
281 | nur dass *input* nicht unterstützt wird.
282 |
283 | ---
284 |
285 | ### subprocess.check_output()
286 |
287 | - führt Kommando aus und gibt den Prozessoutput zurück
288 |
289 | - wirft ebenfalls `CalledProcessError`, wenn der Returncode nicht 0
290 | ist
291 |
292 | Diese Funktion macht das selbe, wie
293 | `run(..., check=True, stdout=PIPE).stdout`
294 |
--------------------------------------------------------------------------------
/md/09_web_client.md:
--------------------------------------------------------------------------------
1 | # Das Package urllib
2 |
3 | ---
4 |
5 | Das Package `urllib` ist eine nützliche Sammlung mehrerer Module zur Arbeit mit URLs.
6 |
7 | ## urllib.request
8 |
9 | Das Modul `urllib.request` enthält Funktionen und Klassen, welche beim Öffnen
10 | von URLs (vor allem über HTTP) helfen.
11 |
12 | ---
13 |
14 | Unterstützt werden:
15 |
16 | - verschiedene Authentifizierungsarten
17 | - Weiterleitungen
18 | - Cookies
19 | - und mehr...
20 |
21 | ---
22 |
23 | ### Öffnen einer URL
24 |
25 | Das Öffnen einer URL wird über die Funktion `urlopen()` realisiert:
26 |
27 | ```python
28 | import urllib.request
29 |
30 | urllib.request.urlopen(url, data=None, [timeout, ] *,
31 | cafile=None, capath=None, cadefault=False,
32 | context=None)
33 | ```
34 |
35 | ---
36 |
37 | **url**
38 |
39 | ein String für simple URLs oder ein `Request` Objekt für komplexere
40 | Anfragen
41 |
42 | **data**
43 |
44 | Daten, die an den Server gesendet werden sollen.
45 | Vom Typ `bytes` oder ein Iterable von `bytes` Objekten.
46 |
47 | ---
48 |
49 | **Rückgabewerte**
50 |
51 | Bei URLs mit http-Requests:
52 | `httplib.client.HTTPResponse` Objekt
53 |
54 | bei ftp, file und data:
55 | `urllib.addinfourl` Objekt
56 |
57 |
58 |
59 | ## Request Klasse
60 |
61 | ---
62 |
63 | Um komplexere Anfragen stellen zu können, kann man Request Objekte verwenden:
64 |
65 | ```python
66 | urllib.request.Request(url, data=None, headers={},
67 | origin_req_host=None, unverifiable=False,
68 | method=None)
69 | ```
70 |
71 | ---
72 |
73 | **url**
74 |
75 | muss String mit gültiger URl sein
76 |
77 | **data**
78 |
79 | wie bei *urlopen*
80 |
81 | ---
82 |
83 | **headers**
84 |
85 | `dict` mit `{Header-Name : Header-Value, ...}` oder
86 | `list` von Tupeln mit `[(Header-Name, Header-Value), ...]`
87 |
88 | **method**
89 |
90 | String, der Art des HTTP Request angibt (`HEAD`, `GET`, `POST`, ...)
91 |
92 | ---
93 |
94 | ### Beispiel
95 |
96 | ```python
97 | import urllib
98 |
99 | r = urllib.request.Request(
100 | 'http://python.org',
101 | headers={'content-type': 'application/json'},
102 | method='PUT'
103 | )
104 | ```
105 |
106 | ---
107 |
108 | Die Request Klasse kann man Verwenden zum:
109 |
110 | - Kontrollieren der gesendeten Header *(z.B. Content-Type
111 | oder User-Agent)*
112 | - Kontrollieren der Method `POST`, `PUT` oder `HEAD`
113 |
114 |
115 |
116 | ## HTTPResponse Klasse
117 |
118 | ---
119 |
120 | ```python
121 | http.client.HTTPResponse(sock, debuglevel=0,
122 | method=None, url=None)
123 | ```
124 |
125 | ---
126 |
127 | Objekte dieser Klasse werden nicht direkt vom User erstellt.
128 | Klasse enthält Funktionen und Variablen wie:
129 |
130 | - `read()` - gibt zurückgelieferten Inhalt zurück
131 | - `getheader()` oder `getheaders()` liefert einen/alle Header zurück
132 | - `status` gibt den HTTP Statuscode zurück
133 | - `version` gibt die HTTP Version zurück
134 |
135 |
136 | # Andere Module
137 |
138 | ---
139 |
140 | Das Package `urllib` enthält außerdem folgende Module:
141 |
142 | ---
143 |
144 | `urllib.error`
145 | Enthält Exceptions, die von `urllib.request` geworfen werden.
146 |
147 | ---
148 |
149 | `urllib.parse`
150 | Zum Parsen von URLs.
151 |
152 | ---
153 |
154 | `urllib.robotparse`
155 | Zum Parsen der *robots.txt* von Webseiten.
156 |
157 |
158 | # Das Requests-Modul
159 |
160 | ## Installation
161 |
162 | Das Requests Modul ist eine gute und für Menschen verständliche Alternative zu
163 | `urllib.requests`, das HTTP Requests vereinfacht.
164 |
165 | ---
166 |
167 | Das Requests Package lässt sich ganz einfach über **pip** installieren:
168 | `pip install requests`
169 |
170 | ---
171 |
172 | ### Beispiel
173 |
174 | ```python
175 | r = requests.get('https://api.github.com/user',
176 | auth=('user', 'pass'))
177 |
178 | r.status_code # -> 200
179 | r.headers['content-type']
180 | # -> 'application/json; charset=utf8'
181 | r.encoding # -> 'utf-8'
182 | r.text # -> u'{"type":"User"...'
183 | r.json()
184 | # -> {u'private_gists': 419, u'total_private_repos': 77, ...}
185 | ```
186 | ---
187 |
188 | Ruft die API-Seite von **GitHub** auf und authentifiziert sich mit
189 | Nutzername und Passwort.
190 |
--------------------------------------------------------------------------------
/md/10_regex.md:
--------------------------------------------------------------------------------
1 | # Grundlage
2 |
3 | ---
4 |
5 | Das `re` Modul der Python Standard Library ist die Python Implementierung von _regulären Ausdrücken_.
6 |
7 | Reguläre Ausdrücke werden verwendet um die Struktur von Text/Sprachen zu beschreiben.
8 |
9 | ---
10 |
11 | Ein erstellter regulärer Ausdruck kann verwendet werden um:
12 |
13 | - die Struktur eines Textes zu überprüfen
14 | - bestimmte Teile eines Textes zu extrahieren
15 |
16 | ---
17 |
18 | Die Anwendung eines regulären Ausdruckes nennt man Matching.
19 |
20 | Matcht der reguläre Ausdruck einem String, bedeutet dies, dass der String die Struktur hat, die der reguläre Ausdruck beschreibt.
21 |
22 | ---
23 |
24 | Reguläre Ausdrücke werden oft auch 'regex' genannt (kurz für __regular expression__).
25 |
26 | # Matching Regeln
27 |
28 | ---
29 |
30 | Jeder Buchstabe und jede Zahl matcht immer **einmal** sich selbst.
31 |
32 | d.h.
33 |
34 | Der String `'a'` matcht der regex `'a'`.
35 | Der String `'abc'` matcht der regex `'abc'`, nicht aber regex `'a'`.
36 | `'4'` matcht `'4'`, nicht aber `'5'`, `'a'` oder `'41'` usw.
37 |
38 |
39 | ## Sonderzeichen
40 |
41 | `.` (Punkt) matcht **einem** beliebingen Schriftzeichen, außer `\n` (newline)
42 |
43 | Für die regex `'.'` gilt:
44 |
45 | - `'a'` matcht
46 | - `'b'` matcht
47 | - `'4'` matcht
48 | - `'ab'` matcht nicht, denn `'.'` ist nur ein Zeichen und `'ab'` sind zwei.
49 |
50 | ---
51 |
52 | `[]` matcht jedem der in den Klammern stehenden Zeichen, jedoch nur **einmal** (wie bei `.`).
53 |
54 | Für die regex `'[abg]'` gilt also:
55 |
56 | - `'a'` matcht
57 | - `'b'` matcht
58 | - `'g'` matcht
59 | - `'ab'` matcht nicht (zwei zeichen matchen nicht einem).
60 |
61 | ---
62 |
63 | `()` erstellt eine Gruppe. Alles was in den Klammern steht, muss genau so vor kommen.
64 |
65 | Für die regex `'(abc)'` gilt:
66 |
67 | - `'a'` matcht nicht
68 | - `'ab'` matcht nicht
69 | - `'abc'` matcht
70 |
71 | ---
72 |
73 | `\` escaped ein Sonderzeichen.
74 |
75 | Alle hier aufgeführten Sonderzeichen können nicht in einem Pattern vorkommen, als das, was sie eigentlich bedeuten, dafür müssen sie extra markiert werden.
76 |
77 | - `'\\'` als Pattern matcht auf den String `'\'`
78 | - `'\.'` als Pattern matcht auf den String `'.'`
79 |
80 | ---
81 |
82 | `^` matcht ab dem Anfang eines Strings oder ab jedem `\n`
83 |
84 | Für die regex `'^a'` ergibt sich also:
85 |
86 | - `'a'` matcht
87 | - `'ba'` matcht nicht, da der falsche Character am Anfang steht.
88 | - `'aba'` matcht
89 |
90 | ---
91 |
92 | `$` matcht dem Ende eines Strings (oder dem Zeilenende)
93 |
94 | Für die regex `'a$'` folgt daraus:
95 |
96 | - `'a'` matcht
97 | - `'ba'` matcht
98 | - `'bab'` matcht nicht, da der falsche Character am Ende steht
99 | - `'aba'` matcht
100 |
101 | ---
102 |
103 | `|` ist ein __ODER__. Entweder die regex davor oder danach muss matchen.
104 |
105 | Für die regex `'a|b'` gilt:
106 |
107 | - `'a'` matcht
108 | - `'b'` matcht
109 | - `'ab'` matcht nicht, da `'a|b'` mit [ab] gleichzusetzen ist
110 |
111 |
112 | ## Zusammengesetzte Regex
113 |
114 | ---
115 |
116 | Regular Expressions setzen sich aus kleineren Regular Expressions zusammen.
117 | So kann man z.B. auch festlegen, wie häufig ein Zeichen auftreten soll.
118 |
119 | ---
120 |
121 | `*` - Die _vorangestellte_ Regex muss 0 - n Mal vorkommen.
122 |
123 | Für die regex `'a*'` gilt:
124 |
125 | - `''` matcht
126 | - `'a'` matcht
127 | - `'aa'` matcht
128 | - `'aaaab'` matcht nicht, da ein anderes Zeichen als 'a' vorkommt
129 |
130 | ---
131 |
132 | `+` - Die _vorangestellte_ Regex muss 1 - n Mal vorkommen.
133 |
134 | Für die regex `'a+'` gilt:
135 |
136 | - `''` matcht nicht, da es kein mal vorkommt
137 | - `'a'` matcht
138 | - `'aa'` matcht
139 | - `'ab'` matcht nicht, da ein anderes Zeichen als 'a' vorkommt
140 |
141 | ---
142 |
143 | `?` - Die _vorangestellte_ regex muss 0 - 1 Mal vorkommen.
144 |
145 | Für die regex `'a?'` gilt:
146 |
147 | - `''` matcht
148 | - `'a'` matcht
149 | - `'aa'` matcht nicht, da das Zeichen öfter, als nur ein mal vorkommt
150 |
151 | ---
152 |
153 | `{m}` - Die _vorangestellte_ regex muss genau m Mal vorkommen.
154 |
155 | Für die regex `'y{3}'` gilt:
156 |
157 | - `'yyy'` matcht
158 | - `'y'` matcht nicht, da es zu wenige Zeichen sind
159 | - `'yyyy'` matcht nicht, da es mehr Zeichen sind
160 |
161 | ---
162 |
163 | `{m,n}` - Die _vorangestellte_ regex muss m - n Mal vorkommen.
164 |
165 | Für die regex `'y{2,5}'` gilt:
166 |
167 | - `'yyy'` matcht
168 | - `'y'` matcht nicht, da es zu wenige Zeichen sind
169 | - `'yyyy'` matcht
170 | - `'yyyyyy'` matcht nicht, da es zu viele Zeichen sind
171 |
172 |
173 | ## Spezielle Sequenzen
174 |
175 | ---
176 |
177 | Desweiteren gibt es noch spezielle Sequenzen, wie z. B.
178 |
179 | - `\d` für Unicode Ziffern, äquivalent für `[0-9]`
180 | - `\D` ist das Gegenteil, alles was keine Unicode Ziffern sind
181 |
182 | ---
183 |
184 | - `\s` für alle Whitespace Zeichen, das entspricht `'[ \t\n\r\f\v]'`
185 | - `\S` entspricht wieder dem Gegenteil
186 |
187 | ---
188 |
189 | - `\w` für alle Unicode Zeichen `'[a-zA-Z0-9_]'`
190 | - `\W` für alle Nicht-Unicode Zeichen
191 | - `[^...]` entspricht allem, was nicht in den Klammern steht
192 |
193 | # Methoden
194 |
195 | ---
196 |
197 | ```python
198 | compile(pattern, flags=0)
199 | ```
200 | Wandelt einen String in ein regular expression Objekt um.
201 |
202 | ---
203 |
204 | ```python
205 | search(pattern, string, flags=0)
206 | ```
207 | Sucht in `string` nach dem Pattern `pattern`.
208 |
209 | ---
210 |
211 | ```python
212 | match(pattern, string, flags=0)
213 | ```
214 | Sucht am Begin des Strings nach dem Pattern.
215 |
216 | ---
217 |
218 | ```python
219 | fullmatch(pattern, string, flags=0)
220 | ```
221 | Der komplette String und das Pattern müssen übereinstimmen.
222 |
223 | ---
224 |
225 | ```pyhton
226 | findall(pattern, string, flags=0)
227 | ```
228 | Gibt eine Liste von Strings mit allen passenden Übereinstimmungen zurück.
229 |
230 | ---
231 |
232 | ```python
233 | finditer(pattern, string, flags=0)
234 | ```
235 | Gibt einen Iterator, welcher `match` Objekte beinhaltet zurück
236 |
237 | Die restlichen Funktionen können in den [Docs](https://docs.python.org/3/library/re.html) gefunden werden.
238 |
239 | # regular expression Objekt
240 |
241 | ---
242 |
243 | Ein solches Objekt hat im Großen und Ganzen die selben Methoden, jedoch ohne zusätzliches Pattern, da das Objekt an sich bereits ein Pattern enthält.
244 |
245 | # Match Objekt
246 |
247 | ---
248 |
249 |
250 | ```python
251 | start([group])
252 | ```
253 | Gibt die Startposition des Patterns im String zurück.
254 |
255 | ```python
256 | end([group])
257 | ```
258 | Gibt die Endposition des Patterns im String zurück.
259 |
260 | ---
261 |
262 | ```python
263 | span([group])
264 | ```
265 | Gibt ein Tuple zurück `(m.start([group]), m.end([group]))`
266 |
--------------------------------------------------------------------------------
/md/11_smtplib.md:
--------------------------------------------------------------------------------
1 | # Grundlagen: Mails senden
2 |
3 |
4 | ## Das Modul `smtplib`
5 |
6 |
7 | Das Modul `smtplib` definiert eine SMTP**\***-Client Session, die genutzt werden kann, um
8 | von jedem beliebigen, internetfähigen Gerät E-Mails zu verschicken.
9 |
10 | **\****SMTP* steht für Simple Mail Transfer Protocol und ist das Standard-Protokoll zum E-Mail Versand.
11 |
12 | ---
13 |
14 | ### Verbindung zum Server
15 |
16 |
17 | Die smtplib kann sich zu
18 | einem SMTP-Server verbinden
19 |
20 | ```python
21 | smtplib.SMTP(host=’ ’, port=0, local_hostname=None,
22 | [timeout,] source_address=None)
23 | ```
24 |
25 | Der Server kann zum einen als einheitlicher `String` (inkl. Port) oder
26 | einzeln als `host` und `port` angeben werden.
27 |
28 | ---
29 |
30 | ### Login auf dem Server
31 |
32 |
33 | Heutzutage Zeit arbeiten die meisten SMTP-Server mit `TLS`, um eine sichere Verbindung zu gewährleisten. Diese muss mithilfe von der Methode `starttls()` hergestellt werden.
34 | Der eigentliche Login erfolgt im Anschluss durch:
35 |
36 | ```python
37 | SMTP.login(user, password, ∗, initial_response_ok=True)
38 | ```
39 |
40 | Der Parameter `initial_response_ok` kann in unserem Fall vernachlässigt
41 | werden.
42 |
43 | ---
44 |
45 | ### Senden der Mail
46 |
47 |
48 | Das tatsächliche Versenden der Mail funktioniert dann mit folgender Methode:
49 |
50 | ```python
51 | SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[],
52 | rcpt_options=[])
53 | ```
54 |
55 | Jedoch lässt sich das ganze auch mit einem `MIME`-Objekt vereinfachen, auf das später noch eingegangen wird.
56 | Dieses wird mit `send_message()` versendet.
57 |
58 | ---
59 |
60 | ### Schließen der Verbindung
61 |
62 | Zum Schluss darf nicht vergessen werden, die Verbindung zum SMTP-Server wieder zu schließen.
63 | Dies geschieht mit der Methode `quit()` oder man stellt die Verbindung
64 | mithilfe eines `Filehandlers` her.
65 |
66 |
67 | #Komplexere Mails senden
68 |
69 |
70 | ## Das Modul `email`
71 |
72 |
73 | Um mehr Möglichkeiten zur Gestaltung der E-Mail zu haben, lohnt sich die Verwendung des Moduls
74 | `email`.
75 | Mit `email.mime` lassen sich Emails individuell bauen und
76 | zusammensetzen. Außerdem kann man mehrteilige Mails und Mails mit
77 | Anhängen (z.B. Bildern) erstellen.
78 |
79 | ---
80 |
81 | ### Die Klasse `MIMEText`
82 |
83 | Die Klasse `email.mime.text.MIMEText()` erstellt ein MIME Objekt, welches
84 | hautpsächlich aus Text besteht und einfach dem SMTP-Objekt übergeben
85 | werden kann:
86 | ```python
87 | email.mime.text.MIMEText(_text, _subtype='plain', _charset=None)
88 | ```
89 |
90 | ---
91 |
92 | \_text: Ein String, der den Inhalt der Nachricht enthält.
93 |
94 | \_subtype: Der Untertyp des Objekts, per default `plain`
95 |
96 | charset: Der Zeichensatz, der zur Kodierung der Zeichen verwendet
97 | werden soll. Standardmäßig `us-ascii` oder `utf8`, abhängig von dem
98 | eingegebenen Text.
99 |
100 | ---
101 |
102 | ### Die Meta-Felder
103 |
104 |
105 | Wenn das `MIMEText` Objekt instanziiert ist, muss dieses mit weiteren Informationen ergänzt werden:
106 |
107 | ```python
108 | # set the sender of your mail
109 | message['From'] = 'Sender name '
110 | # set the receiver of your mail
111 | message['To'] = 'Receiver name '
112 |
113 | message['Subject'] = 'Betreff der E-Mail'
114 | ```
115 |
116 | Die Message lässt sich außerdem noch um einen `Cc` oder einen `Bcc`
117 | erweitern.
118 |
--------------------------------------------------------------------------------
/md/12_curses.md:
--------------------------------------------------------------------------------
1 | # Das Modul `curses`
2 |
3 | ---
4 |
5 | `curses` bietet ein Interface für die "curses"-Bibliothek, den de-facto Standard für fortgeschrittenes Terminal
6 | Handling.
7 |
8 | ---
9 |
10 | - curses ist vor allem in Unix-Umgebungen weit verbreitet
11 |
12 | - dieses Modul wurde auf die API von *ncurses*, einer Open-Source
13 | Library für curses, zugeschnitten und funktioniert nur unter Linux
14 | und BSD Varianten von Unix
15 |
16 |
17 | ## Mitgelieferte Submodule
18 |
19 | `curses.ascii`: zur Arbeit mit ASCII-kodierten Zeichen
20 |
21 | `curses.panel`: Support für Panels, also mehrere Fenster übereinander (Fenster mit Ebenen)
22 |
23 | `curses.textpad`: Widget zum editieren von Text mit *emacs*-artigen Key-Bindings
24 |
25 |
26 |
27 | # Erstellen eines simplen Fensters
28 |
29 | ## Grundlegende Funktionen
30 |
31 | ---
32 |
33 | Zum Erstellen eines `curses`-Fensters benutzt man den Befehl
34 |
35 | ```python
36 | curses.initscr()
37 | ```
38 |
39 | - instanziiert die Bibliothek, gibt ein `WindowObject` zurück, welches
40 | den gesamten Screen repräsentiert
41 |
42 | - Fehler beim Terminal öffnen können zum Beenden des Interpreters
43 | führen!
44 |
45 | ---
46 |
47 | ```python
48 | curses.endwin()
49 | ```
50 |
51 | - deinitialisiert Bibliothek
52 |
53 | - führt Terminal in normalen Zustand zurück
54 |
55 | ---
56 |
57 | `curses` liefert einen eigenen Wrapper zum Starten und Beenden:
58 |
59 | ```python
60 | curses.wrapper(func, ...)
61 | ```
62 |
63 | - setzt nützliche Standards, initialisiert curses und ruft *func* auf
64 |
65 | - Wrapper fängt Exceptions, stellt Terminal wieder her und wirft
66 | Exception erneut
67 |
68 | - *func* muss `stdscr` als erstes Argument akzeptieren (für das `WindowObject`)
69 |
70 |
71 | ## Darstellen von Symbolen
72 |
73 | ---
74 |
75 | Zur Darstellung einzelner Symbole verwendet man `addch`:
76 |
77 | ```python
78 | window.addch(ch[, attr])
79 | window.addch(y, x, ch[, attr])
80 | ```
81 |
82 | `ch`: zu schreibendes ASCII-Zeichen (im ASCII-Format!)\
83 | Zum konvertieren ggf. auf `ord()` zurück greifen.
84 |
85 | `y, x`: Koordinaten, an die das Zeichen geschrieben wird. Beachte
86 | invertierte Reihenfolge!
87 |
88 | `attr`: zu setzende Attribute
89 |
90 | ---
91 |
92 | Zum Darstellen eines Strings
93 | existiert die Funktion `addstr()`:
94 |
95 | ```python
96 | window.addstr(str[, attr])
97 | window.addstr(y, x, str[, attr])
98 | ```
99 |
100 | - fügt ab `(y, x)` den gegebenen String ein
101 |
102 | - überschreibt alle vorher vorhandenen Zeichen
103 |
104 | ---
105 |
106 | **Zeichen entfernen**
107 |
108 | ```python
109 | window.delch([y, x])
110 | window.deleteln()
111 | window.erase()
112 | ```
113 |
114 | - Funktionen zum löschen einzelner Zeichen, einer ganzen Zeile oder
115 | dem gesamten Fenster
116 |
117 | ## Allgemeine Hinweise
118 |
119 | ---
120 |
121 | - Werden bei Funktionen `x` und `y` weg gelassen und sind optional,
122 | wird die Funktion an der aktuellen Cursorstelle ausgeführt.
123 |
124 | - Beachte die invertierte Zählweise!
125 |
126 | - Punkt (0, 0) liegt oben links in der Ecke vom Terminal
127 |
128 | - x zählt von da nach rechts aufwärts
129 |
130 | - y zählt von da nach unten aufwärts
131 |
132 |
133 | # `curses.textpad`
134 |
135 | ## `Rectangle`
136 |
137 | ```python
138 | curses.textpad.rectangle(win, uly, ulx, lry, lrx)
139 | ```
140 |
141 | - erzeugt im WindowObject `win` ein Rechteck
142 |
143 | - Anfangspunkt ist (`ulx`, `uly`) (ul ≙ upper left corner)
144 |
145 | - Endpunkt ist (`lrx`, `lry`) (lr ≙ lower right corner)
146 |
147 | ##`Textbox`
148 |
149 | ```python
150 | curses.textpad.Textbox(win)
151 | ```
152 | Eine `Textbox` wird mit einem WindowObject erstellt und hat diese drei Funktionen
153 |
154 | ---
155 |
156 | ```python
157 | Textbox().edit([validator])
158 | Textbox().do_command(ch)
159 | Textbox().gather()
160 | ```
161 | - `edit()` Editormodus wobei `validator` eine Funktion ist
162 |
163 | - `do_command()` führt einen Befehl aus
164 | [(Link hier)](http://bit.ly/29sJ8QJ)
165 |
166 | - `gather()` gibt den Inhalt der Textbox zurück
167 |
--------------------------------------------------------------------------------
/md/template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | $for(author-meta)$
7 |
8 | $endfor$
9 | $if(date-meta)$
10 |
11 | $endif$
12 | $if(title-prefix)$$title-prefix$ - $endif$$pagetitle$
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | $if(highlighting-css)$
23 |
26 | $endif$
27 | $if(css)$
28 | $for(css)$
29 |
30 | $endfor$
31 | $else$
32 |
33 | $endif$
34 |
35 |
36 |
45 |
48 | $if(math)$
49 | $math$
50 | $endif$
51 | $for(header-includes)$
52 | $header-includes$
53 | $endfor$
54 |
55 |
56 | $for(include-before)$
57 | $include-before$
58 | $endfor$
59 |
60 |
61 |
62 | $if(title)$
63 |
64 | $title$
65 | $if(subtitle)$
66 | $subtitle$
67 | $endif$
68 | $for(author)$
69 | $author$
70 | $endfor$
71 | $date$
72 |
73 | $endif$
74 | $if(toc)$
75 |
78 | $endif$
79 |
80 | $body$
81 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
121 | $for(include-after)$
122 | $include-after$
123 | $endfor$
124 |
125 |
126 |
--------------------------------------------------------------------------------
/reveal.json:
--------------------------------------------------------------------------------
1 | {
2 | "Getting started": {
3 | "theme": "ifsr",
4 | "source": "01_getting_started"
5 | },
6 | "Grundlagen von Python": {
7 | "theme": "ifsr",
8 | "source": "02_grundlagen"
9 | },
10 | "Builtin Datenstrukturen": {
11 | "theme": "ifsr",
12 | "source": "03_builtins"
13 | },
14 | "Module, Pakete und PIP": {
15 | "theme": "ifsr",
16 | "source": "04_modules_packages_pip"
17 | },
18 | "Decorators": {
19 | "theme": "ifsr",
20 | "source": "05_decorators"
21 | },
22 | "Comprehensions": {
23 | "theme": "ifsr",
24 | "source": "06_comprehensions"
25 | },
26 | "Funktionen (fortgeschritten)": {
27 | "theme": "ifsr",
28 | "source": "07_functions_advanced"
29 | },
30 | "Subprozesse in Python": {
31 | "theme": "ifsr",
32 | "source": "08_process"
33 | },
34 | "Web Client": {
35 | "theme": "ifsr",
36 | "source": "09_web_client"
37 | },
38 | "re - Regular Expressions": {
39 | "theme": "ifsr",
40 | "source": "10_regex"
41 | },
42 | "Mails in Python senden": {
43 | "theme": "ifsr",
44 | "source": "11_smtplib"
45 | },
46 | "ncurses in Python": {
47 | "theme": "ifsr",
48 | "source": "12_curses"
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/css/repl.css:
--------------------------------------------------------------------------------
1 | /* line 1, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
2 | .exec {
3 | background: #dcdcdc;
4 | width: 100%;
5 | color: black; }
6 | /* line 5, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
7 | .exec pre {
8 | box-shadow: none; }
9 | /* line 8, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
10 | .exec .repl {
11 | width: 100%;
12 | background: #dcdcdc; }
13 | /* line 12, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
14 | .exec .repl-top {
15 | background: darkgray;
16 | padding: 5px 5px 5px 5px; }
17 | /* line 16, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
18 | .exec .repl-code {
19 | width: 100%;
20 | background-color: white; }
21 | /* line 20, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
22 | .exec .repl-result {
23 | padding-left: 20px;
24 | padding-bottom: 5px; }
25 | /* line 24, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
26 | .exec .input {
27 | text-align: left;
28 | color: black;
29 | margin-top: 0px;
30 | padding-top: 10px;
31 | padding-left: 20px;
32 | padding-bottom: 10px; }
33 | /* line 32, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
34 | .exec .run-button {
35 | width: 100px;
36 | height: 30px;
37 | font-size: 16px;
38 | border-style: none;
39 | color: black;
40 | text-align: center;
41 | background: #b1e11c; }
42 | /* line 40, /Users/h4llow3En/projects/custom-repl.it-embedding/repl.scss */
43 | .exec .run-button:hover {
44 | background: #e0f3a3;
45 | color: #4d4d4d; }
46 |
47 | /*# sourceMappingURL=repl.css.map */
--------------------------------------------------------------------------------
/src/css/repl.css.map:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "file": "repl.css",
4 | "sources": [
5 | "repl.scss"
6 | ],
7 | "sourcesContent": [],
8 | "mappings": ";AAAA,KAAK,CAAC;EACF,UAAU,EAAE,OAAQ;EACpB,KAAK,EAAE,IAAK;EACZ,KAAK,EAAE,KAAM,GAHV;;EAIH,KAAK,CAAC,GAAG,CAAL;IACA,UAAU,EAAE,IAAK,GADhB;;EAGL,KAAK,CAAC,KAAK,CAAL;IACF,KAAK,EAAE,IAAK;IACZ,UAAU,EAAE,OAAQ,GAFjB;;EAIP,KAAK,CAAC,SAAS,CAAL;IACN,UAAU,EAAE,QAAM;IAClB,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAFjB;;EAIX,KAAK,CAAC,UAAU,CAAL;IACP,KAAK,EAAE,IAAK;IACZ,gBAAgB,EAAE,KAAM,GAFhB;;EAIZ,KAAK,CAAC,YAAY,CAAL;IACT,YAAY,EAAE,IAAK;IACnB,cAAc,EAAE,GAAI,GAFV;;EAId,KAAK,CAAC,MAAM,CAAL;IACH,UAAU,EAAE,IAAK;IACjB,KAAK,EAAE,KAAM;IACb,UAAU,EAAE,GAAI;IAChB,WAAW,EAAE,IAAK;IAClB,YAAY,EAAE,IAAK;IACnB,cAAc,EAAE,IAAK,GANjB;;EAQR,KAAK,CAAC,WAAW,CAAL;IACR,KAAK,EAAE,KAAM;IACb,MAAM,EAAE,IAAK;IACb,SAAS,EAAE,IAAK;IAChB,YAAY,EAAE,IAAK;IACnB,KAAK,EAAE,KAAM;IACb,UAAU,EAAE,MAAO;IACnB,UAAU,EAAE,OAAQ,GAPX;;IAQR,KAAK,CAAC,WAAW,AAAA,MAAM,CAAhB;MACJ,UAAU,EAAE,OAAO;MACnB,KAAK,EAAE,OAAO,GAFT",
9 | "names": []
10 | }
--------------------------------------------------------------------------------
/src/css/repl.scss:
--------------------------------------------------------------------------------
1 | .exec {
2 | background: #dcdcdc;
3 | width: 100%;
4 | color: black;
5 | pre {
6 | box-shadow: none;
7 | }
8 | .repl {
9 | width: 100%;
10 | background: #dcdcdc;
11 | }
12 | .repl-top {
13 | background: darken(#dcdcdc, 20%);
14 | padding: 5px 5px 5px 5px;
15 | }
16 | .repl-code {
17 | width: 100%;
18 | background-color: white;
19 | }
20 | .repl-result {
21 | padding-left: 20px;
22 | padding-bottom: 5px;
23 | }
24 | .input {
25 | text-align: left;
26 | color: black;
27 | margin-top: 0px;
28 | padding-top: 10px;
29 | padding-left: 20px;
30 | padding-bottom: 10px;
31 | }
32 | .run-button {
33 | width: 100px;
34 | height: 30px;
35 | font-size: 16px;
36 | border-style: none;
37 | color: black;
38 | text-align: center;
39 | background: #b1e11c;
40 | &:hover {
41 | background: lighten(#b1e11c, 30%);
42 | color: lighten(black, 30%);
43 | }
44 | }
45 | }
--------------------------------------------------------------------------------
/src/ifsr.css.map:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "file": "ifsr.css",
4 | "sources": [
5 | "ifsr.scss",
6 | "../template/mixins.scss",
7 | "../template/settings.scss",
8 | "../template/theme.scss"
9 | ],
10 | "sourcesContent": [],
11 | "mappings": "AAAA;;;;GAIG;AAUH,OAAO,CAAC,kDAAI;AACZ,OAAO,CAAC,kFAAI;AGbZ;;+CAE+C;;AAE/C,IAAI,CAAC;EDmCJ,UAAU,EFtBO,IAAI;EGXrB,gBAAgB,EHWC,IAAI,GGbhB;;;AAKN,OAAO,CAAC;EACP,WAAW,EHSD,WAAW,EAAE,UAAU;EGRjC,SAAS,EHgBK,IAAI;EGflB,WAAW,EAAE,MAAO;EACpB,KAAK,EDNM,IAAI,GCEP;;;AAOT,WAAW,CAAC;EACX,KAAK,EDiBW,IAAI;EChBpB,UAAU,EHQgB,OAAO;EGPjC,WAAW,EAAE,IAAK,GAHN;;;AAOW,OAAO,CAAC,OAAO,GAAG,OAAO;AACjD,OAAO,CAAC,OAAO,GAAG,OAAO,GAAG,OAAO,CADH;EAC/B,WAAW,EAAE,GAAI;EACjB,WAAW,EAAE,OAAQ,GAFW;;AAKjC;;+CAE+C;;AAOvC,OAAO,CAAC,EAAE;AAClB,OAAO,CAAC,EAAE;AACV,OAAO,CAAC,EAAE;AACV,OAAO,CAAC,EAAE;AACV,OAAO,CAAC,EAAE;AACV,OAAO,CAAC,EAAE,CALC;EACV,MAAM,EDzBS,CAAC,CAAC,CAAC,CAHL,IAAI,CAGe,CAAC;EC0BjC,KAAK,EDxBS,IAAI;EC0BlB,WAAW,EHnBE,OAAO,EAAE,MAAM,EAAE,UAAU;EGoBxC,WAAW,EDtBQ,MAAM;ECuBzB,WAAW,ED3BQ,GAAG;EC4BtB,cAAc,EHpBS,OAAM;EGsB7B,cAAc,EHrBQ,IAAI;EGsB1B,WAAW,EHxBQ,IAAI;EG0BvB,SAAS,EAAE,UAAW,GAZX;;;AAeJ,OAAO,CAAC,EAAE,CAAP;EAAC,SAAS,ED7BN,MAAM,GC6BT;;;AACJ,OAAO,CAAC,EAAE,CAAP;EAAC,SAAS,ED7BN,MAAM,GC6BT;;;AACJ,OAAO,CAAC,EAAE,CAAP;EAAC,SAAS,ED7BN,MAAM,GC6BT;;;AACJ,OAAO,CAAC,EAAE,CAAP;EAAC,SAAS,ED7BN,GAAM,GC6BT;;;AAEJ,OAAO,CAAC,EAAE,CAAP;EACV,WAAW,EDvCQ,IAAI,GCsCZ;;AAKZ;;+CAE+C;;AAEvC,OAAO,CAAC,CAAC,CAAP;EACT,MAAM,EDzDO,IAAI,CCyDI,CAAC;EACtB,WAAW,EAAE,GAAI,GAFP;;AAKX,oEAAoE;;AAG5D,OAAO,CAAC,GAAG;AACnB,OAAO,CAAC,KAAK;AACb,OAAO,CAAC,MAAM,CAFC;EACd,SAAS,EAAE,GAAI;EACf,UAAU,EAAE,GAAI,GAFD;;;AAKR,OAAO,CAAC,MAAM;AACtB,OAAO,CAAC,CAAC,CADC;EACT,WAAW,EAAE,IAAK,GADR;;;AAIH,OAAO,CAAC,EAAE,CAAP;EACV,UAAU,EAAE,MAAO,GADR;;;AAMJ,OAAO,CAAC,EAAE;AAClB,OAAO,CAAC,EAAE;AACV,OAAO,CAAC,EAAE,CAFC;EACV,OAAO,EAAE,YAAa;EAEtB,UAAU,EAAE,IAAK;EACjB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAJN;;;AAOJ,OAAO,CAAC,EAAE,CAAP;EACV,eAAe,EAAE,OAAQ,GADd;;;AAIJ,OAAO,CAAC,EAAE,CAAP;EACV,eAAe,EAAE,IAAK,GADX;;;AAID,OAAO,CAAC,EAAE,CAAC,EAAE,CAAV;EACb,eAAe,EAAE,MAAO,GADV;;;AAID,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAb;EAChB,eAAe,EAAE,MAAO,GADP;;;AAOP,OAAO,CAAC,EAAE,CAAC,EAAE;AACxB,OAAO,CAAC,EAAE,CAAC,EAAE;AACb,OAAO,CAAC,EAAE,CAAC,EAAE;AACb,OAAO,CAAC,EAAE,CAAC,EAAE,CAHC;EACb,OAAO,EAAE,KAAM;EACf,WAAW,EAAE,IAAK,GAFJ;;;AAKP,OAAO,CAAC,EAAE,CAAP;EACV,WAAW,EAAE,IAAK,GADP;;;AAIJ,OAAO,CAAC,EAAE,CAAP;EACV,WAAW,EAAE,IAAK,GADP;;;AAKJ,OAAO,CAAC,CAAC;AACjB,OAAO,CAAC,UAAU,CADC;EAClB,MAAM,EAAE,IAAK,GADM;;;AAIZ,OAAO,CAAC,UAAU,CAAP;EAClB,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,GAAI;EACX,MAAM,ED/HO,IAAI,CC+HI,IAAI;EACzB,OAAO,EAAE,GAAI;EAEb,UAAU,EAAE,MAAO;EACnB,UAAU,EAAE,yBAAI;EAChB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAI,GATT;;;AAYC,OAAO,CAAC,UAAU,CAAC,CAAC,AAAA,YAAY;AACrD,OAAO,CAAC,UAAU,CAAC,CAAC,AAAA,WAAW,CADE;EAC/B,OAAO,EAAE,YAAa,GADU;;;AAI1B,OAAO,CAAC,CAAC,CAAP;EACT,UAAU,EAAE,MAAO,GADT;;;AAIH,OAAO,CAAC,GAAG,CAAP;EACX,OAAO,EAAE,KAAM;EACf,QAAQ,EAAE,QAAS;EACnB,KAAK,EAAE,GAAI;EACX,MAAM,EDnJO,IAAI,CCmJI,IAAI;EAEzB,UAAU,EAAE,IAAK;EACjB,SAAS,EAAE,MAAO;EAClB,WAAW,EAAE,SAAU;EACvB,WAAW,EAAE,KAAM;EAEnB,SAAS,EAAE,UAAW;EAEtB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAI,GAbhB;;;AAeL,OAAO,CAAC,IAAI,CAAP;EACZ,WAAW,EAAE,SAAU,GADV;;;AAIF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAX;EAChB,OAAO,EAAE,KAAM;EACf,OAAO,EAAE,GAAI;EACb,QAAQ,EAAE,IAAK;EACf,UAAU,EAAE,KAAM;EAClB,SAAS,EAAE,MAAO,GALD;;;AAQV,OAAO,CAAC,KAAK,CAAP;EACb,MAAM,EAAE,IAAK;EACb,eAAe,EAAE,QAAS;EAC1B,cAAc,EAAE,CAAE,GAHJ;;;AAMD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAb;EAChB,WAAW,EAAE,IAAK,GADD;;;AAKJ,OAAO,CAAC,KAAK,CAAC,EAAE;AAC9B,OAAO,CAAC,KAAK,CAAC,EAAE,CADC;EAChB,UAAU,EAAE,IAAK;EACjB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;EAChC,aAAa,EAAE,SAAU,GAHR;;;AAOa,OAAO,CAAC,KAAK,CAAC,EAAE,CAAA,AAAA,KAAC,CAAM,QAAQ,AAAd;AAChD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAA,AAAA,KAAC,CAAM,QAAQ,AAAd,EADgB;EAChC,UAAU,EAAE,MAAO,GADc;;;AAKJ,OAAO,CAAC,KAAK,CAAC,EAAE,CAAA,AAAA,KAAC,CAAM,OAAO,AAAb;AAC/C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAA,AAAA,KAAC,CAAM,OAAO,AAAb,EADe;EAC/B,UAAU,EAAE,KAAM,GADc;;;AAKC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,AAAA,WAAW,CAAC,EAAE;AACtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,AAAA,WAAW,CAAC,EAAE,CADC;EACpC,aAAa,EAAE,IAAK,GADiB;;;AAI9B,OAAO,CAAC,GAAG,CAAP;EACX,cAAc,EAAE,KAAM,GADV;;;AAGL,OAAO,CAAC,GAAG,CAAP;EACX,cAAc,EAAE,GAAI,GADR;;;AAIL,OAAO,CAAC,KAAK,CAAP;EACb,OAAO,EAAE,YAAa;EACtB,SAAS,EAAE,KAAM;EACjB,WAAW,EAAE,KAAM;EACnB,cAAc,EAAE,GAAI,GAJN;;;AAOD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAb;EACf,cAAc,EAAE,GAAI,GADJ;;AAKjB;;+CAE+C;;AAEvC,OAAO,CAAC,CAAC,CAAP;EACT,KAAK,EHxNM,OAAO;EGyNlB,eAAe,EAAE,IAAK;EAEtB,kBAAkB,EAAE,KAAK,CAAC,KAAI,CAAC,IAAI;EAChC,eAAe,EAAE,KAAK,CAAC,KAAI,CAAC,IAAI;EAC3B,UAAU,EAAE,KAAK,CAAC,KAAI,CAAC,IAAI,GANzB;;;AAQD,OAAO,CAAC,CAAC,AAAA,MAAM,CAAR;EACf,KAAK,EH/NU,OAAO;EGiOtB,WAAW,EAAE,IAAK;EAClB,MAAM,EAAE,IAAK,GAJG;;;AAOA,OAAO,CAAC,KAAK,CAAC,IAAI,AAAA,MAAM,CAAjB;EACxB,KAAK,EAAE,IAAK;EACZ,UAAU,EAAE,OAAM,GAFO;;AAM1B;;+CAE+C;;AAE/B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAf;EACnB,MAAM,EAAE,IAAI,CAAC,GAAG;EAChB,UAAU,EAAE,yBAAI;EAChB,MAAM,EAAE,GAAG,CAAC,KAAK,CDhQN,IAAI;ECkQf,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAI,GALL;;;AAQD,OAAO,CAAC,OAAO,CAAC,GAAG,AAAA,MAAM,CAAlB;EACzB,MAAM,EAAE,CAAE;EACV,UAAU,EAAE,IAAK,GAFS;;;AAKjB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAT;EACb,kBAAkB,EAAE,GAAG,CAAC,KAAI,CAAC,MAAM;EAChC,eAAe,EAAE,GAAG,CAAC,KAAI,CAAC,MAAM;EAC3B,UAAU,EAAE,GAAG,CAAC,KAAI,CAAC,MAAM,GAHrB;;;AAMC,OAAO,CAAC,CAAC,AAAA,MAAM,CAAC,GAAG,CAAf;EACnB,UAAU,EAAE,wBAAI;EAChB,YAAY,EHrQF,OAAO;EGuQjB,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAI,GAJL;;AAQtB;;+CAE+C;;AAGf,OAAO,CAAC,SAAS,CAAC,cAAc;AAChE,OAAO,CAAC,SAAS,CAAC,cAAc,AAAA,QAAQ,CADC;EACxC,kBAAkB,EHjRP,OAAO,GGgRuB;;;AAKT,OAAO,CAAC,SAAS,CAAC,eAAe;AAClE,OAAO,CAAC,SAAS,CAAC,eAAe,AAAA,QAAQ,CADC;EACzC,iBAAiB,EHtRN,OAAO,GGqRwB;;;AAKb,OAAO,CAAC,SAAS,CAAC,YAAY;AAC5D,OAAO,CAAC,SAAS,CAAC,YAAY,AAAA,QAAQ,CADC;EACtC,mBAAmB,EH3RR,OAAO,GG0RqB;;;AAKR,OAAO,CAAC,SAAS,CAAC,cAAc;AAChE,OAAO,CAAC,SAAS,CAAC,cAAc,AAAA,QAAQ,CADC;EACxC,gBAAgB,EHhSL,OAAO,GG+RuB;;;AAIF,OAAO,CAAC,SAAS,CAAC,cAAc,AAAA,QAAQ,AAAA,MAAM,CAAvC;EAC9C,kBAAkB,EHnSF,OAAO,GGkSwB;;;AAIP,OAAO,CAAC,SAAS,CAAC,eAAe,AAAA,QAAQ,AAAA,MAAM,CAAxC;EAC/C,iBAAiB,EHvSD,OAAO,GGsSyB;;;AAIX,OAAO,CAAC,SAAS,CAAC,YAAY,AAAA,QAAQ,AAAA,MAAM,CAArC;EAC5C,mBAAmB,EH3SH,OAAO,GG0SsB;;;AAIN,OAAO,CAAC,SAAS,CAAC,cAAc,AAAA,QAAQ,AAAA,MAAM,CAAvC;EAC9C,gBAAgB,EH/SA,OAAO,GG8SwB;;AAKhD;;+CAE+C;;AAEvC,OAAO,CAAC,SAAS,CAAP;EACjB,UAAU,EAAE,kBAAI,GADE;;;AAGA,OAAO,CAAC,SAAS,CAAC,IAAI,CAAjB;EACtB,UAAU,EH5TA,OAAO;EG8TjB,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAAC,qCAAY;EACzC,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,qCAAY;EACpC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,qCAAY,GALrB",
12 | "names": []
13 | }
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Index
8 |
9 |
10 |
11 |
12 |
13 |
18 |
19 |
28 |
29 |
30 |
31 |
32 |
33 | {content}
34 |
35 |
36 |
37 |
38 |
39 |
40 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/src/js/repl.it.js:
--------------------------------------------------------------------------------
1 | function codereplace(snippet) {
2 | var frontmatter = '\
3 |
\
4 | \
5 |
\
6 |
\
7 | \
8 |
\
9 |
\
10 | ';
11 |
12 | var postmatter = '
\
13 |
\
14 |
\
15 |
Output:
\
16 |
\
17 |
\
18 |
';
19 |
20 | var code = frontmatter + snippet + postmatter;
21 | return code;
22 | }
23 |
24 | function init() {
25 | var elements = document.getElementsByClassName('exec');
26 | for (var i=0; i < elements.length; i++) {
27 | var snippet = elements[i].innerHTML;
28 | elements[i].innerHTML = codereplace(snippet);
29 | }
30 | }
31 |
32 | window.onload = function () {
33 | init();
34 |
35 |
36 | repl = new ReplitClient('api.repl.it', '80', 'python3', TOKEN);
37 |
38 |
39 | repl.connect().then(
40 | function () {
41 | document.querySelector('.run-button').innerHTML = 'RUN';
42 | document.querySelector('.run-button').disabled = false;
43 | start();
44 | },
45 | function () {
46 | document.querySelector('.run-button').innerHTML = 'failed';
47 | document.querySelector('.run-button').disabled = true;
48 |
49 | }
50 | );
51 |
52 | function start() {
53 | document.querySelector('.run-button').onclick = function () {
54 | document.querySelector('.run-button').disabled = true;
55 | document.querySelector('.run-button').innerHTML = 'running';
56 | repl.evaluate(
57 | document.querySelector('.input').innerHTML, {
58 | stdout: function (str) {
59 | document.querySelector('.out').innerHTML += str;
60 | }
61 | }
62 | ).then(
63 | function (err) {
64 | console.log(err);
65 | }
66 | );
67 | document.querySelector('.run-button').innerHTML = 'RUN';
68 | document.querySelector('.run-button').disabled = false;
69 | };
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/js/token.js.example:
--------------------------------------------------------------------------------
1 | TOKEN = //Insert repl.it token here
2 |
--------------------------------------------------------------------------------