Strengbehandling og enkle beregninger
Transcription
Strengbehandling og enkle beregninger
Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag Strengbehandling og enkle beregninger Claus Schive Lærestoffet er utviklet for faget IFUD1050 Programmering med Python Man har mulighet til å gjøre mange ting med tekststrenger. De viktigste metodene i Python er beskrevet i leksjonen. Programmeringsspråket gir også meget gode muligheter til å formattering av tekst og utskrift og har flere metoder til å operere på lister. Betingede kontrollstrukturer og løkker brukes også i Python for å ta beslutninger for å utføre situasjonsbetingede handlinger og gå igjennom sekvenser av data. Math-modulen i python gir flere avanserte mattefunksjoner(kvadratrot, cosinus, sinus) som ikke er med fra standard. 1. TEKSTSTRENGER– GRUNNLEGGENDE STRENGOPERASJONER ............................................. 2 2. TESTING, SØKING OG MANIPULERING AV TEKSTSTRENGER ................................................ 3 3. FORMATTERING.................................................................................................................................. 5 4. BETINGEDE KONTROLLSTRUKTURER.......................................................................................... 7 5. LØKKER................................................................................................................................................. 8 6. LISTEMETODER OG NOEN INNEBYGDE FUNKSJONER ............................................................ 9 7. MER OM FUNKSJONER .................................................................................................................... 11 8. BRUK AV MODULENE MATH OG RANDOM ................................................................................. 13 9. NUMPY OG SCIPY ............................................................................................................................. 15 Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 2 av 15 1. Tekststrenger – grunnleggende strengoperasjoner Man har mulighet til å gjøre mange ting med tekststrenger. De viktigste metodene er beskrevet i her. Tekststrenger er sekvenser, og mange av funksjonene/metodene tilsvarer de for lister og tupler. På samme måte som for lister, kan man få ut deler av strengen ved å bruke indeks og skiving (slice). Strenger i Python er såkalt "immutable", noe som gjør at når den først er opprettet så kan du egentlig ikke endre på den. Men istedenfor må du opprette nye strenger, basert på den originale. Konkatinering av strenger Konkatinering er å sette sammen to strenger til en. Man kan bruke operatoren + . Nedenfor følger noen eksempler på konkatinering: navn = fornavn + etternavn evt. += hvis du har en variabel hvor du samler opp tekst F.eks. setning += nytt_ord Hvis du skal sette et tall inn i en streng kan man bruke str( ) -funksjonen som konverterer tall til tekst F.eks. respons = ’Du har ’ + str(saldo) + ’kroner på kontoen’ Slicing av strenger I Python , er en " slice " en undergruppe av en liste eller en streng variabel som man får ved å definere en start og /eller slutt indeks på variable og returnere verdiene innenfor dette området. Den returnerte undergruppe omfatter start indeksverdien , men ikke sluttverdien. Man kan bruke slice metoden på flere ulike datatyper , tall og lister. For å bruke slice metoden, må du først opprette og initialisere en variabel å skjære. Deretter brukes hakeparenteser for å indikere enten en posisjon til å starte slicing , avslutte slicing, eller begge deler. I eksempelet " testen [ 03:05 ] " for å skjære en variabel kalt " testen ", starter man på den tredje posisjonen og ender på indeksen før den femte posisjon . Man kan også skrive " testen [ 3 : ] " for å skjære i den tredje posisjonen og returnere alt etterpå , eller skrive " testen [ : 5 ] " for å returnere alt opp til femte posisjon. Man kan bruke slice metoden på flere ulike typer data og få forskjellige resultater . For eksempel , hvis du har en streng variabel " alph " som inneholder bokstavene i alfabetet i rekkefølge, skrive " alph [ 01:05 ] " returnerer delstrengen ' BCDE . ' Hvis du har en liste over strenger eller heltall kalt " lst , " skrive " lst [ 01:03 ] "så returnerer den andre og tredje element i listen . Her følger flere eksempler på hva man kan gjøre med tekststrenger: #Strengoperasjoner - noen eksempler tekst = 'Hallo' print tekst # Gir 'Hallo' # Setter sammen to strenger print tekst + 'verden' #Gir Halloverden Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 3 av 15 # En annen måte å sette sammen to strenger. Kommaet gir et ekstra mellomrom. print tekst, 'verden' #Gir Hallo verden # Når man skal sette sammen en streng og et tall, NB! sett str() rundt tallet. print tekst + str(10) # Hvis du skal sette sammen en streng og et tall, husk å sette str() rundt tallet. # Skriver ut lengden til strengen. print len(tekst) #Gir 5 #På samme måte som for lister, kan man få ut deler av strengen ved å bruke indeks og skiving (slice). tekst= 'Dette er en test' tekst[0] # Gir 'D' tekst[14] # Gir 's' #For å få tilgang til enkelttegn i en streng ved bruk av for løkke month = 'August' month[3] #Gir u for character in month: print (character)#Gir August-skrevet ut loddrett med et tegn på hver linje 2. Testing, søking og manipulering av tekststrenger Strenger har mange metoder. Noen av dem er svært nyttig (for eksempel del og join), mens andre blir brukt sjeldnere (for eksempel istitle eller capitalize). Fordi det er så mange metoder, er det bare noen av de mest nyttige som er beskrevet her. For full referanse, se vedlegg B i læreboken eller dokumentasjonen på https://docs.python.org/2/ for flere detaljer. lower Denne metoden returnerer en versjon av strengen i små bokstaver. Dette kan være nyttig hvis man ønsker å skrive kode som er "case-insensitiv" -dvs kode som ignorerer forskjellen mellom store og små bokstaver. For eksempel, hvis man ønsker å sjekke om et brukernavn er funnet i en liste. 'Trondheim Symfoni Orkester'.lower() orkester' #Gir 'trondheim symfoni if 'Ole' in ['anders', 'ole', 'per']: print 'Fant navnet!' #Finner ikke navnet Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 4 av 15 En løsning på dette er å konvertere alle navnene til små bokstaver både når du lagrer og søker. Koden vil se omtrent slik ut: name = 'Ole' names = ['anders', 'ole', 'per'] if name.lower() in names: print 'Fant navnet!' #Gir Fant navnet strip Metoden returnerer en streng hvor mellomrom på venstre og høyre (men ikke internt) har blitt strippet (fjernet). Strip kan være nyttig når man sammenligner input med lagrede verdier. Strip kan kun utføres i endene, så de interne tegnene kan ikke fjernes. Nedenfor følger noen eksempler på hvordan metoden kan brukes: names = ['Anders', 'Ole', 'Per'] name = 'Ole' if name.strip() in names: print 'Fant det!' #Gir Fant det Strip kan kun utføres i endene, så her fjernes ikke de interne tegnene: '*** SPAM * for * everyone!!! ***'.strip(' *!') #Gir 'SPAM * for * everyone' replace Denne metoden returnerer en streng hvor alle forekomster av én streng er erstattet av en annen. Metodens styrke ligger i at det kan utføre flere utskiftninger samtidig. 'Der er en test'.replace('er', 'var') #Gir Dvar var en test join Joiner en svært viktig streng metode. Join er det motsatte av split, og brukes til å få med elementene i en sekvens. Som man kan se, må de sekvenselementer som skal settes sammen alle være strenger : sep = '+' seq = ['1', '2', '3', '4', '5'] print sep.join(seq) # Gir 1+2+3+4+5 dirs = ' ', 'usr', 'bin', 'env' print 'C:' + '\\'.join(dirs) #Gir C:\usr\bin\env Å splitte opp en streng En meget viktig streng metode er split som er det motsatte av join. Den brukes til å dele en streng i en sekvens. Merk at hvis man ikke har noen skilletegn å sende som argument til metoden split, er standard å splitte på alle kjøringer av sammenhengende blanke tegn Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 5 av 15 (mellomrom, tabulator, linjeskift, og så videre). Nedenfor følger noen eksempler på hvordan metoden kan brukes: '1+2+3+4+5'.split('+') #Gir ['1', '2', '3', '4', '5'] '/usr/bin/env'.split('/') 'Using the #Gir ['', 'usr', 'bin', 'env'] default'.split() #Gir ['Using', 'the', 'default'] 3. Formattering I Python brukes % operatør til å formatere tekststrenger. Man kaller format% verdier, der formatet er en streng, og verdier er en eller flere verdier. Tegnet % markerer begynnelsen av konverteringen. Videre har man konverteringsflagg (valgfrie). Disse kan være enten være - (minustegn) som angir venstre justering innen feltet + (plusstegn) som betyr skriv alltid tegn (+ eller −) 0 (null) som betyr fyll med nuller i stedet for mellomrom Feltets bredde er antall tegn som skal brukes, inkludert de som går til å skrive et minustegn ("-") ,("."), desimaltegn etc. Etter at feltet er formatert, fylles det ut med mellomrom ("␣") eller nuller ("0"). Minimum feltbredde er valgfritt. Den konverterte strengen vil være minst dette bred. Disse to parametere er to heltall hvor bredde er først, deretter presisjon, adskilt med en . (punktum). Begge er valgfritt, men hvis du ønsker å ha bare presisjonen, må du også inkludere . (punktum). Presisjonen er antall sifre etter desimaltegnet, 2 eller (for tekststrengen) maksimalt antall tegn som skal tas fra strengen. Før bredde- og presisjons tall, kan du sette et "flagg", som enten kan være null, pluss, minus, eller blank. Her følger noen eksempler på formatteringer: Figur 1. Eksempler på formattering. Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 6 av 15 Følgende er de vanligste konverteringer. De forekommer i de fleste programmeringsspråk. Se dokumentasjonen https://docs.python.org/2/ for flere tegn og detaljer. Tegn Argument type; Konvertering d, i Heltall, skrevet i desimal (radix 10) med minustegn (-) for negative tall x, o Heltall, skrevet ut som heksadesimale (radix 16) eller oktale (radix 8) f Float skrevet på form [-] d.ddd. Med mindre annet er oppgitt, er det brukt 6 plasser etter desimaltegnet e Float skrevet som [-] d.ddde ± dd, dvs. 3.142e + 01 for å skrive 3142 · 1001 (dvs. 31.42). g Float, som f eller e avhengig av hvor mange som er konvertert s Streng % %-tegn; ingen argument å konvertere Nedenfor følger (Escape-karaktererer) spesialtegn som kan skrives inn i tekststrenger som gjør spesielle operasjoner: \n Gir linjeskift \t Hopper til neste tabulator \’ Skriver ut tegnet ’ \” Skriver ut tegnet ” \\ Skriver ut tegnet \ I eksempelet nedenfor brukes * width for å formatere en tabell med frukt priser, hvor bruker legger inn den totale bredden på tabellen: Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 7 av 15 Figur 2. Eksempel på formattering av en prisliste. 4. Betingede kontrollstrukturer Betingede kontrollstrukturer trenger vi for å ta beslutninger for å utføre situasjonsbetingede handlinger. I Python har man en hvis-setning (if-statement) som utgjør dens betingede kontrollstruktur. Hvis en betingelse er tilfredsstilt, utføres handling (en eller flere kodelinjer) ellers utføres den ikke. if omsetning > 2000: bonus = 100 print("Bonus er oppnådd!") Man kan også utføre andre instruksjoner ved å legge dem i en else-blokk. Et if-else uttrykk vil kjøre en blokk av kode hvis betingelsen er sann (True) – og en annen blokk av kode hvis betingelsen er usann (False). Et if-else uttrykk brukes for å velge mellom to alternative handlinger / kodeblokker. Ofte kaller man dette for en hvis-så-ellers-struktur: if omsetning > 2000: # Betingelsen er sann print("Bonus er oppnådd!") else: # Betingelsen er usann print("Bonus er ikke oppnådd!") Om man vil utføre flere tester, kan man bruke elif, en sammentrekning av else og if, som sjekker en ny betingelse om den første ikke ble oppfylt: if (omsetning >= 2000): bonus = 100 elif(omsetning >= 1500): bonus = 75 elif(omsetning >= 1000): bonus = 50 else: bonus = 25 Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 8 av 15 Kun en av betingelsene vil slå til i eksemplet ovenfor. Man kan også bruke nøsting av if – setninger, men det kan fort bli uoversiktlig. Bruk av elif gir bedre oversikt og mer lesbar kode. 5. Løkker I tillegg til betingede kontrollstrukturer har vi to typer løkker. Den ene er en betinget løkke(while-løkker), som likner på if, men utføres flere ganger, og en løkke for å gå gjennom lister og andre sekvensielle data. Det er nyttig å kunne gjenta en del av et program flere ganger, uten å skrive det samme mange ganger. Til dette bruker man løkker while-løkker while-løkker brukes for å gjenta en oppgave mange ganger til en betingelse (ikke lenger) er oppfylt. Det er en fordel å bruke while-løkker ved gjentagelse av kode hvor man ikke helt vet hvor mange ganger koden skal gjentas. Den generelle syntaksen er som følger: while betingelse : <oppgave som gjentas> Koden her deklarerer og instansierer en variabel x med verdi 0. Løkken gjør at x blir skrevet ut etterfulgt av et linjeskift, for deretter å bli økt med 1. Den vil kjøres 10 ganger. while x < 10: print x x = x + 1 Validering av input ved hjelp av løkker Ofte ønsker man å sikre seg at riktig verdier på input fra brukeren før programmet går videre. Det kan man gjøre ved hjelp av while-løkke: alder = int(input("Hvor gammel er du? ")) while (alder < 0 or alder > 100): print("Feil: Alder må være mellom 0 og 100!") alder = int(input("Hvor gammel er du? ")) print("Takk for den!!!") for-løkker for-løkke brukes vanligvis for å gjenta en oppgave et kjent antall ganger. Hvis man skal gjenta en ”kodesnutt” et bestemt antall ganger, bruker man en for-løkke. En fordel å bruke hvis man skal gjøre noe med alle elementene i ei liste eller en tabell. Den generelle syntaksen er som følger: for i in liste : <oppgave som gjentas> Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 9 av 15 'liste' kan her for eksempel erstattes med range(10), som vil generere en liste fra 0 til 9. Her gjøres akkurat det samme som i while-løkken i eksempelet ovenfor. Tellevariabelen er innlemmet i løkken. for i in range(10) : print 1 En for-løkke kan også kjøres på en variabel som inneholder en liste av verdier. Følgende eksempel skriver ut navnene til skjerm i rekkefølge: navneliste=[’Ole’,’Per’,’Oline’,’Anna’,’Frida’] for navn in navneliste: print (navn) En for-løkke kan iterere (gå igjennom) ei liste av alle typer verdier (strenger, heltall, flyttall, sannhetsverdier osv. En løkke inne i en annen løkke kalles nøstede løkker. Noen fenomener er av en slik art at man trenger en hierarkisk gjennomkjøring av løkke. Tid er et godt eksempel der man teller først 60 sekunder, før man øker minutt med 1 osv. Utskrift av tid som nøstede løkker: for t in range(24): for m in range(60): for s in range(60): print(t,":",m,":",s) 6. Listemetoder og noen innebygde funksjoner Man kan også gå igjennom en liste element for element (iterere) ved å bruke ei for-løkke på følgende format: for element in liste: print(element) # Eller gjør noe annet med element liste er navnet på variabelen som inneholder en liste og element er en variabel som får verdien av hvert element i lista. Indeksering Indeks er et tall som spesifiserer et elements posisjon i en liste. Det gir tilgang til de enkelte elementer i en listen. Indeksen til det første elementet er 0, det andre 1, og det n-te elementet er n-1 Negative indekser identifiserer posisjoner relativt til listens slutt. Indeksen -1 identifiser det siste elementet, -2 det nest siste osv. Funksjonen len Funksjonen len returnerer lengden til en sekvens, som for eksempel lengden av en liste size = len(my_list) returnerer antallet elementer i listen, slik at det siste elementet er len(list)-1 ettersom indeks starter på 0 og ikke 1. Man kan bruke dette til å hindre en IndexError-exception når man itererer gjennom en liste i en løkke. Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 10 av 15 Konkatinere lister Å konkatinere, dvs. å føye to ting sammen kan gjøres ved å bruke operatoren +. De to listene lstA =[1,2,3,4,5] og lstB=[2,4,6,8,10] kan konkatineres slik at lstC=lstA+lstB # gir [1,2,3,4,5,2,4,6,8,10] Den utvidede operatoren += kan også brukes til å konkatinere lister (legge til element(er) til lista). lstA=[1,2,3] lstA+=[4] # Gir lstA=[1,2,3,4] dvs. det samme som lstA = lstA +[4]. Man kan endre på innhold på deler av lister ved hjelp av slice på følgene format: liste[start:slutt:inkrement] = […]. Hvis start ikke er spesifisert, brukes 0 som startindeks og hvis slutten ikke spesifiseres brukes len(list) som sluttindeks. Slicing-uttrykk kan inneholde stegverdier og negative indekser, som er relative til listens slutt. Se eksempler under: Figur 3. Eksempler på operasjoner på lister. Noen nyttige metoder og innebygde funksjoner En metode er en funksjon som er tett koplet til et eller annet objekt, det være seg en liste, et tall, en streng, eller hva som helst. Generelt kaller man en metode slik: object.method (argumenter) Som man kan se, ser en metode ut som et funksjonskall, bortsett fra at objektet er satt før metodenavnet, med en prikk som skiller dem. Lister har flere metoder som lar deg undersøke eller endre innholdet. Se eksempler under: Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 11 av 15 Figur 4. Eksempler på metoder som kan brukes på lister 7. Mer om funksjoner Når vi ønsker å utføre samme operasjon flere ganger er det nyttig å definere en funksjon. Funksjonen kan ta et antall parametre som input og returnere en resultatverdi. Parametre er variabler som blir sendt til en funksjon når funksjonen blir kalt opp. Når man definerer/lager en funksjon bruker man det reserverte ordet def. All koden i funksjonen (kroppen) skrives i innrykk. Man avslutter med return (når noe skal returneres) Det er flere fordeler med å dele opp et program i funksjoner: Koden blir enklere å lese og forstå (mer logisk), enklere med gjenbruk av kode og testing og debugging. I tillegg er det raskere å utvikle når man bruker funksjoner da kode som trengs i flere deler av systemet kan brukes flere ganger. En funksjon lages ved å skrive definisjonen av funksjonen: def funksjons_navn (): kode kode etc. Første linje kalles funksjonshode: Markerer starten på funksjon med det reserverte ordet def, fulgt av navnet på funksjonen, parenteser og et kolon. Resten av koden kalles ei kodeblokk som hører til funksjonen. Kodeblokken må skrives med innrykk. Funksjoner kjøres helt uavhengig av hovedprogrammet. En funksjon er som en miniatyr program som noen parametere er gitt til - det da driver seg selv, og deretter returnerer en verdi. Hovedprogrammet ser bare den returnerte verdien. Her følger et eksempel på en funksjon som summerer to gitte tall: # summerer to gitte tall Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 12 av 15 # definerer funksjonen def add(x, y): """Denne funksjonen summerer to tall""" return x + y tall1 = input('Enter first number: ') tall2 = input('Enter second number: ') print(tall1,"+",tall2,"=", add(tall1,tall2)) I Python kan en funksjon returnere flere verdier, spesifisert etter return-uttrykket, atskilt av kommaer på følgende format: return uttrykk1, uttrykk2, etc. Ved kall trenger du en variabel på venstresiden av = for hver returnert verdi: def get_name(): first_name=input("First name? ") last_name=input("Last name? ") return first_name,last_name Her følger et eksempel med 3 verdier: def setning(ord_1, ord_2, ord_3): print "Setningen blir: " + ord_1 + ord_2 + ord_3 return ord_1 + ord_2 + ord_3 Man kan også ha boolsk funksjon, dvs. funksjoner som returnerer enten True eller False. Typiske bruksområder for slike funksjoner er ved testing av et kriterium for beslutninger (if…, while…), forenkle sjekk av inndata for gyldighet , spørre om verdier og bare godta enkelte verdier ved å returnere True hvis inndata er en av disse. Her følger et lite program hvor man har flere funksjoner: # Definisjon av funksjonen lager_oslo def lager_oslo(): antall = 1000 # Variabelen antall kun for lager_oslo() print('Lagert i Oslo', antall,'varetyper') # Definisjon av funksjonen lager_narvik def lager_narvik(): antall = 2000 # Variabelen antall kun for lager_narvik() print('Lageret i Narvik har',antall,'varetyper') # Kall av funksjonen def main(): lager_oslo() lager_narvik() main() Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 13 av 15 8. Bruk av modulene math og random Python inneholder en rekke moduler og biblioteker som kan importeres til et program noe som gir fleksibilitet i hvordan man kan gjennomføre programmet. For eksempel , for programmer som krever matematikk , kan du importere og bruke en rekke biblioteker innenfor Python . Hovedbiblioteket for matematiske funksjoner i Python er kjent som math. Import og bruk av denne modulen er grei. Ved bruk av modulen: #Import av pakke(modul) import math #Kalle funksjon, for eksempel y=math.sin(x) # Bruke konstant, for eksempel omkr=2*math.pi*r Math-modulen i python gir deg mer avanserte mattefunksjoner(kvadratrot, cosinus, sinus) som ikke er med fra standard og matematiske konstanter som f.eks. pi og e. For en oversikt over funksjonene i math se: https://docs.python.org/2/library/math.html I figur 5. følger noen eksempler på bruk av math: Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 14 av 15 Figur 5. Eksempler på bruk av modulen math. Buk av modulen random Random-modulen i python er biblioteksfunksjoner for generering av tilfeldige tall. Mulige bruksområder kan være spill og simuleringer og f.eks. statistiske analyser. Her er flere eksempel på hvordan metoden kan brukes from random import * print random() #Gir et vilkårlig tall mellom 0 og 1: 0.024762749258158245 print randint(1,100) #tilfeldig heltall [fra,til] L = [7, 3, 8, 5, 6] choice(L) print choice(L) # liste med navn Opphavsrett: Forfatter og Stiftelsen TISIP Strengbehandling og enkle beregninger side 15 av 15 liste = ['Pierre', 'Paul', 'Jacques'] print choice(liste) 9. Numpy og Scipy Numpy I tillegg til de tradisjonelle matematiske verktøy tilgjengelig i Python, finnes det en annen modul kalt NumPy som man kan bruke til spesielle beregninger. NumPy er en utvidelse/bibliotek til Python som gir tilgang til matriser og multidimensjonelle tabeller, og støtte for disse samt et stort bibliotek med høy nivå matematiske funksjoner. NumPy er opensource, og har vært i utvikling siden 2006. Store deler av NumPy er skrevet i C som gjør at det er raskere en vanlig Python. Vi kommer ikke til å bruke NumPy i dette kurset. Det er vanlig å installere NumPy som en del av en større “Scientific Computing” pakke. Man vil da installere NumPy som en del av en samling andre relaterte verktøy. SciPy SciPy er et åpent kildekode Python bibliotek som brukes av forskere, analytikere, og ingeniører til vitenskapelig og teknisk databehandling. SciPy inneholder moduler for optimalisering, lineær algebra, integrasjon, interpolering, signal og bildebehandling, ODE løsere og andre oppgaver som er vanlig i vitenskap og engineering. SciPy er også et utviklingsmiljø, som inneholder blant annet SciPy og NumPy bibliotekene, i tillegg til ipython, matplotlib, pandas med mer. SciPy bruker de multidimensjonelle tabellene fra NumPy som datastruktur, og implementerer en egen generisk variant av de forskjellige metodene (lineær algebra, fourier transjormasjoner og generering av pseudorandom tall) som man også har i NumPy. I tillegg er det mange metoder i SciPy som ikke finnes i NumPy. Fagområder som kan ha nytte av å bruke SciPy er: lineær algebra, signalprosessering, datainnsamling og beregeningsorientert geometri. Vi kommer ikke til å bruke SciPy i dette kurset, men hvis man er interessert kan man finne mer informasjon om SciPy her: http://en.wikipedia.org/wiki/SciPy Hvis man ønsker å teste ut NumPy eller SciPy anbefales det at man installerer hele samlingen av programmer og verktøy via en distribusjon. De fleste distribusjoner er "last ned og kjør installer”, og så er man igang. Her følger link til tre varianter som har installasjonsfiler for Mac, Linux og Windows plattformen. Anaconda: http://continuum.io/downloads.html Entought: https://www.enthought.com/downloads/ Algorete Loopy: http://algorete.org Opphavsrett: Forfatter og Stiftelsen TISIP