är, som Scheme, ett interpreterat språk men det finns kompilatorer för. När man interpreterar ett språk tillhandahåller man en interpretator som läser sats för sats och försöker tolka den. När man kompilerar översätts istället hela programmet till ett ekvivalent program i maskinens eget språk. Vi kommer inte kompilera våra program, men jag ber er lägga skillnaden på minnet. Vi kommer att använda version 3 av, men de vanligaste är (fortfarande) versionerna 2.5-2.7. Det finns program som konverterar mellan de olika versionerna. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 1 / 22
... är ett dynamiskt typat, imperativt språk DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 2 / 22
... är ett dynamiskt typat, imperativt språk Värden har typ (som i Scheme) men variabler har en typ endast om det finns ett värde bundet till variabeln. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 2 / 22
... är ett dynamiskt typat, imperativt språk Värden har typ (som i Scheme) men variabler har en typ endast om det finns ett värde bundet till variabeln. Ett fullständigt (men ganska meningslöst) program: HELLO = "Hej hej!" print (HELLO) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 2 / 22
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.py DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 3 / 22
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.py (.py för att tala om för alla (program) att filen innehåller ett program) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 3 / 22
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.py (.py för att tala om för alla (program) att filen innehåller ett program) För att köra programmet kan man skriva: python3 test.py DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 3 / 22
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.py (.py för att tala om för alla (program) att filen innehåller ett program) För att köra programmet kan man skriva: python3 test.py Man kan, på Unix, Linux och MacOSX börja sitt program med ett direktiv #!/usr/bin/python3 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 3 / 22
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.py (.py för att tala om för alla (program) att filen innehåller ett program) För att köra programmet kan man skriva: python3 test.py Man kan, på Unix, Linux och MacOSX börja sitt program med ett direktiv #!/usr/bin/python3 Då kan man starta programmet med bara namnet på filen (test.py) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 3 / 22
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.py (.py för att tala om för alla (program) att filen innehåller ett program) För att köra programmet kan man skriva: python3 test.py Man kan, på Unix, Linux och MacOSX börja sitt program med ett direktiv #!/usr/bin/python3 Då kan man starta programmet med bara namnet på filen (test.py) Eller möjligen (./test.py) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 3 / 22
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.py (.py för att tala om för alla (program) att filen innehåller ett program) För att köra programmet kan man skriva: python3 test.py Man kan, på Unix, Linux och MacOSX börja sitt program med ett direktiv #!/usr/bin/python3 Då kan man starta programmet med bara namnet på filen (test.py) Eller möjligen (./test.py) Men först måste man göra så att OS:et förstår att filen kan köras som ett program chmod +x test.py DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 3 / 22
... Programmet skrivs i en texteditor, spars på en fil under ett namn t.ex. test.py (.py för att tala om för alla (program) att filen innehåller ett program) För att köra programmet kan man skriva: python3 test.py Man kan, på Unix, Linux och MacOSX börja sitt program med ett direktiv #!/usr/bin/python3 Då kan man starta programmet med bara namnet på filen (test.py) Eller möjligen (./test.py) Men först måste man göra så att OS:et förstår att filen kan köras som ett program chmod +x test.py Då kan man kalla filen vad som helst och utelämna.py DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 3 / 22
... Man kan också använda en python-editor. Det finns flera, en kallas IDLE och levereras med python (var noga med att använda den för python 3 eller python 3.X). En annan, vanligtvis kommersiell som vi har i undervisningsversion, kallad Wing IDE, kan man också använda. Båda kommer att demonstreras ingående. Då kan man editera sina program i ett fönster och få dem utförda i ett annat. Jag kommer använda båda omväxlande men IDLE följer med python vid installationen. Wing IDE är bara en av många integrerade utvecklingsmiljöer för (3). Se länkarna på kurshemsidorna. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 4 / 22
... För att få något (vettigt?) gjort måste man ha med funktioner samt andra satser: def square(x): return x * x print(square(4)) # Funktionshuvud # Funktionskropp, obs! indenteringen # Huvudprogram DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 5 / 22
Inmatning och utmatning # -*- coding: utf-8 -*- # Med ett direktiv som ovan på rad 1 eller 2 # kan man tala om för både editorer och # för vilken teckenkodning man använder def main(): # vanligt att man använder en funktion # som huvudprogram # OBS att input ger en sträng # som måste konverteras till int x = int(input( Mata in ett tal: )) print("kvadraten på", x, "=", square(x)) def square(x): return x * x main() # Funktionshuvud # Funktionskropp # Starta huvudprogrammet DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 6 / 22
Grundläggande typer int (heltal) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 7 / 22
Grundläggande typer int (heltal) float (reella tal) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 7 / 22
Grundläggande typer int (heltal) float (reella tal) bool (sanningsvärden true & false) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 7 / 22
Grundläggande typer int (heltal) float (reella tal) bool (sanningsvärden true & false) chr (tecken ur kodtabellen för UTF-8) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 7 / 22
Grundläggande typer int (heltal) float (reella tal) bool (sanningsvärden true & false) chr (tecken ur kodtabellen för UTF-8) str (teckensträng) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 7 / 22
Grundläggande typer int (heltal) float (reella tal) bool (sanningsvärden true & false) chr (tecken ur kodtabellen för UTF-8) str (teckensträng) list (lista med vad som helst i) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 7 / 22
Grundläggande typer int (heltal) float (reella tal) bool (sanningsvärden true & false) chr (tecken ur kodtabellen för UTF-8) str (teckensträng) list (lista med vad som helst i) dict (dictionary lista med nyckel:värde-par) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 7 / 22
Grundläggande typer int (heltal) float (reella tal) bool (sanningsvärden true & false) chr (tecken ur kodtabellen för UTF-8) str (teckensträng) list (lista med vad som helst i) dict (dictionary lista med nyckel:värde-par) set (mängd oordnad lista utan dubletter) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 7 / 22
Inmatning... x = int(input( Mata in ett tal: )) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 8 / 22
Inmatning... x = int(input( Mata in ett tal: )) läs in ett heltal till vaiabeln x DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 8 / 22
Inmatning... x = int(input( Mata in ett tal: )) läs in ett heltal till vaiabeln x Men egentligen får man en teckensträng som försöker omvandla till ett heltal DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 8 / 22
Inmatning... x = int(input( Mata in ett tal: )) läs in ett heltal till vaiabeln x Men egentligen får man en teckensträng som försöker omvandla till ett heltal Matar man in något annat får man ett fel och programavbrott. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 8 / 22
Inmatning... x = int(input( Mata in ett tal: )) läs in ett heltal till vaiabeln x Men egentligen får man en teckensträng som försöker omvandla till ett heltal Matar man in något annat får man ett fel och programavbrott. xstr = input( Mata in ett tal: ) så hamnar den inmatade strängen i xstr DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 8 / 22
Inmatning... x = int(input( Mata in ett tal: )) läs in ett heltal till vaiabeln x Men egentligen får man en teckensträng som försöker omvandla till ett heltal Matar man in något annat får man ett fel och programavbrott. xstr = input( Mata in ett tal: ) så hamnar den inmatade strängen i xstr Sedan kan inmatningen omvandlas till ett tal med kontroll av att man fått något som kan tolkas som ett tal DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 8 / 22
Inmatning... x = int(input( Mata in ett tal: )) läs in ett heltal till vaiabeln x Men egentligen får man en teckensträng som försöker omvandla till ett heltal Matar man in något annat får man ett fel och programavbrott. xstr = input( Mata in ett tal: ) så hamnar den inmatade strängen i xstr Sedan kan inmatningen omvandlas till ett tal med kontroll av att man fått något som kan tolkas som ett tal men det blir rätt bara om hela inmatningen kan tolkas som den önskade datatypen DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 8 / 22
Inmatning... def main(): # vanligt att man använder en funktion # som huvudprogram xstr = input( Mata in ett tal: ) try: x = int(xstr) except ValueError: print(xstr, "är inte ett tal!") else: print("kvadraten på", x, "=", square(x)) # slut på huvudprogrammet def square(x): return x * x main() # Funktionshuvud # Funktionskropp # Starta huvudprogrammet DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 9 / 22
Utmatning... För så här enkla program duger print utmärkt. Det räcker ganska långt. Man har en hel del möjligheter att formatera utskriften. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 10 / 22
Utmatning... För så här enkla program duger print utmärkt. Det räcker ganska långt. Man har en hel del möjligheter att formatera utskriften. print(xstr, "är inte ett tal!") skriver värdet på xstr och sedan teckensträngen "är inte ett tal!" separerade med en blank. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 10 / 22
Utmatning... För så här enkla program duger print utmärkt. Det räcker ganska långt. Man har en hel del möjligheter att formatera utskriften. print(xstr, "är inte ett tal!") skriver värdet på xstr och sedan teckensträngen "är inte ett tal!" separerade med en blank. Vill vi omge xstr med apostrofer kan vi skriva print(" ", xstr, " är inte ett tal!") men då får vi blanka kring värdet på xstr. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 10 / 22
Utmatning... För så här enkla program duger print utmärkt. Det räcker ganska långt. Man har en hel del möjligheter att formatera utskriften. print(xstr, "är inte ett tal!") skriver värdet på xstr och sedan teckensträngen "är inte ett tal!" separerade med en blank. Vill vi omge xstr med apostrofer kan vi skriva print(" ", xstr, " är inte ett tal!") men då får vi blanka kring värdet på xstr. Vi har flera alternativ för att komma runt det. xstr är av typen str (teckensträng) så man kan använda strängkonkatenering: print(" " + xstr + " är inte ett tal!") DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 10 / 22
Utmatning... För så här enkla program duger print utmärkt. Det räcker ganska långt. Man har en hel del möjligheter att formatera utskriften. print(xstr, "är inte ett tal!") skriver värdet på xstr och sedan teckensträngen "är inte ett tal!" separerade med en blank. Vill vi omge xstr med apostrofer kan vi skriva print(" ", xstr, " är inte ett tal!") men då får vi blanka kring värdet på xstr. Vi har flera alternativ för att komma runt det. xstr är av typen str (teckensträng) så man kan använda strängkonkatenering: print(" " + xstr + " är inte ett tal!") Men man kan också använda formateringsmöjligheterna som print erbjuder: print([object,...], sep=, end= \n, file=sys.stdout) Det finns alltså ett antal parametrar som, om de inte skickas med, får defaultvärde, en egenskap man kan utnyttja i programmeringen. Vi kan sätta sep= för att undertrycka mellanrummen, vi kan se till att radbrytning inte sker, vi kan skriva på en fil. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 10 / 22
OBS Namn måste börja på en bokstav eller understrykningstecken ( ) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 11 / 22
OBS Namn måste börja på en bokstav eller understrykningstecken ( ) (bokstav är alla unicode-tecken som räknas som bokstav i något alfabet) DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 11 / 22
OBS Namn måste börja på en bokstav eller understrykningstecken ( ) (bokstav är alla unicode-tecken som räknas som bokstav i något alfabet) Alltså går det bra med svenska tecken, men editorerna brukar inte hänga med. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 11 / 22
OBS Namn måste börja på en bokstav eller understrykningstecken ( ) (bokstav är alla unicode-tecken som räknas som bokstav i något alfabet) Alltså går det bra med svenska tecken, men editorerna brukar inte hänga med. Man kan ha lokala funktioner i funktioner, precis som i Scheme, och ordningen spelar ingen roll DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 11 / 22
OBS Namn måste börja på en bokstav eller understrykningstecken ( ) (bokstav är alla unicode-tecken som räknas som bokstav i något alfabet) Alltså går det bra med svenska tecken, men editorerna brukar inte hänga med. Man kan ha lokala funktioner i funktioner, precis som i Scheme, och ordningen spelar ingen roll Det finns en mängd reserverade ord False class finally is return None continue for lambda try True def from nonlocal while and del global not with as elif if or yield assert else import pass break except in raise DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 11 / 22
Styrstrukturer Alla tekniker vi använt i Scheme fungerar i men känner inte igen svansrekursion. def fac(n): def iterfac(n, res): if n == 0: return res else: return iterfac(n - 1, n * res) return iterfac(n, 1) try: x = input ("mata in ett heltal: ") n = int(x) except: print(" " + x + " är inte ett heltal!") else: print(fac(n)) Det innebär att programmet kraschar då man gjort för många rekursiva anrop. Gränsen är satt till högst 1000 anrop (totalt i en anropskedja), den kan ändras. DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 12 / 22
Styrstrukturer... Man behöver andra sturstrukturer så att även komplicerade algoritmer kan utföras. Vi avvecklar den inre funktionen och gör res till en lokal variabel men låter huvudprogrammet vara def fac(n): res = 1 # anropsvärdet från iterfac(n, 1) while n > 0: res *= n # samma som res = res * n n -= 1 # n = n - 1 return res DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 13 / 22
Styrstrukturer... Några varianter, kan göra samtidiga tilldelningar i tupler (sekvenser av värden) def fac(n): res = 1 while n > 0: res, n = res * n, n - 1 ## res = res * n och n = n - 1 samtidigt return res DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 14 / 22
Styrstrukturer... Vet man hur många gånger man ska gör något kan man använda for def fac(n): res = 1 for m in range (n): # Låt m gå från 0 till n - 1 res *= (m + 1) return res DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 15 / 22
Styrstrukturer... Eller: def fac(n): res = 1 for m in range (1, n + 1): res *= m return res # Låt m gå från 1 till n DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 16 / 22
Styrstrukturer... Det är vanligt att man börjar med att definiera konstanter, men eftersom inte har begreppet konstant annat än för fördefinierade objekt har man istället konventionen att skriva variable vars värden inte ska ändras med VERSALER. Det är också vanligt att låta huvudprogrammet representeras av en funktion PROMPT = Mata in ett tal: ERRTXT = " är inte ett tal!" def fac(n): res = 1 for m in range (1, n+1): res *= m return res def main(): x = input (PROMPT) n = int(x) print(fac(n)) main() DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 17 / 22
Styrstrukturer... Ordningen spelar ingen roll PROMPT = Mata in ett tal: ERRTXT = " är inte ett tal!" def main(): x = input (PROMPT) n = int(x) print(fac(n)) def fac(n): res = 1 for m in range (1, n+1): res *= m return res main() DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 18 / 22
Köra programfiler som kommandon #!/usr/bin/python3 import sys ERRTXT = " är inte ett tal!" def fac(n): res = 1 for m in range (1, n+1): res *= m return res def main(): try: x = sys.argv[1] n = int(x) except: print("använd./fac6.py <tal>.", " " + x + ERRTXT) else: print(fac(n)) main() DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 19 / 22
Enkel kommandotolk cmds = [ addera, subtrahera, sluta ] ## lista med tillåtna kommandon def main(): cmd = None ## initiera till inget kommando while not cmd: cmd = input( Kommando: ) if cmd in cmds: if cmd == addera : print("kommandot är addera ") elif cmd == subtrahera : print("kommandot är subtrahera ") elif cmd == sluta : print("kommandot är sluta, hejdå!") else: print("det finns inget " + cmd + " -kommando!") main() DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 20 / 22
Enkel kommandotolk... cmds = [ addera, subtrahera, sluta ] cmd = None count = 0 # felräknare while cmd!= sluta : cmd = input( Kommando: ) if cmd in cmds: if cmd == addera : print("kommandot är addera ") elif cmd == subtrahera : print("kommandot är subtrahera ") elif cmd == sluta : print("kommandot är sluta, hejdå!") elif count >= 2: print("efter 3 ogilitga kommandon avslutas programmet") cmd = sluta else: print("det finns inget " + cmd + " -kommando!") count += 1 DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 21 / 22
Enkel kommandotolk... cmd = None count = 0 # felräknare while cmd!= sluta : cmd = input( Kommando: ) if cmd == addera : print("kommandot är addera ") count = 0 elif cmd == subtrahera : print("kommandot är subtrahera ") count = 0 elif cmd == sluta : print("kommandot är sluta, hejdå!") count = 0 elif count < 2: print("det finns inget " + cmd + " -kommando!") count += 1 else: print("efter 3 ogilitga kommandon avslutas programmet") cmd = sluta DA2001 (Föreläsning 10) Datalogi 1 Hösten 2011 22 / 22