Niels Gamborgs online notesbog

Python tutorial. En intro til Python for begyndere.

juli 29th, 2008. Kategori: Programmering

I denne Python tutorial vil jeg give en kort introduktion til Python. Tutorialen henvender sig til begyndere i Python, men en smule programmeringserfaring fra et andet sprog  vil nok gøre det lettere at følge med.

Jeg har udvalgt nogle af de væsentligste karakteristika ved Python og vil i de forskellige afsnit give korte programmeringseksempler. Til slut programmerer vi en  lixberegner, der vil anskueliggøre de gennemgåede emner, samt tilføje et par nye vigtige detaljer om Python.

Start med Python

Du kan downloade den seneste Python version fra Python.org. Sammen med Python bliver IDLE installeret. IDLE er en lille grafisk brugergrænseflade, du kan bruge til at skrive og afvikle dine Python programmer i. IDLE bruger syntaks highlighning, som gør det lettere at overskue koden og opdage eventuelle syntaks fejl.

Ã…ben IDLE og skriv:

print “Hello world”

OBS. Fra Python 3.0 er print blevet en funktion. Det betyder at syntaksen ved print nu er:

print (“Hello world”)

(OBS! Sidst i blogindlægget kan du finde en lixberegner skrevet i både Python 2 og Python 3. Find selv alle forskellene! )

Python vil nu udføre programmet. I dette tilfælde vil Python skrive “Hello world” pÃ¥ skærmen.

Ã…ben bagefter et nyt vindue i IDLE,  skrive ovenstÃ¥ende kode igen og gem det som F.eks. “hello.py”. SÃ¥ kan du vælge at køre programmet ved at taste “F5″eller vælge “Run module” fra menuen. Denne sidste metode er selvfølgelig den mest hensigtsmæssige, da du her gemmer dine Python programmer.

OBS. IDLE kan give problemer, når man afvikler den under Windows. Læs her hvordan du løser Problemer med IDLE.

Syntaks i Python

Pythons syntaks er meget brugervenlig og logisk. Den er simpel, minimalistisk og blottet for unødige tegn, hvilket gør den let at overskue og lære. Både for erfarne programmører og begyndere.

Et af de bærende 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å ikke kan se, hvilke kodeblokke, der hører sammen.

Det kan lyde som en begrænsning, men fordelen er, at man slipper for at holde styr på parenteser og semikolonner. En ordentlig programmør laver under alle omstændigheder de korrekte indrykninger, så det eneste det kræver er en lidt mere grundig struktur i ens arbejde i starten. For begynderen vil dette arbejde med indrykninger give en fordel, når han senere vil lære andre programmeringssprog.

x = 3
if x == 3:
  print "x er lig med 3"
else:
  print "x er forskellig fra 3"

Kontrolstrukturer i Python

Pythons kontrolstrukturer fungerer som kontrolstrukturerne i andre sprog. Hovedforskellen er en let ændret syntaks. F.eks. skriver man i Python “elif” i stedet for “else if”. En anden væsentlig forskel er sammenligningsoperatorerne “og” og “eller”. De hedder ganske simpelt “and”  og “or”.

x = 3
y = 2
if x == 3 and y == 2:
  print "x er lig med 3, og y er lig med 2"
elif x == 3 and y != 2:
  print "x er lig med 3, og y er forskellig fra 2"
elif x !=3  and y == 2:
  print "x er forskellig fra 3, og y er lig med 2"
else:
  print "x er forskellig fra 3, og y er forskellig fra 2"

Løkker i Python

“For” løkker fungerer en smule anderledes i Python end vi er vant til fra f.eks. JavaScript, PHP eller Java.  “For løkken fungerer nærmere som en “foreach” løkke. Hvis vi opretter et array, som vi kalder liste kan vi gennemløbe alle elementerne i listen pÃ¥ følgende mÃ¥de:

liste = ("Python", "PHP", "JavaScript")
for i in liste:
  print liste(i)

Programmet vil udskrive elementerne i listen et af gangen.

En anden mÃ¥de at bruge “for” løkker pÃ¥ i Python er gennem den indbyggede “range” funktion:

for i in range(1,10):
  print i

OvenstÃ¥ende vil skrive tallene 1-9. Default intervallet i “range”-funktionen er 1. Hvis vi ønsker et andet interval skriver vi istedet:

for i in range(1,10,2):
  print i

Denne programstupm vil istedet udskrive: 1, 3, 5, 7, og 9.

I Python kan man ogsÃ¥ bruge “while løkker”. De fungerer som i de fleste andre programmeringssprog.

En lixberegner i Python

Som et eksempel på et lidt mere avanceret program, vil vi nu programmere en meget simpel lixtalsberegner (læs om lix og lixtal).

Udover det vi har gennemgået til nu, vil vi i lixberegneren også bruge:

  • Kommentarertegn (havelÃ¥ge/hash/#) – SÃ¥ kan vi kommentere direkte i koden. Det gør det lettere at bevare overblikket, nÃ¥r andre skal se din kode eller du senere vender tilbage til koden.
  • Bruger-input – For at gøre programmet interaktivt.
  • Import af eksterne moduler – For at fÃ¥ flere funktioner til rÃ¥dighed, kan vi suplere Pythons indbyggede funktioner ved at importere ekstra moduler/biblioteker/pakker, der indeholder nye funktioner.
  • Definere en funktion – For at samle programmet i en kodeblok, der kan afvikles med et simpelt kald.

Her er progamkoden i sin helhed:

# -*- coding: cp1252 -*-

def lix():
import re # regular expression modul importeres

text =  raw_input("Kopier din tekst ind her:")

#Antal punktummer beregnes
pktArray = text.split(".")
antalPkt = len(pktArray)-1

#Antal ord beregnes
textUdenTegn = re.sub('[\.,]','',text)
textArray = textUdenTegn.split()
antalOrd = len(textArray)

#Lange ord beregnes
langeOrd = 0
for i in textArray:
  if len(i)>6:
    langeOrd = langeOrd + 1

#LIX beregnes og udskrives
if antalPkt != 0 and antalOrd != 0:
  lixtal =  antalOrd/antalPkt + (langeOrd*100)/antalOrd #LIX = O/P + (L*100)/O
  print "Lixtal:",lixtal
  print "Antal ord i teksten:" ,antalOrd
  print "Antal punktummer i teksten:" ,antalPkt
  print "Antal langeord i teksten:", langeOrd
else:
 print "Lixtal kan ikke beregnes"

lix() #Tilsidst kaldes funktionen igen, så programmet ikke slutter

lix()

(OBS! Vær opmærksom pÃ¥ at du ikke kan copy-paste scriptet ind i IDLE. Python er meget følsom overfor forkerte indrykniger. Derudover bruger bloggen “dÃ¥rlige” anførselstegn, der ødelægger syntaksen.)

Samme lille pythonscript, med en smule ændret syntaks, så det virker i Python 3:

# -*- coding: cp1252 -*-
def lix():
  import re # regular expression modul importeres
  text = input("Kopier din tekst ind her:")

  #Antal punktummer beregnes
  pktArray = text.split(".")
  antalPkt = len(pktArray)-1

  #Antal ord beregnes
  textUdenTegn = re.sub('[\.,]','',text)
  textArray = textUdenTegn.split()
  antalOrd = len(textArray)

  #Lange ord beregnes
  langeOrd = 0
  for i in textArray:
    if len(i)>6:
      langeOrd = langeOrd + 1

  #LIX beregnes og udskrives
  if antalPkt != 0 and antalOrd != 0:
    lixtal =  antalOrd/antalPkt + (langeOrd*100)/antalOrd #LIX = O/P + (L*100)/O
    print ("Lixtal:",lixtal)
    print ("Antal ord i teksten:" ,antalOrd)
    print ("Antal punktummer i teksten:" ,antalPkt)
    print ("Antal langeord i teksten:", langeOrd)
  else:
    print ("Lixtal kan ikke beregnes")

  lix() #Tilsidst kaldes funktionen igen, så programmet ikke slutter

lix()

(OBS! Vær opmærksom pÃ¥ at du ikke kan copy-paste scriptet ind i IDLE. Python er meget følsom overfor forkerte indrykniger. Derudover bruger bloggen “dÃ¥rlige” anførselstegn, der ødelægger syntaksen.)

De indledende øvelser

Allerførst sættes en encoding. Bare accepter det forslag som IDLE selv kommer med.

Så definerer vi en funktion. Vi kalder den lix(). Det betyder i praksis, at man kan køre hele programmet ved at  kalde funktionen, altså ved at skrive lix(). Det vil vi benytte os af sidst i programmet.

Øverst i vores lix()-funktion importerer vi et Python modul, der hedder “re”. “Re” stÃ¥r for “regular expressions”. Det giver os mulighed for at bruge funktioner, der kan hÃ¥ndtere regulære udtryk.

Tekstinput fra brugeren

Og sÃ¥ er vi klar for alvor. Det første er at vi skal have noget tekst fra brugeren som vi kan lave beregninger pÃ¥. Til det bruger vi raw_input() funktionen. Brugerens tekst gemmer vi i en variabel, som vi kalder “text”. Parameteren (det der stÃ¥r inde i parantesen) i raw_input()-funktionen bliver skrevet ud pÃ¥ skærmen.

Antal punktummer beregnes

Vi bruger Pythons indbyggede funktion split(), som deler en streng ved det tegn man sender med som parameter. Vi deler ved et punktum, og de enkelte dele gemmes i et array, som vi kalder liste.

Bagefter finder vi længden på arrayet med den indbyggede funktion len(). Parameteren er navnet på det element vi vil finde længden på. Bemærk at vi trækker 1 fra resultatet. Det er fordi, at når vi bruger split til at dele, vil der være noget på begge sider af punktummet. Også selvom dette noget er tomt. Dvs. at hvis vi deler på en tekst, der kun indeholder et punktum, vil der komme to dele (også selvom disse to dele er tomme).

Antal ord beregnes

Først bruger vi funktionen sub(), til at fjerne punktummer og kommaer fra teksten. Det gør vi for at undgÃ¥, at de bliver regnet med i ordets længde. Vi gør Python fortolkeren opmærksom pÃ¥ at funktionen findes i det importerede “re”-modul, ved at skrive “re.” foran funktionen. Parametrene i sub()-funktionen er:

  1. Det regulære udtryk, der skal ledes efter. I vores tilfælde punktum og komma
  2. Det som det regulære udtryk skal udskiftes med. I vores tilfælde ingenting. Det betyder i praksis at tegnen fjernes fra teksten.
  3. Navnet på den variabel, som funktionen skalbruges på.

Derefter  beregner vi antallet af ord, på stort set samme måde som vi beregnede punktummerne.  Forskellen er her at funktionen  split() default splitter på mellemrum, når der ingen parameter er angivet. Ved at bruge den default split værdi, splitter Python kun på mellemrum mellem tegn. Ergo slipper vi her at tage højde for eksta mellemrum som kunne komme ind før, efter og inde i teksten.

Lange ord beregnes

Først opretter vi variablen “langeOrd” og giver den værdien nul.

SÃ¥ løber vi med en “for”-løkke alle elementerne (altsÃ¥ ordene) i listen igennem. For hvert ord undersøger vi ordets længde med len() funktionen. Hvis ordet er længere end 6 bogstaver lægger vi 1 til variablen “langeOrd”.

Lix beregnes og udskrives

Først udersøger vi om antallet af ord og punktummer er forskelligt fra nul. Ellers kan beregningen ikke laves, da det ellers vil medføre division med nul, hvilket er en matematisk umulighed. Og det vil derfor udløse en logisk fejl, og afviklingen af vores Python program vil stoppe.

Derefter laver vi selve Lix beregningen. Intet nyt i det. Python beregner det v.h.a simpel matematik.

SÃ¥ skriver vi resultaterne ud.

Til sidst i den sidste kodeblog kalder vi funktionen igen, så programmet ikke afsluttes, når vores beregning er foretaget.

Aller nederst er også et funktions kald. Det er dette funktions kald, der starter hele programmet op.

Videre med python

Hvis du vil videre med Python findes der flere muligheder. En af de bedste er C H Swaroops gratis online bog: “A Byte of Python“, som er en fremragende bog for begyndere. BÃ¥de begyndere i Python, men ogsÃ¥ begyndere i programmering.

Et dansk alternativ er: “Linux – Friheden til at programmere i Python“. En lidt ældre bog (2004), men nogle gange det kan være rart at læse pÃ¥ dansk, hvis man er begynder.

Python Rocks er en kort introduktion, der både fremhæver fordele ved Python og giver et kort overblik over simpel Ptyhon programmering.

Dive into Python henvender sig til mere erfarne programmører. Den gratis online bog behandler alle aspekter af Python programmering.

Endelig kan du også kaste dig over den officielle Python tutorial: The Python Tutorial fra Python.org.

Hvis du  har spørgsmÃ¥l eller synes jeg har sprunget for hurtigt over noget væsentligt, sÃ¥ smid endelig en kommentar. SÃ¥ vil jeg prøve at hjælpe sÃ¥ godt jeg kan. 🙂

  1. 35 Responses to “Python tutorial. En intro til Python for begyndere.”

  2. By priisholm on aug 7, 2008

    Fin artikel! 🙂

    Endnu et par gode online ressourcer:

    Dive Into Python: http://diveintopython.org/ – en rigtig udmærket bog for de lidt mere programmerings-erfarne, her gratis tilgængelig pÃ¥ nettet.
    The Django Book: http://www.djangobook.com/ – om det efterhÃ¥nden temmelig populære Python web application framework Django, “fra hestens mule” sÃ¥ at sige; ogsÃ¥ en “rigtig” bog gratis tilgængelig online.

    #priisholm

  3. By Niels on aug 7, 2008

    Mange tak for det priisholm. 🙂

    Har lige kort bladret begge python bøger igennem. Det ligner nogle super python ressourcer.

    En af de meget sympatiske forhold omkring python er netop, at man kan finde så fremragende ressourcer gratis.

  4. By Johannes on aug 18, 2008

    Jeg forstår det ikke.

  5. By Niels on aug 18, 2008

    Hej Johannes

    Kunne du være lidt mere konkret. Er det python du ikke forstår, er det tutorialen eller er det programmering i al almindelighed?

  6. By Thomas on okt 4, 2008

    Fin tutorial. Du har dog lavet en lille fejl i if eksemplet. Der står 3 et par steder i print i stedet for 2.

  7. By Niels on okt 4, 2008

    Tak for det, Thomas.

    Fejlen er rettet. 🙂

  8. By Søren on jan 11, 2009

    Hej Niels

    jeg er uddannet web-inteagrator, så kender til php i for vejen som skulle minde lidt om python.
    Jeg vil gerne lærer python, og har kigget lidt rundt pÃ¥ nettet, men det eneste sted jeg umiddelbart kunne finde, hvor de beskrev det helt ned til der hvor man skal skrive koden altsÃ¥ f.eks. IDLE det er dejligt at se, var hos dig 😀 men jeg er mÃ¥ske lidt en nød, for kan ikke finde den?? er det python.exe i C:\Python30\ ??

    Hilsen Søren C. H. Rasmussen

    p.s. hÃ¥ber stadigvæk du kommentere pÃ¥ denne artikle 😀

  9. By Niels on jan 11, 2009

    Hej Søren.

    Hos mig ligger IDLE i: C:\Python25\Lib\idlelib\idle.py

    Jeg ved ikke, om det er det samme i Python 3.0. Har ikke leget med Python siden de udgav 3.0

  10. By Søren on jan 11, 2009

    okay.. mange tak fandt det.. hehe
    men får denne fejl
    >>> print “Hello world”
    SyntaxError: invalid character in identifier (, line 1)

    og

    >>> print “hello world”
    SyntaxError: invalid syntax (, line 1)
    >>>
    det skal mÃ¥ske lige siges jeg bare har Ã¥bnet det, og sÃ¥ skrev jeg det i den hvide “terminal”

  11. By Niels on jan 11, 2009

    hmm. Du har vel ikke kopieret teksten ind fra bloggen. Det give invalide anførselstegn.

    Ellers pas på med hvidtegn som tab og mellemrum foran koden, da de jo er del af syntaksen.

    Ellers har jeg ikke lige se andre muligheder for fejl. Det skulle virke. 😉

    Highlighter IDLE evt. din syntaksfejl?

  12. By Søren on jan 11, 2009

    prøver lige at beskrive hvordan det ser ud..

    print “hello world”
    SyntaxError: invalid syntax (, line 1)

    print står med lilla
    “hello world” stÃ¥r med grønt
    i samme linje som print “hello world” kommer efter “hello world” er det markeret med rødt, altsÃ¥ bg farven (som om der er melllemrum hele vejen)..
    altsÃ¥ som de ville se ud i html: print “hello world”

    hvis du forstår hvad jeg mener?

  13. By Søren on jan 11, 2009

    how.. den skrev ikke html koderne…

    anførsels tegnen er dem som der kommer når man trykker på shift + 2

  14. By Niels on jan 12, 2009

    Hej igen Søren.

    Jeg har lige installeret Python 3.0 og får nu samme fejl som dig.

    Hvilket minder mig om at Python syntaksen i 3.0 er ændret på en række områder i forhold til de tidligere Python udgaver.

    Det betyder bla. at print statementet er blevet ændret til en print funktion. Dvs den nye syntaks er:

    print(“Hello world”)

    Ganske som vi kender det fra PHP. 😉

    Hvad er nyt i Python 3.0

  15. By Søren on jan 12, 2009

    okay lyder super hehe, ej der er dog en ; til sidst i php hehe.. men ellers ja 😀

    fanme godt du yder support hehe..
    er det sådan at man kan lave en fil ved navn test.py og så trække den ind i og så kører den scriptet?

  16. By Søren on jan 12, 2009

    sorry fandt ud af det 😀 kunne ogsÃ¥ bare have læst lidt videre hehe

  17. By Hans on sep 26, 2009

    Hej Niels
    Mon du stadigvæk svarer på indlæg her? Jeg håber det.
    Er ved at stifte et allerførste bekendtskab med Python og prøvede derfor at indtaste og afvikle lix koden i din udmærkede artikel. Når jeg trykker på Run, Run module får jeg meddelelse om en Syntax error (There is an error in you program: EOL while scanning string literal)og cursoren placeres ved slutparentesen i:
    textUdenTegn = re.sub(‘[\.,]’,”,text)

    En anden ting. Jeg har læst at korrekt indrykning er afgørende. Når jeg indtaster de to gange lix() (sidste to linjer) så kommer de med samme indrykning. Er det et problem?

    Hans

  18. By Niels on sep 26, 2009

    Hej Hans. Jeg har lige tjekket sciptet (godt nok i python 2.5, men tror ikke det er det der er dit problem), og det virker fint ved mig.

    OBS: hvis du bruger python 3 er der enkelte små syntaks ændringer. Se kommentar nr 13

    Jeg gjorde følgende. Kopierede scriptet ind i notes blok. Erstattede samtlige ” og ‘ med nye ‘ (wordpress formaterer dem sÃ¥ de giver syntaks fejl). Derefter Ã¥bnede jeg idle, Ã¥bnede et nyt vindue, pastede det tilrettede script ind, gemte det og afviklede det bagefter. Det virkede helt efter hensigten.

    Bemærk at i linjen, hvor du får fejlen, er der 4 apostrofer. De 2 første omkring firkant parenteserne, de 2 sidste omkring ingenting.

    Endvidere er indrykningen ved de 2 gange lix() VIGTIG. Den øverste lix() kalder funktionen igen INDE fra funktionen selv. Den nederste starter funktionen første gang, hvorfor den også er i det yderste niveau af indrykninger (altså ikke rykket ind).

  19. By Hans on sep 26, 2009

    Hej igen Niels
    Tak for hurtigt svar.
    Ja min nybegynderstatus fornægter sig ikke :-). Jeg havde tast et dobbelt anførselstegn i stdet for to enkelte (omkring ingenting). Jeg tror det var forklaringen pÃ¥ den del. Men jeg mÃ¥ vist studere noget mere om indrykning for nÃ¥r jeg har rettet ovennævnte, gemt og trykket pÃ¥ Run sÃ¥ fÃ¥r jeg noget med “unexpected indent”. Skal man selv styre det der indent?

    Hans

  20. By Niels on sep 27, 2009

    Jep. Indrykninger skal styres med hård hånd, da det er pythons måde at afgøre hvilke blokken koden hører til. Det kan være svært i starten til gengæld slipper man for alle tuborgparenteserne til at holde styr på kodeblokkene.

    Mit råd er simpelthen at starte med små enkle scripts, der er lette at overskue. Så kommer forståelsen for indrykninger hurtigt.

  21. By Hans on sep 27, 2009

    Point taken.
    Det er faktisk ret sjovt det her.
    Hans

  22. By Peder Worning on maj 6, 2011

    Jeg leder efter en python tutorial på dansk, og jeg synes, denne her ser lovende ud, men hvorfor vises der ikke indrykninger i eksemplerne, alt står helt til venstre, det virker meget upædagogisk. Jeg har prøvet både med Explorer og Firefox.

    Venlig hilsen
    Peder

  23. By Niels on maj 6, 2011

    Hej Peder. Tak for feedback.

    Nu har jeg flere gange pointeret, hvor vigtig del af syntaksen i Python, som indrykningerne er, så naturligvis har du ret. De skal selvfølgelig med.

    Det er desværre en fejl. Indrykningerne er forsvundet en af mine seneste opdateringer. Nu skulle de gerne være pÃ¥ plads igen. 🙂

  24. By Morten M on mar 19, 2013

    Tak for en god intro. Python er vist rimelig hot.

    Ved du om der findes et “idle” til mac?

  25. By Jonas on jun 26, 2013

    Nu ved jeg godt det indlæg her er lettere.. gammelt, men jeg har siddet og kigget det igennem alligevel, da jeg forsøge at lære lidt Python. Jeg skrev den lix beregner kode ind som den stod, med rigtige indryk osv, men fik alligevel en fejl. Jeg fÃ¥r en fejlmelding med “expected an indented block”, hvorefter import delen bliver rød. Er Python ændret siden sidst sÃ¥ den ikke reagere pÃ¥ den kode længere eller er det en fejl 40 fra min side?

    Vh Jonas.

  26. By Niels on jun 26, 2013

    Hej Jonas

    Jeg har opdateret blogindlægget, sÃ¥ det nu ogsÃ¥ indeholder en lix-beregner, der kører i python 3.x. Udover indrykning er der ogsÃ¥ ændringer med print, som nævnt i indlægget, og “raw_input”, der er blevet ændre til “input” i de nyeste Python-versioner.

  27. By sofus on jun 26, 2013

    hej niels jeg har et problem. jeg kan ikke skrive w eller W i mine idle shells.

  28. By Jonas on jun 26, 2013

    Fedt, sÃ¥ var det alligevel ikke en fejl 40 fra min side af. Tusind tak 🙂

  29. By Niels on jun 26, 2013

    Hej sofus.

    Jeg har aldrig oplevet noget lignende, og har heller ikke rigtig nogen gode teorier, så jeg kan desværre ikke hjælpe dig.

    @Jonas. Velbekomme. 🙂

  30. By Jan on sep 8, 2013

    God guide!

    Jeg har længe godt kunne tænke mig at lære Python, men det falder som regel for andre prioriteter, men med din guide kan jeg måske få sparket det igang.

    Tak for det!

  31. By MasterEs on sep 12, 2013

    Hey,

    Fantastisk guide!

    Men efter jeg har indtastet det hele og skal til og Run modul skriver den:
    EOL While scanning string literal? kan du forklar det?:)

    /MasterEs

  32. By Niels on sep 12, 2013

    Det lyder som om du f.eks. ikke har fået afsluttet en af strengene med et korrekt anførselstegn. Se f.eks her:

    http://discover.cs.ucsb.edu/commonerrors/error/1010.xml

    Error: SyntaxError: EOL while scanning string literal

    “EOL” stands for “end of line”. An EOL error means that Python hit the end of a line while going through a string. This can be because you forgot ending quotes, or because you tried to make a string extend past one line. Strings enclosed in single or double quotes can’t span multiple lines.

  33. By Stefan on okt 18, 2014

    Dit eksempel på (Løkker i Python)

    liste = (“Python”, “PHP”, “JavaScript”)
    for i in liste:
    print liste(i)
    skal rettest til:

    liste = (“Python”, “PHP”, “JavaScript”)
    for i in liste:
    print i

    🙂

  34. By Niels on okt 20, 2014

    Tak for input. 🙂

    Jeg har ikke leget med Python siden sidste jeg opdaterede indlægget. Er python blevet opdateret eller er det bare en smartere måde at gøre det på?

  1. 2 Trackback(s)

  2. aug 2, 2008: Problemer med Python editor IDLE — Blog om webudvikling
  3. feb 16, 2015: Tutorial til Python - på dansk - Programmering og innovation i skolen | Kodning i skolen

Skriv en kommentar