Övning 3 tilpro05 10 november 2005 Viktigt angående hemtal och att rita vad som händer i minnet! Listor och dictionaries är referenser, dvs de hanteras genom en sorts pekare. Därför är det väldigt viktigt att påpeka/illustrera detta när ni redovisar labbar eller skriver lösningar till uppgifter! I uppgift 1b i första hemtalet: Vad har a och b för värden efter följande satser? Rita minnesbild! a = range(4) b = a b[1] = 8 En del av svaret är att visa att a och b faktiskt delar data. Bra svar: a [0,8,2,3] a och b pekar på samma data, ändrar man a:s data, ändras b:s data. b Dessutom: testa er egen kod! Testa koden i uppgiften. Det hade varit lätt att se att range(4) skapar [0,1,2,3] och inte [1,2,3,4] bara genom att använda print. Global-problematiken För att slippa få de problem som globala variabler kan orsaka, kan man lägga sitt program i en metod som man sedan anropar. Då förblir de lokala variablerna lokala: def main(): #lägg din programkod här if(__name__ == ”__main__” main() Bortsett från lab2, kan man allmänt säga att omotiverade globala variabler är dåliga och kan leda till underkända labbar. I de flesta fall kan man lösa problemen utan globala variabler! Pekare i allmänhet Numeriska typer som int, float och true/false har ett enkelt beteende: vid tilldelning så kopieras deras värde. Om de skickas som argument eller returneras från en metod, så kopieras deras värde också. Strängar och komplexa tal beter sig som enkla typer men använder pekare. Strängarna därför att de kan ha godtycklig längd, vilket gör att det är enklare att lagra dem på annan plats och sedan hänvisa till den minneplatsen (adressen). Komplexa tal för att de realiseras med hjälp av en tupel som också kan vara godtyckligt stora, men i det komplexa fallet bara har två element. För båda dessa typer gäller att man kan inte förändra deras delar, utan man skapar helt enkelt en ny som man pekar till. Exempel snodda från Per­Anders: namn1 = ”Pa” namn2 = namn1 namn1 = namn1+” Staav” namn2[0] = ”S” #går ej! namn1 namn2 ”Pa” #minnesplats 1 ”Pa Staav” #minnesplats 2 Alla andra typer i Python har ett rent pekar­beteende, dvs om man använder en pekare och Övning 3 tilpro05 10 november 2005 förändrar delar av det data som den pekar till, så förändras datat för alla som pekar till det. Detta gäller också egendefinierade typer, dvs klasser som vi själva skriver. Klasser, även kallade egendefinierade typer Ibland vill man klumpa ihop data i en enhet som man sedan behandlar på olika sätt. Detta kallas för inkapsling. Man gör en mall (klassdefinitionen) där man definierar vilka data (medlemsvariabler) som finns och vilka operationer (medlemsfunktioner) som man kan använda. Utifrån denna mall skapar man sedan s.k. instanser (objekt) av sin klass. Instanserna innehåller då en egen kopia av medlemsvariablerna, dvs medlemsvariablerna är individuella. Instanserna kan då ha sinsemellan olika värden på medlemsvariablerna. Egendefinierade typer har också pekarbeteende! Dvs om flera variabler pekar till samma instans, och en av variablerna ändrar på instansens innehåll kommer förändringen även synas för den andra variabeln, precis som när vi använder listor och dictionaries! Värdet None Värdet None används för att tilldela en variabel ett värde som representerar ”inget värde”. Den är mycket användbar som markör, t ex i länkade listor. De flesta språk har en motsvarighet till None. Då kan man ha en variabel, men utan att den har ett värde, och man kan dessutom kolla om den har ett värde eller ej. Man kan också markera att något inte finns genom att returnera None från en metod. Länkade listor En mycket användbar datastruktur som är grunden för mycket inom datalogin. Genom att förstå konceptet länkade listor, ökar man även förståelsen för köer, stackar, träd, rekursion mm. Stabila sorteringsalgoritmer Stabila sorteringar behåller den inbördes ordningen mellan element med samma nyckel. T ex om vi sorterar först på namn och sedan på ålder så kommer posterna med samma ålder att vara i namnordning. Formellt: Om R, S har samma nyckel och R var före S i listan innan sorteringen så kommer R att hamna före S efter sorteringen. Bubblesort och insertionsort är stabila, medan selectionsort och quicksort inte är det. Lab2 Under lab2 är det mycket användbart att läsa sig till vad vissa funktioner gör, t ex match och search. På Pythons hemsida finns det s k dokumentation över språket och vissa moduler: http://docs.python.org/lib/contents.html Från python.org kan man även söka på saker som man inte förstår. Gör det!