{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c3c41172-0fa4-4542-af74-5912b25dce09",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "# Lösungen Extended Applications"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0200f54c-1416-4e4b-bcb9-fbe781bff590",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "### Aufgabe\n",
    "\n",
    "*3 Punkte*\n",
    "\n",
    "Schreibe einen Generator `square_count` mit einem Eingabeparameter `n`, welcher die Quadratzahlen von $1\\dots n^2$ ausgibt.\n",
    "\n",
    "Die Aufgabe gibt 0 Punkte, wenn die Funktion `square_count` kein Generator ist!\n",
    "\n",
    "Hinweis: Bei Eingabe von `5` soll die Ausgabe `1 4 9 16` sein."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b27328c4-e085-4783-8ea8-c45c62b63d9f",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Square Numbers from 0 to 1: 1\n",
      "Square Numbers from 0 to 2: 1 4\n",
      "Square Numbers from 0 to 3: 1 4 9\n",
      "Square Numbers from 0 to 4: 1 4 9 16\n",
      "Square Numbers from 0 to 5: 1 4 9 16 25\n"
     ]
    }
   ],
   "source": [
    "def square_count(n: int) -> int:    \n",
    "    for i in range(1, n):\n",
    "        yield i*i\n",
    "\n",
    "for n in range(2, 7):\n",
    "    print(f\"Square Numbers from 0 to {n-1}:\", *square_count(n))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72f74416-f665-475f-a411-aa2ad5a9c257",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "### Aufgabe\n",
    "\n",
    "*3 Punkte*\n",
    "\n",
    "Schreibe einen Generator `naturals`, welcher mit jedem Aufruf die nächste natürliche Zahl ausgibt. (Angefangen mit 1)\n",
    "\n",
    "- Es sind keine Eingabeparameter notwendig.\n",
    "- Ist die Funktion kein generator, wird diese Aufgabe mit 0 Punkten bewertet\n",
    "\n",
    "*Hinweis*: Orientiere dich an dem Beispiel `faktoriel_gen`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e5023e1a-1ab0-42ec-87f2-87c2eee46274",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import types"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "8769a98d-5ec0-407a-9ba0-538daff61597",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1, 2, 3, 4, 5, 6, 7, 8, 9, "
     ]
    }
   ],
   "source": [
    "def naturals() -> int:\n",
    "    curr = 1\n",
    "    while 1:\n",
    "        yield curr\n",
    "        curr += 1\n",
    "        \n",
    "gen: types.GeneratorType = naturals()\n",
    "for i in range(1, 10):\n",
    "    number: int = next(gen)\n",
    "    print(number, end=', ')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7514798b-d716-4161-a0b7-a644ac8bc67a",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "### Aufgabe\n",
    "\n",
    "*6 Punkte*\n",
    "\n",
    "Schreiben Sie eine Dataclass `Student`\n",
    "\n",
    "- Die dataclass soll die Werte `vorname`, `nachname`, `semester` und `mat_nr` speichern, vergebe hierzu selber den !!geeigneten!! Datentypen. Mache dir dazu Gedanken ob es Sinnvoll beispielweise die Semesteranzahl als Float zu speichern.\n",
    "\n",
    "- importiere aus dem dataclasses modul die Funktion `asdict`, erstelle ein Objekt mit den Werten aus dem Beispielstundent, weiße den rückgabewert aus `asdict` aufgerufen mit dem Beispielstudenten der Variablen `stud` zu.\n",
    "\n",
    "- Die Aufgabe wird mit 0 Punkten bewertet, wenn `Student` keine dataclass ist!\n",
    "\n",
    "- Hat einer der Attribute keinen geeigneten Datentypen, führt dies nicht zu Punktabzug bei zwei oder mehr schon."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6d510b0-1565-489c-9441-1812153a3a9f",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "source": [
    "Beispielstudent:\n",
    "\n",
    "|Attribut|Wert|\n",
    "|-|-|\n",
    "|vorname|Martin|\n",
    "|nachname|Le|\n",
    "|mat_nr|520420|\n",
    "|semester|5|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "36bd4680-e75e-4db0-9442-9c62f393608e",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'mat_nr': 520420,\n",
      " 'nachname': 'Le',\n",
      " 'semester': 5,\n",
      " 'vorname': 'Martin'}\n"
     ]
    }
   ],
   "source": [
    "from dataclasses import dataclass, asdict\n",
    "\n",
    "@dataclass\n",
    "class Student:\n",
    "    vorname: str\n",
    "    nachname: str\n",
    "    mat_nr: int\n",
    "    semester: int \n",
    "\n",
    "student = Student(\n",
    "            vorname='Martin',\n",
    "            nachname='Le',\n",
    "            mat_nr=520420,\n",
    "            semester=5)\n",
    "\n",
    "stud = asdict(student)\n",
    "\n",
    "from pprint import pprint\n",
    "pprint(stud, width=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1471211-26a2-4607-82de-9cc706cfc2fb",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "### Aufgabe\n",
    "\n",
    "*6 Punkte*\n",
    "\n",
    "Gegeben sind zwei Listen `colorn` & `colorv_hex`, welche zueinander Index Sortiert sind.\n",
    "\n",
    "Schreiben nun eine Dataclass `Color` mit den Attributen `name` & `value` und vergebe geeignete Type Hints.\n",
    "\n",
    "Erstelle danach eine Liste, welche die Werte aus `colorn` & `colorv_hex` in die Dataclass `Color` umwandeln, und speicher die Liste in der variablen `colors`.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "2abd79b2-2083-422b-a83d-7cd3f03aa82c",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "colorn = ['RED', 'GREEN', 'BLUE', 'YELLOW', 'PURPLE']\n",
    "colorv_hex = ['#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "9a82261a-a644-4118-a4f2-e663f10a75bd",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Color(name='RED', value='#FF0000'),\n",
      " Color(name='GREEN', value='#00FF00'),\n",
      " Color(name='BLUE', value='#0000FF'),\n",
      " Color(name='YELLOW', value='#FFFF00'),\n",
      " Color(name='PURPLE', value='#FF00FF')]\n"
     ]
    }
   ],
   "source": [
    "colors = None\n",
    "\n",
    "@dataclass\n",
    "class Color:\n",
    "    name: str\n",
    "    value: str\n",
    "\n",
    "colors = [Color(n, w) for n, w in zip(colorn, colorv_hex)]\n",
    "    \n",
    "pprint(colors)"
   ]
  }
 ],
 "metadata": {
  "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.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
