Skip to content

Instantly share code, notes, and snippets.

@lebalz
Last active September 8, 2020 13:27
Show Gist options
  • Select an option

  • Save lebalz/8d7ba1e8e0fa2f4bf5987f88e7518f94 to your computer and use it in GitHub Desktop.

Select an option

Save lebalz/8d7ba1e8e0fa2f4bf5987f88e7518f94 to your computer and use it in GitHub Desktop.
06_gbsl_functions.ipynb
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3-final"
},
"orig_nbformat": 2,
"kernelspec": {
"name": "python38364bit383pyenv8c4b70ca7eda4aacafd89fc5235bf831",
"display_name": "Python 3.8.3 64-bit ('3.8.3': pyenv)"
}
},
"nbformat": 4,
"nbformat_minor": 2,
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Funktionen"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "Hallo Beni\nHallo Maria\nHeute ist der 2020-09-08.\n"
}
],
"source": [
"from datetime import date\n",
"\n",
"def say_hi(name):\n",
" print(f\"Hallo {name}\")\n",
"\n",
"say_hi(\"Beni\")\n",
"say_hi(\"Maria\")\n",
"print(f\"Heute ist der {date.today()}.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mit dem Schlüsselwort `def` wird eine neue Funktionen Namens `say_hi` erstellt. Dieser Funktion kann einen Wert übergeben werden. Dieser Wert ist innerhalb der Funktion (alles was unter dem Funktionsnamen eingerückt ist) über die Variable `name` abrufbar.\n",
"\n",
"Bei der Definition einer Funktion werden die Befehle noch nicht ausgeführt. Erst auf der `6` Zeile wird die Funktion `say_hi` mit dem Wert `\"Beni\"` aufgerufen - die Funktion wird abgearbeitet und `Hallo Beni` wird ausgegeben.\n",
"\n",
"*Bemerkung*: `date.today()` gibt das Datum von Heute zurück. `today()` ist ebenfalls eine Funktion, die es aber nur für den Tatentyp Datum (`date`) gibt - sie \"lebt\" also im Datum. Deshalb ist der Funktionsaufruf hier `date.today()`.\n",
"\n",
"\n",
"## Mehrere Argumente und Rückgabewert\n",
"\n",
"Im untenstehenden Beispiel erwartet die Funktion `plus` 2 Argumente, welche dann als `a` und `b` innerhalb der Funktion verfügbar sind. Die Funktion `plus` ändert zuerst den Datentyp der beiden eingegebenen Werte auf `float` und gibt dann das Resultat der Addition zurück. Der zurückgegebene Wert kann dann in einer Variable (hier `resultat`) gespeichert werden."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "1 + 3 = 4.0\n"
}
],
"source": [
"def plus(a, b):\n",
" a = float(a)\n",
" b = float(b)\n",
" return a + b\n",
"\n",
"zahl1 = input(\"Zahl 1\")\n",
"zahl2 = input(\"Zahl 2\")\n",
"resultat = plus(zahl1, zahl2)\n",
"print(f\"{zahl1} + {zahl2} = {resultat}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fügen Sie oben eine weitere Funktion `minus` hinzu, welche `a - b` berechnet und zurückgibt. Fügen Sie zudem eine Zeile hinzu, welche das Resultat dieser Rechnung ausgibt.\n",
"\n",
"## Gültigkeitsbereiche von Variablen: lokale und `global`e Variablen\n",
"\n",
"Im folgenden Skript passiert etwas komisches - welche Ausgabe hätten Sie erwartet?. Was könnte passiert sein?"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "Aktuelle Zahl: 13\nAktuelle Zahl: 13\n"
}
],
"source": [
"zahl = 13\n",
"\n",
"def print_current():\n",
" print(f\"Aktuelle Zahl: {zahl}\")\n",
"\n",
"def reset():\n",
" zahl = 0\n",
" print_current()\n",
"\n",
"print_current()\n",
"reset()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"Code innerhalb von Funktionen kann im normalfall nur Variablen ändern, die\n",
"- als Funktionsparameter (bei `plus(a, b)` die Variablen `a` und `b`) übergeben wurden\n",
"- in der Funktion selbst definiert wurden\n",
"\n",
"Die Variable `zahl` wurde ausserhalb der beiden Funktionen definiert. Das **abfragen (lesen)** der Variable innerhalb `print_current()` ist ohne weiteres möglich. Versuchen wir aber, der Variablen `zahl` einen Wert zuzuordnen (`zahl = 0`), so wird innerhalb der Funktion eine neue solche Variable erstellt, anstatt die Variable ausserhalb der Funktion anzupassen. Das ist nicht etwa ein Fehler in Python, sondern so gewollt! Andernfalls wäre es schier unmöglich Funktions-Bibliotheken zu verwenden, denn man müsste ja sicherstellen, dass nicht ungewollt Änderungen an Variablen vorgenommen werden, die zufällig gleich heissen.\n",
"\n",
"Es gibt aber einen Trick, um solche Variablen dennoch zu verändern - mit dem Schlüsselwort `global` teilen wir Python mit, dass wir explizit eine Variable ausserhalb der aktuellen Funktion verändern möchten."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "Aktuelle Zahl: 13\nAktuelle Zahl: 0\n"
}
],
"source": [
"zahl = 13\n",
"\n",
"def print_current():\n",
" print(f\"Aktuelle Zahl: {zahl}\")\n",
"\n",
"def reset():\n",
" global zahl\n",
" zahl = 0\n",
" print_current()\n",
"\n",
"print_current()\n",
"reset()\n"
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment