diff --git a/Ovingsforelesninger/bjornkare/OF_7_fasit.ipynb b/Ovingsforelesninger/bjornkare/OF_7_fasit.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..c688c39ca2e94f86310037007f7701bc9d7b5912 --- /dev/null +++ b/Ovingsforelesninger/bjornkare/OF_7_fasit.ipynb @@ -0,0 +1,779 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "heading_collapsed": true + }, + "source": [ + "# Øvingsforelesning 7" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Strenger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Forklaring av Strenger\n", + "En **streng** kan sees på som en sekvens av tegn (characters) som ligger på hver sin gitte plass. Strenger har dermed mange av de samme egenskapene som lister som vi skal se på under." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "min_streng = \"Hei, jeg heter Vilde\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For å aksessere elementene i strengen benytter vi indeksering. Indeksen forteller hvilken \"plass\" vi er på i strengen på samme måte som vi så med lister forrige uke. Den første indeksen i strengen er 0 og den siste er *antall elementer - 1*. Det vil si at det første elementet i `min_streng`, `'H'`, kan hentes ut slik:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "min_streng[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Det siste elementet av `min_streng` kan hentes ut slik: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "min_streng[-1] " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "På samme måter som med lister, kan man også benytte **slicing** for å hente ut en del av strengen. I kodenblokken under henter vi ut de første 4 charactersene av `min_streng`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "min_streng[0:4]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test deg frem med strenger selv\n", + "Kodeblokken under er lagt til for at du skal kunne leke deg litt frem med strenger selv. Gjerne kombiner det med konsepter du har lært tidligere som if-setninger, løkker og funksjoner." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Skriv koden din her" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Indeksering, Slicing og Traversering\n", + "<img src=\"streng_indeksering.jpg\" style=\"width: 650px;\">" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Innebygde streng-funksjoner: Nice to know\n", + "<img src=\"funksjoner_strenger.jpg\" style=\"width: 650px;\">" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<br><br>" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "heading_collapsed": true + }, + "source": [ + "# NumPy-biblioteket" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "## Forklaring av NumPy-biblioteket\n", + "NumPy er en modul som gir oss lister som er mye mer effektive enn Python sine innebygde lister. I tillegg har NumPy mye funksjonalitet for liste- og matriseoperasjoner. Derfor er det kjempenyttig å ha kjennskap til NumPy hvis man jobber med store datamengder og/eller skal gjøre en del operasjoner på lister. Slike arbeidsområder er for eksempel matematikk, fysikk, kunstig intelligens, finans og data-analyse." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "Vi importerer numpy som følgende, og refererer til det ved hjelp av `np`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "hidden": true + }, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "Kodeblokken under viser hvordan en liste kan opprettes med innebygde lister i Python, og hvordan en tilsvarende liste kan opprettes som en NumPy-array." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "hidden": true + }, + "outputs": [], + "source": [ + "# Oppretting a vanlige lister\n", + "liste = [1, 2, 3, 4, 5, 6]\n", + "\n", + "\n", + "# Oppretting av numpy array\n", + "import numpy as np\n", + "array = np.array([1, 2, 3, 4, 5, 6])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "## Test deg frem med NumPy selv\n", + "Kodeblokken under er lagt til for at du skal kunne leke deg litt frem med NumPy-arrays selv. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "hidden": true + }, + "outputs": [], + "source": [ + "# Skriv koden din her" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "## NumPy-funksjoner: Nice to know\n", + "<img src=\"numpy_funksjoner.jpg\" style=\"width: 700px;\">\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "<br><br><br><br>" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "heading_collapsed": true + }, + "source": [ + "# Gjennomgang av oppgave 3 fra øvingsforelesning 6 \n", + "\n", + "## Oppgave 3: Eksamensoppgave Høst 2014" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "<img src=\"E2014-3.jpg\" style=\"width: 750px;\">" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "<img src=\"E2014-3a.jpg\" style=\"width: 750px;\">" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "<br><br>\n", + "**Sammendrag av oppgaven over:**<br>\n", + "Du skal lage en funksjon som går gjennom listen weatherData og skriver ut\n", + "* Antall dager i perioden (Dvs. antall lister i weatherData)\n", + "* Total nedbørsmengde i perioden \n", + "* Høyeste temperatur og dagen denne forekom\n", + "* Laveste temperatur og dagen denne forekom \n", + "\n", + "*`weatherData`:*\n", + "* weatherData er en liste med lister i (matrise), hvor hver liste i weatherData er på formatet `[maximumstemperatur, minimumstemperatur, nedbørsmengde]`\n", + "* Den første lista i weatherData, dvs. `weatherData[0]` er vær-data for dag 1, den andre lista i weatherData, dv `weatherData[1]` er værdata for dag 2 osv. \n", + "\n", + "\n", + "*Hint:* Konsentrer deg om ett av punktene over om gangen, lagre informasjonen i variabler og skriv ut informasjonen til slutt.\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "hidden": true + }, + "outputs": [], + "source": [ + "def weatherStats(weatherData):\n", + " # Regner ut antall dager i perioden og lagre resultatet i variabelen n_days\n", + " n_days = len(weatherData)\n", + " \n", + " \n", + " # Regner ut total nedbørsmengde og lagre resultatet i variabelen rain\n", + " rain = 0 \n", + " \n", + " # Itererer gjennom dagene i weatherData\n", + " for i in range(n_days):\n", + " \n", + " # weatherData[i] er en liste med [maxtemp, mintemp, nedbørsmengde] for dag i\n", + " # dvs. at weatherData[i][2] gir nedbørsmengde for dag i \n", + " \n", + " rain += weatherData[i][2]\n", + "\n", + " \n", + " # Finn høyeste temperatur og dagen denne forekom og lagre i de respektive variablene max_temp og max_day\n", + " # Finn laveste temperatur og dagen denne forekom og lagre i de respektive variablene min_temp og min_day\n", + " \n", + " max_temp = weatherData[0][0] # maximumstemperatur for dag 1\n", + " max_day = 1\n", + " \n", + " min_temp = weatherData[0][1] # minimumstemperatur for dag 1\n", + " min_day = 1\n", + " \n", + " \n", + " # itererer gjennom hver dag i weatherData for å sjekke om dag i har lavere temp en min_temp eller høyere temp en max_temp\n", + " for i in range(n_days):\n", + " \n", + " if weatherData[i][0] > max_temp:\n", + " max_temp = weatherData[i][0]\n", + " max_day = i + 1\n", + " \n", + " \n", + " if weatherData[i][1] < min_temp:\n", + " min_temp = weatherData[i][1]\n", + " min_day = i + 1\n", + " \n", + " \n", + "\n", + " \n", + " \n", + " ########## Koden din slutter her ###########\n", + " # Printer sammendrag \n", + " print(\"There are\", n_days, \"in the period\")\n", + " print(\"The highest temperature was\", max_temp, \"on day number\", max_day)\n", + " print(\"The lowest temperature was\", min_temp, \"on day number\", min_day)\n", + " print(\"There was a total of\", round(rain,2) , \"mm rain in the period\")\n", + " \n", + " ## NB: Merk at det i den originale notebooken var en error i denne koden på linje 49. Der stod det nedbør, som skal være rain\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "Sjekker om funksjonen skriver ut riktig data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "hidden": true + }, + "outputs": [], + "source": [ + "weatherData = [[12.0, 2.4, 8.2], [6.1, 0.6, 11.9], [8.3, -3.5, 0.0], [11.6, -5.2, 0.0], [15.3, 2.8, 14.3]]\n", + "\n", + "weatherStats(weatherData)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "<br><br><br><br>" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Oppgaver til øvingsforelesning 7" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Oppgave 1 - Lister og løkker " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Du skal på butikken for moren din og har fått beskjed om å huske alle gjenstandene du skal kjøpe med.* <br><br>\n", + "\n", + "Du har gitt en liste, `handleliste`som sier gjenstandene du skal kjøpe, og en liste `priser` som gir prisene til alle elementene i handlelisten. Det vil si at prisen til `handleliste[i]`er gitt av `priser[i]`hvor `i` er indeksen (plassen) til elementet i listene." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "handleliste = [\"Melk\", \"Bananer\", \"Brus\", \"Rundstykker\", \"Godteri\", \"Bønner\", \"Nøtter\"]\n", + "priser = [17, 5, 25, 15, 55, 10, 30]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "a) Lag en funkjson `print_handleliste` som printer ut handleliste-elementet med korresponderende pris med `:` mellom og `'kr'` på slutten. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Melk: 17 kr\n", + "Bananer: 5 kr\n", + "Brus: 25 kr\n", + "Rundstykker: 15 kr\n", + "Godteri: 55 kr\n", + "Bønner: 10 kr\n", + "Nøtter: 30 kr\n" + ] + } + ], + "source": [ + "def print_handleliste(navneliste, prisliste):\n", + " \n", + " if len(navneliste) != len(prisliste):\n", + " print(\"Listene må være like lange\")\n", + " return\n", + " \n", + " for i in range(len(navneliste)):\n", + " print(navneliste[i] + \": \" + str(prisliste[i]) + \" kr\")\n", + " \n", + "print_handleliste(handleliste, priser)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "b) Lag en funksjon, `har_råd_til` som tar inn en handleliste og pris-liste. Funksjonen skal returnere en ny liste med elementer og en liste korresponderende priser som du har råd til hvis du har totalt 100 kr. <br><br>\n", + "*Hint:*\n", + "* Du trenger ikke tenke på rekkefølgen til elementene, men fjern det bakerste elementet så lenge summen er større enn 100.\n", + "* Bruk en while-løkke \n", + "* sum(liste) returnerer summen av alle elementene i liste\n", + "* liste.pop(indeks) fjerner elementet på indeks i liste" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Melk: 17 kr\n", + "Bananer: 5 kr\n", + "Brus: 25 kr\n", + "Rundstykker: 15 kr\n" + ] + } + ], + "source": [ + "def har_råd_til(navneliste, prisliste):\n", + " while sum(prisliste) > 100:\n", + " prisliste.pop(-1)\n", + " navneliste.pop(-1)\n", + " \n", + " return navneliste, prisliste\n", + "\n", + "handleliste, priser = har_råd_til(handleliste, priser)\n", + "print_handleliste(handleliste, priser)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Oppgave 2 - NumPy-arrays" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "a) Importer NumPy-biblioteket og definer følgende numpy-arrays:\n", + "* x skal ha alle tallene fra 5 til 10 \n", + "* y skal ha alle tallene fra 30 til 70 \n", + " * Hint: np.arange(a,b) git tallene fra og med a til b\n", + "\n", + "Til slutt: print ut de to listene." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n", + "[ 5 6 7 8 9 10]\n", + "30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 " + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "x = np.arange(5, 11)\n", + "y = np.arange(30, 71)\n", + "\n", + "for element in x:\n", + " print(element)\n", + "\n", + "print(x)\n", + "\n", + "for element in y:\n", + " print(element, end=\" \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "b) Lag en numpy-matrise (dvs. liste med lister i) på størrelse 3 x 3 ( 3 rader og 3 kolonner ) med enere i første rad, toere i andre rad og treere i tredje rad. Deretter lag en for-løkke som itererer gjennom matrisen og printer ut hver rad.\n", + "<br>\n", + "*Hint:*\n", + "* np.array-funksjonen kan også ta inn matriser" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[7 7 7 7 7 7 7 7 7 7 7 7 7 7 7]\n", + "[1 1 1]\n", + "[2 2 2]\n", + "[3 3 3]\n" + ] + } + ], + "source": [ + "mat = np.array([[1, 1, 1], [2,2,2], [3,3,3]])\n", + "\n", + "rep = np.repeat(7, 15)\n", + "\n", + "print(rep)\n", + "\n", + "for rad in mat:\n", + " print(rad)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Oppgave 3 - Strenger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lag en funksjon `check_equal_lenght` som tar inn to strenger, `string1` og `string2`, som sjekker om strengene er like lange. Den skal returnere `True` dersom strengene er like lange, og `False` ellers" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n" + ] + } + ], + "source": [ + "def check_equal_length(string1, string2):\n", + " return len(string1) == len(string2)\n", + "\n", + "a = \"streng\"\n", + "b = \"blablabla\"\n", + "\n", + "print(check_equal_length(a, b))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Oppgave 4 - Strenger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Lag en funksjon som tar inn to ord og sjekker om de tre første bokstavene i ordene er like (ikke sensitivt for store/små bokstaver)\n", + "* Returner `True` hvis de tre første bokstavene er like, `False` ellers\n", + "* `«Fotball»` og `«fotografi»` skal i dette tilfellet gi `True`" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n" + ] + } + ], + "source": [ + "def første_tre_like(ord1, ord2):\n", + " return ord1[:3].lower() == ord2[:3].lower()\n", + "\n", + "print(første_tre_like(\"Fotball\", \"fole\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Oppgave 5 - Strenger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<img src=\"hva_printes_her.jpg\" style=\"width: 400px;\">" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Dobbeltklikk på blokken under for å skrive svaret ditt." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "SVAR:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Denne kodeblokken kan du bruke til å kladde" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Oppgave 6 - Strenger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lag en funksjon `funny_word` som tar inn inputparameteren `word`. `funny_word` skal bytte alle vokalene i `word` med en ny tilfeldig vokal. <br> <br>\n", + "*Hint*\n", + "* vokaler = `['a','e','i','o','u’]`, `for char in word:`, `if char in vokaler:` " + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bjærn Kæro\n" + ] + } + ], + "source": [ + "import random\n", + "\n", + "def funny_word(word):\n", + " vokaler = ['a', 'e', 'i', 'o', 'u', 'æ', 'ø', 'å']\n", + " \n", + " nytt_ord = \"\"\n", + "\n", + " for bokstav in word:\n", + " if bokstav in vokaler:\n", + " andre_vokaler = vokaler.copy()\n", + " andre_vokaler.remove(bokstav)\n", + " nytt_ord = nytt_ord + random.choice(andre_vokaler)\n", + " else:\n", + " nytt_ord = nytt_ord + bokstav\n", + " \n", + " return nytt_ord\n", + "\n", + "\n", + "def main():\n", + " morsomt_ord = funny_word(\"Bjørn Kåre\")\n", + " morsomt_ord2 = funny_word(\"Bjørn Kåre\")\n", + " \n", + " print(morsomt_ord)\n", + " if første_tre_like(morsomt_ord, morsomt_ord2):\n", + " print(f\"{morsomt_ord} og {morsomt_ord2} har de samme første tre bokstavene\")\n", + " \n", + "main()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}