{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Software Entwicklung \n",
    "\n",
    "## Kapitel 1: Einführung \n",
    "\n",
    "### 1.3 Variable\n",
    "\n",
    "Wie in jeder anderen Programmiersprache dienen *Variablen* dazu, Werte (z.B. Rückgabewerte von \n",
    "Funktionsaufrufen) zu benennen und zu speichern. Die Zuweisung erfolgt mit einem einfachen\n",
    "Gleichheitszeichen <code>=</code>. Durch die Vergabe eines Namens kann anschließend gezielt \n",
    "auf den Wert zugegriffen werden."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "#### 1.3.1 Variablennamen\n",
    "\n",
    "Variablennamen setzen sich aus Buchstaben, Unterstrichen und Ziffern zusammen, wobei Ziffern \n",
    "nicht am Amfang des Namens stehen dürfen. Groß- und Kleinschreibung werden vom \n",
    "Python-Interpreter unterschieden, d.h. die Bezeichner <code>Abc</code> und <code>abc</code>\n",
    "verweisen auf unterschiedliche Werte.\n",
    "\n",
    "Die *Schlüsselwörter* der Programmiersprache Python, die wir noch kennenlernen werden, sind\n",
    "als Variablennamen natürlich nicht zugelassen. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "var = input(\"Wie heißen Sie?\")\n",
    "print(var)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "#### 1.3.2 Konventionen\n",
    "\n",
    "Nicht alles, was der Python-Interpreter zulässt, ist auch übliche Praxis. Python-Entwickler \n",
    "haben sich auf einige Konventionen geeinigt, die das Lesen und Verstehen von fremden \n",
    "Programmcode erleichtern:\n",
    "\n",
    "- Variablennamen sollten keine Großbuchstaben enthalten, also nur Kleinbuchstaben und\n",
    "  Unterstriche\n",
    "- Längere Variablennamen werden durch Unterstriche lesbar gemacht, z.B. \n",
    "  <code>calculation_result</code>\n",
    "  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "#### 1.3.3 Vereinbarung\n",
    "\n",
    "Variablen müssen in Python nicht deklariert werden. Sie entstehen mit der ersten Zuweisung.\n",
    "Anschließend kann auch lesend auf die Variable zugegriffen werden.\n",
    "\n",
    "Der Zugriff auf eine Variable, die (noch) nicht existiert führt zu einer Fehlermeldung und\n",
    "dem Abbruch des Programms.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "print(not_yet_defined)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "#### 1.3.4 Typisierung\n",
    "\n",
    "Werte besitzen in Python einen Typ (Ganzzahl, Fließkommazahl, String), Variablen jedoch nicht.\n",
    "Somit kann eine Variable im Laufe einer Programmausführung mal einen String, mal eine Zahl\n",
    "enthalten, ohne dass der Interpreter sich daran stört.\n",
    "\n",
    "Der Typ eines in einer Variablen enthaltenen Wertes kann mit der Built-In Function \n",
    "\n",
    "```Python\n",
    "type()\n",
    "```\n",
    "\n",
    "ermittelt werden."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "print(type(\"Hello\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Seit Python 3.6 können Variable mit *Type Annotations* versehen werden, die aber zunächst \n",
    "lediglich den menschlichen Leser von Pythoncode in einer standardisierten \n",
    "Form darauf hinweisen, dass diese Variable nur Werte eines bestimmten Typs aufnehmen soll.\n",
    "Der Python-Interpreter wird den Code auch bei einem Verstoß ohne Widerspruch ausführen. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "ganze_zahl : float\n",
    "ganze_zahl = 4\n",
    "print(ganze_zahl)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Allerdings existieren Tools zur statischen Codeanalyse, die diese Hinweise auswerten. Für \n",
    "*Visual Studio Code* gibt es z.B. die Extension *Pyright*, die eine entsprechende \n",
    "Prüfung nachrüstet.\n"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "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.9.9"
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "metadata": {
     "collapsed": false
    },
    "source": []
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
