{"id":189,"date":"2008-07-29T10:03:16","date_gmt":"2008-07-29T09:03:16","guid":{"rendered":"http:\/\/www.nielsgamborg.dk\/wordpress\/?p=189"},"modified":"2008-07-29T10:03:16","modified_gmt":"2008-07-29T09:03:16","slug":"python_tutorial","status":"publish","type":"post","link":"https:\/\/nielsgamborg.dk\/wordpress\/programmering\/python_tutorial.htm","title":{"rendered":"Python tutorial. En intro til Python for begyndere."},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\"alignright size-full wp-image-193\" title=\"python-logo\" alt=\"\" src=\"http:\/\/www.nielsgamborg.dk\/wordpress\/wp-content\/python-logo.gif\" width=\"211\" height=\"71\" \/>I denne <strong>Python\u00a0tutorial<\/strong> vil jeg give en kort introduktion til Python. Tutorialen henvender sig til <strong>begyndere i Python<\/strong>, men en\u00a0smule programmeringserfaring fra et andet sprog \u00a0vil nok\u00a0g\u00f8re det lettere at\u00a0f\u00f8lge med.<\/p>\n<p>Jeg har udvalgt nogle af de v\u00e6sentligste karakteristika ved\u00a0Python og vil i de forskellige afsnit give korte programmeringseksempler. Til slut\u00a0programmerer vi en\u00a0 lixberegner, der vil anskueligg\u00f8re de gennemg\u00e5ede emner, samt tilf\u00f8je et par nye vigtige detaljer om Python.<!--more--><\/p>\n<h3>Start med\u00a0Python<\/h3>\n<p>Du kan downloade den seneste Python version fra <a title=\"Download python\" href=\"http:\/\/www.python.org\/download\/\">Python.org<\/a>. Sammen med Python bliver IDLE installeret. IDLE er en lille grafisk brugergr\u00e6nseflade, du kan bruge til at skrive og afvikle dine Python programmer i.\u00a0IDLE bruger syntaks highlighning, som g\u00f8r det lettere at overskue koden og opdage eventuelle syntaks fejl.<\/p>\n<p>\u00c5ben IDLE og skriv:<\/p>\n<blockquote><p>print &#8220;Hello world&#8221;<\/p>\n<p>OBS. Fra Python 3.0 er print blevet en funktion. Det betyder at syntaksen ved print nu er:<\/p>\n<p>print (&#8220;Hello world&#8221;)<\/p>\n<p><span style=\"color: #999999;\">(<span style=\"color: #ff6600;\">OBS!<\/span> Sidst i blogindl\u00e6gget kan du finde en lixberegner skrevet i b\u00e5de Python 2 og Python 3. Find selv alle forskellene! <\/span>)<\/p><\/blockquote>\n<p>Python vil nu udf\u00f8re programmet. I dette tilf\u00e6lde vil Python skrive &#8220;Hello world&#8221; p\u00e5 sk\u00e6rmen.<\/p>\n<p>\u00c5ben bagefter\u00a0et nyt vindue i IDLE, \u00a0skrive ovenst\u00e5ende kode igen og gem det som F.eks. &#8220;hello.py&#8221;. S\u00e5 kan du v\u00e6lge at k\u00f8re programmet ved at taste &#8220;F5&#8243;eller v\u00e6lge &#8220;Run module&#8221; fra menuen. Denne sidste metode er selvf\u00f8lgelig den mest hensigtsm\u00e6ssige, da du her gemmer dine Python programmer.<\/p>\n<p>OBS. IDLE kan give problemer, n\u00e5r man afvikler den under Windows. L\u00e6s her hvordan\u00a0du l\u00f8ser <a title=\"Problemer med Python Editor IDLE\" href=\"http:\/\/www.nielsgamborg.dk\/wordpress\/webudvikling\/problemer_python_editor_idl.htm\">Problemer med IDLE<\/a>.<\/p>\n<h3>Syntaks i Python<\/h3>\n<p>Pythons syntaks er meget brugervenlig og logisk. Den er simpel, minimalistisk og\u00a0blottet for un\u00f8dige tegn, hvilket g\u00f8r den let at overskue og l\u00e6re. B\u00e5de for erfarne programm\u00f8rer og begyndere.<\/p>\n<p>Et af de b\u00e6rende elementer i Pythons syntaks er indrykninger af kodeblokke. Hvor man i andre sprog udelukkende bruger indrykninger, for at bevare overblikket, er indrykninger i Python en del af syntaksen. Hvis man laver fejl i indrykningerne virker python programmet ikke efter hensigten, da Python parseren s\u00e5 ikke kan se, hvilke kodeblokke, der h\u00f8rer sammen.<\/p>\n<p>Det kan lyde som en begr\u00e6nsning, men fordelen er, at man slipper for at holde styr p\u00e5 parenteser og semikolonner. En ordentlig programm\u00f8r\u00a0laver under alle omst\u00e6ndigheder de korrekte indrykninger, s\u00e5 det eneste det kr\u00e6ver er en lidt mere grundig struktur i ens arbejde i starten. For begynderen vil dette arbejde med indrykninger give en fordel, n\u00e5r han senere vil l\u00e6re andre programmeringssprog.<\/p>\n<blockquote>\n<pre>x = 3\nif x == 3:\n  print \"x er lig med 3\"\nelse:\n  print \"x er forskellig fra 3\"<\/pre>\n<\/blockquote>\n<h3>Kontrolstrukturer i Python<\/h3>\n<p>Pythons kontrolstrukturer fungerer som kontrolstrukturerne i andre sprog. Hovedforskellen er en let \u00e6ndret syntaks. F.eks. skriver man i Python &#8220;elif&#8221; i stedet for &#8220;else if&#8221;. En anden v\u00e6sentlig forskel er sammenligningsoperatorerne &#8220;og&#8221; og &#8220;eller&#8221;. De hedder ganske simpelt &#8220;and&#8221;\u00a0 og &#8220;or&#8221;.<\/p>\n<blockquote>\n<pre>x = 3\ny = 2\nif x == 3\u00a0and y == 2:\n  print \"x er lig med 3, og y er lig med 2\"\nelif x ==\u00a03 and y != 2:\n  print \"x er lig med 3, og y er forskellig fra 2\"\nelif x !=3\u00a0 and y == 2:\n  print \"x er\u00a0forskellig fra\u00a03, og y er\u00a0lig med\u00a02\"\nelse:\n  print \"x er forskellig fra 3, og y er forskellig fra 2\"<\/pre>\n<\/blockquote>\n<h3>L\u00f8kker i Python<\/h3>\n<p>&#8220;For&#8221; l\u00f8kker fungerer en smule anderledes i Python end\u00a0vi er vant til fra f.eks. JavaScript, PHP eller Java.\u00a0\u00a0&#8220;For l\u00f8kken fungerer n\u00e6rmere som en &#8220;foreach&#8221; l\u00f8kke. Hvis vi opretter et array, som vi kalder liste kan vi genneml\u00f8be alle elementerne i listen p\u00e5 f\u00f8lgende m\u00e5de:<\/p>\n<blockquote>\n<pre>liste = (\"Python\", \"PHP\", \"JavaScript\")\nfor i in liste:\n  print liste(i)<\/pre>\n<\/blockquote>\n<p>Programmet vil udskrive elementerne i listen et af gangen.<\/p>\n<p>En anden m\u00e5de at bruge\u00a0&#8220;for&#8221; l\u00f8kker\u00a0p\u00e5 i Python er gennem den indbyggede &#8220;range&#8221; funktion:<\/p>\n<blockquote>\n<pre>for i in range(1,10):\n  print i<\/pre>\n<\/blockquote>\n<p>Ovenst\u00e5ende vil skrive tallene 1-9. Default intervallet i &#8220;range&#8221;-funktionen er 1. Hvis vi \u00f8nsker et andet interval skriver vi istedet:<\/p>\n<blockquote>\n<pre>for i in range(1,10,2):\n  print i<\/pre>\n<\/blockquote>\n<p>Denne programstupm vil istedet udskrive: 1, 3, 5, 7, og 9.<\/p>\n<p>I Python kan man ogs\u00e5 bruge &#8220;while l\u00f8kker&#8221;. De\u00a0fungerer som i de fleste andre programmeringssprog.<\/p>\n<h3>En lixberegner i Python<\/h3>\n<p>Som et eksempel p\u00e5 et lidt mere avanceret program, vil\u00a0vi\u00a0nu programmere en meget simpel lixtalsberegner (l\u00e6s om <a title=\"Lix og lixtal\" href=\"http:\/\/www.nielsgamborg.dk\/wordpress\/brugervenlighed\/lix_lixtal_laesbarhed.htm\">lix og lixtal<\/a>).<\/p>\n<p>Udover det vi har gennemg\u00e5et til nu, vil vi i\u00a0lixberegneren ogs\u00e5\u00a0bruge:<\/p>\n<ul>\n<li>Kommentarertegn (havel\u00e5ge\/hash\/#) &#8211; S\u00e5 kan vi kommentere direkte i koden. Det g\u00f8r det lettere at bevare overblikket, n\u00e5r andre skal se din kode eller du senere vender tilbage til koden.<\/li>\n<li>Bruger-input &#8211; For at g\u00f8re programmet interaktivt.<\/li>\n<li>Import af eksterne\u00a0moduler &#8211; For at f\u00e5 flere funktioner til r\u00e5dighed, kan vi suplere Pythons indbyggede funktioner ved at importere ekstra moduler\/biblioteker\/pakker, der indeholder nye funktioner.<\/li>\n<li>Definere en funktion &#8211; For at samle programmet i en kodeblok, der kan afvikles med et simpelt kald.<\/li>\n<\/ul>\n<p>Her er progamkoden i sin helhed:<\/p>\n<blockquote>\n<pre># -*- coding: cp1252 -*-\n\ndef lix():\nimport re # regular expression modul importeres\n\ntext =\u00a0 raw_input(\"Kopier din tekst ind her:\")\n\n#Antal punktummer beregnes\npktArray = text.split(\".\")\nantalPkt = len(pktArray)-1\n\n#Antal ord beregnes\ntextUdenTegn = re.sub('[\\.,]','',text)\ntextArray = textUdenTegn.split()\nantalOrd = len(textArray)\n\n#Lange ord beregnes\nlangeOrd = 0\nfor i in textArray:\n  if len(i)&gt;6:\n    langeOrd = langeOrd + 1\n\n#LIX beregnes og udskrives\nif antalPkt != 0 and antalOrd != 0:\n  lixtal =\u00a0 antalOrd\/antalPkt + (langeOrd*100)\/antalOrd #LIX = O\/P + (L*100)\/O\n  print \"Lixtal:\",lixtal\n  print \"Antal ord i teksten:\" ,antalOrd\n  print \"Antal punktummer i teksten:\" ,antalPkt\n  print \"Antal langeord i teksten:\", langeOrd\nelse:\n print \"Lixtal kan ikke beregnes\"\n\nlix() #Tilsidst kaldes funktionen igen, s\u00e5 programmet ikke slutter\n\nlix()<\/pre>\n<p><span style=\"color: #999999;\">(<span style=\"color: #ff6600;\">OBS!<\/span> V\u00e6r opm\u00e6rksom p\u00e5 at du ikke kan copy-paste scriptet ind i IDLE. Python er meget f\u00f8lsom overfor forkerte indrykniger. Derudover bruger bloggen &#8220;d\u00e5rlige&#8221; anf\u00f8rselstegn, der \u00f8del\u00e6gger syntaksen.)<\/span>\n<\/p><\/blockquote>\n<p>Samme lille pythonscript, med en smule \u00e6ndret syntaks, s\u00e5 det virker i Python 3:<\/p>\n<blockquote>\n<pre>\n# -*- coding: cp1252 -*-\ndef lix():\n  import re # regular expression modul importeres\n  text = input(\"Kopier din tekst ind her:\")\n\n  #Antal punktummer beregnes\n  pktArray = text.split(\".\")\n  antalPkt = len(pktArray)-1\n\n  #Antal ord beregnes\n  textUdenTegn = re.sub('[\\.,]','',text)\n  textArray = textUdenTegn.split()\n  antalOrd = len(textArray)\n\n  #Lange ord beregnes\n  langeOrd = 0\n  for i in textArray:\n    if len(i)>6:\n      langeOrd = langeOrd + 1\n\n  #LIX beregnes og udskrives\n  if antalPkt != 0 and antalOrd != 0:\n    lixtal =  antalOrd\/antalPkt + (langeOrd*100)\/antalOrd #LIX = O\/P + (L*100)\/O\n    print (\"Lixtal:\",lixtal)\n    print (\"Antal ord i teksten:\" ,antalOrd)\n    print (\"Antal punktummer i teksten:\" ,antalPkt)\n    print (\"Antal langeord i teksten:\", langeOrd)\n  else:\n    print (\"Lixtal kan ikke beregnes\")\n\n  lix() #Tilsidst kaldes funktionen igen, s\u00e5 programmet ikke slutter\n\nlix()\n<\/pre>\n<p><span style=\"color: #999999;\">(<span style=\"color: #ff6600;\">OBS!<\/span> V\u00e6r opm\u00e6rksom p\u00e5 at du ikke kan copy-paste scriptet ind i IDLE. Python er meget f\u00f8lsom overfor forkerte indrykniger. Derudover bruger bloggen &#8220;d\u00e5rlige&#8221; anf\u00f8rselstegn, der \u00f8del\u00e6gger syntaksen.)<\/span><\/p><\/blockquote>\n<h4>De indledende \u00f8velser<\/h4>\n<p>Allerf\u00f8rst s\u00e6ttes en encoding. Bare accepter det forslag som IDLE selv kommer med.<\/p>\n<p>S\u00e5 definerer vi en funktion. Vi kalder den lix(). Det betyder i praksis, at man kan k\u00f8re hele programmet ved at\u00a0 kalde funktionen, alts\u00e5\u00a0ved at skrive\u00a0lix(). Det vil vi benytte os af sidst i programmet.<\/p>\n<p>\u00d8verst i\u00a0vores lix()-funktion\u00a0importerer vi\u00a0et Python modul, der hedder &#8220;re&#8221;.\u00a0&#8220;Re&#8221; st\u00e5r for &#8220;regular expressions&#8221;. Det\u00a0giver os mulighed for at bruge funktioner, der kan h\u00e5ndtere <a title=\"Regul\u00e6re udtryk\" href=\"http:\/\/www.nielsgamborg.dk\/wordpress\/programmering\/regulaere_udtryk_regular_expressions.htm\">regul\u00e6re udtryk<\/a>.<\/p>\n<h4>Tekstinput fra brugeren<\/h4>\n<p>Og s\u00e5 er vi klar for alvor. Det f\u00f8rste er at vi skal have noget\u00a0tekst fra brugeren som vi kan lave beregninger p\u00e5. Til det bruger vi raw_input() funktionen. Brugerens tekst gemmer vi i en variabel, som vi kalder\u00a0&#8220;text&#8221;. Parameteren (det der st\u00e5r inde i parantesen)\u00a0i raw_input()-funktionen bliver skrevet ud p\u00e5 sk\u00e6rmen.<\/p>\n<h4>Antal punktummer beregnes<\/h4>\n<p>Vi bruger Pythons\u00a0indbyggede funktion split(), som deler en streng ved det tegn man sender med som parameter. Vi deler ved et punktum, og de enkelte dele gemmes\u00a0i et array, som vi kalder liste.<\/p>\n<p>Bagefter finder vi l\u00e6ngden p\u00e5 arrayet med den indbyggede funktion len(). Parameteren er navnet p\u00e5 det element vi vil finde l\u00e6ngden p\u00e5. Bem\u00e6rk at vi tr\u00e6kker 1 fra resultatet. Det er fordi, at n\u00e5r vi bruger split til at dele, vil der\u00a0v\u00e6re noget p\u00e5 <strong>begge<\/strong> sider af punktummet. Ogs\u00e5 selvom dette noget er tomt. Dvs. at hvis vi deler p\u00e5 en tekst, der kun indeholder <strong>et<\/strong> punktum, vil der komme to dele (ogs\u00e5 selvom disse to dele er tomme).<\/p>\n<h4>Antal\u00a0ord beregnes<\/h4>\n<p>F\u00f8rst bruger vi funktionen sub(), til at fjerne punktummer og kommaer fra teksten. Det g\u00f8r vi for at undg\u00e5, at de bliver regnet med i ordets l\u00e6ngde. Vi g\u00f8r\u00a0Python fortolkeren\u00a0opm\u00e6rksom p\u00e5 at funktionen findes i det importerede &#8220;re&#8221;-modul, ved at skrive &#8220;re.&#8221; foran funktionen. Parametrene i sub()-funktionen er:<\/p>\n<ol>\n<li>Det <a title=\"Regul\u00e6re udtryk\" href=\"http:\/\/www.nielsgamborg.dk\/wordpress\/programmering\/regulaere_udtryk_regular_expressions.htm\">regul\u00e6re udtryk<\/a>, der skal ledes efter. I vores tilf\u00e6lde punktum og komma<\/li>\n<li>Det som det regul\u00e6re udtryk skal udskiftes med. I vores tilf\u00e6lde ingenting. Det betyder i praksis at tegnen fjernes fra teksten.<\/li>\n<li>Navnet p\u00e5 den variabel, som funktionen skalbruges p\u00e5.<\/li>\n<\/ol>\n<p>Derefter\u00a0 beregner vi\u00a0antallet af ord, p\u00e5 stort set samme m\u00e5de som\u00a0vi beregnede\u00a0punktummerne.\u00a0\u00a0Forskellen er her at funktionen\u00a0 split() default splitter p\u00e5 mellemrum, n\u00e5r der ingen parameter er angivet. Ved at bruge den default split v\u00e6rdi, splitter Python kun p\u00e5 mellemrum <strong>mellem<\/strong> tegn. Ergo slipper vi her at tage h\u00f8jde for eksta mellemrum som kunne komme ind f\u00f8r, efter og inde i teksten.<\/p>\n<h4>Lange ord beregnes<\/h4>\n<p>F\u00f8rst opretter vi variablen &#8220;langeOrd&#8221; og giver den v\u00e6rdien nul.<\/p>\n<p>S\u00e5 l\u00f8ber vi med en\u00a0&#8220;for&#8221;-l\u00f8kke alle elementerne (alts\u00e5 ordene) i listen igennem. For hvert ord unders\u00f8ger vi ordets l\u00e6ngde med len() funktionen. Hvis ordet er l\u00e6ngere end 6 bogstaver l\u00e6gger vi 1 til variablen &#8220;langeOrd&#8221;.<\/p>\n<h4>Lix\u00a0beregnes og udskrives<\/h4>\n<p>F\u00f8rst uders\u00f8ger vi om antallet af ord og punktummer er forskelligt fra nul. Ellers kan beregningen ikke laves, da det ellers vil medf\u00f8re division med nul, hvilket er en matematisk umulighed. Og det vil derfor udl\u00f8se en logisk fejl, og afviklingen af vores Python program vil stoppe.<\/p>\n<p>Derefter laver vi selve Lix beregningen. Intet nyt i det. Python beregner det v.h.a simpel matematik.<\/p>\n<p>S\u00e5 skriver vi resultaterne ud.<\/p>\n<p>Til sidst i den sidste kodeblog kalder vi funktionen igen, s\u00e5 programmet ikke afsluttes, n\u00e5r vores beregning er foretaget.<\/p>\n<p>Aller nederst er ogs\u00e5 et funktions kald. Det er dette funktions kald, der starter hele programmet op.<\/p>\n<h3>Videre med python<\/h3>\n<p>Hvis du vil videre med Python findes der\u00a0flere muligheder. En af de bedste er C H Swaroops gratis online bog: &#8220;<a title=\"Gratis Python bog. A byt of Python\" href=\"http:\/\/www.swaroopch.com\/byteofpython\/\">A Byte of Python<\/a>&#8220;, som er en fremragende bog for begyndere. B\u00e5de begyndere i Python, men ogs\u00e5 begyndere i programmering.<\/p>\n<p>Et dansk alternativ er: &#8220;<a title=\"Python bog dansk. Friheden til at programmere i Python \" href=\"http:\/\/www.linuxbog.dk\/python\/python\/index.html\">Linux &#8211; Friheden til at programmere i Python<\/a>&#8220;. En lidt \u00e6ldre bog (2004), men nogle gange det kan v\u00e6re rart at l\u00e6se p\u00e5 dansk, hvis man er begynder.<\/p>\n<p><a title=\"Python Rocks\" href=\"http:\/\/personalpages.tds.net\/~kent37\/stories\/00020.html\">Python Rocks<\/a> er en kort introduktion, der b\u00e5de fremh\u00e6ver fordele ved Python og giver et kort overblik over simpel Ptyhon programmering.<\/p>\n<p><a title=\"Dive into Python\" href=\"http:\/\/diveintopython.org\/\">Dive into Python<\/a> henvender sig til mere erfarne programm\u00f8rer. Den gratis online bog behandler\u00a0alle aspekter af Python\u00a0programmering.<\/p>\n<p>Endelig kan du ogs\u00e5 kaste dig over den officielle Python tutorial: <a title=\"Officiel Python tutorial.\" href=\"http:\/\/docs.python.org\/tutorial\/\">The Python Tutorial<\/a> fra Python.org.<\/p>\n<p>Hvis du\u00a0 har sp\u00f8rgsm\u00e5l eller synes jeg har sprunget for hurtigt over noget v\u00e6sentligt, s\u00e5 smid endelig en kommentar. S\u00e5 vil jeg pr\u00f8ve at hj\u00e6lpe s\u00e5 godt jeg kan. \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I denne Python\u00a0tutorial vil jeg give en kort introduktion til Python. Tutorialen henvender sig til begyndere i Python, men en\u00a0smule programmeringserfaring fra et andet sprog \u00a0vil nok\u00a0g\u00f8re det lettere at\u00a0f\u00f8lge med. Jeg har udvalgt nogle af de v\u00e6sentligste karakteristika ved\u00a0Python og vil i de forskellige afsnit give korte programmeringseksempler. Til slut\u00a0programmerer vi en\u00a0 lixberegner, der [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[213,276],"_links":{"self":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts\/189"}],"collection":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/comments?post=189"}],"version-history":[{"count":0,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts\/189\/revisions"}],"wp:attachment":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/media?parent=189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/categories?post=189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/tags?post=189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}