Data¶
Informatica¶
een taal leren \(\sim\) syntax (noodzakelijk, maar niet het punt)
… informatica studeren \(\sim\) semantiek (leren hoe machines denken!)
Een programmeertaal als Python leren heeft alles te maken met syntax waarmee je handelingen kan schrijven die een machine moet uitvoeren. Maar hiervoor heb je ook andere kennis nodig, kennis die alles te maken heeft met wat de machine (bijvoorbeeld, jouw laptop) doet.
Handelingen en data¶
x = 41
y = x + 1
Laten we om te beginnen de volgende twee variabelen x en y ieder een waarde toekennen. Deze waarden (41 en 42) worden in het geheugen opgeslagen.
Achter het doek¶

Stel je een variabele voor als een doos: de inhoud van de doos is de waarde (bijvoorbeeld 41 of 42 in ons geval) met extra informatie over het type van de waarde (een int wat staat voor integer, een geheel getal) en een geheugenlocatie (LOC).
Geheugen¶

Geheugen is een hele lange lijst van dit soort dozen, elk met een naam, waarde, type en geheugenlocatie.

Random Access Memory (RAM) is waar variabelen worden opgeslagen, een kaart zoals je deze hier ziet zit ook in jouw computer! Als je het zwarte materiaal voorzichtig zou weghalen zal een (microscopisch klein) raster zichtbaar worden.

In deze tekening heeft het geheugenraster rijen en kolommen. Een wordline selecteert een rij en een bitline voert de waarde van een kolom. Welke lijn in de tekening horizontaal of verticaal loopt, hangt af van de gekozen voorstelling; dat is geen algemene fysische regel. We gebruiken het raster als geheugenmetafoor.
Bits¶

Een punt dat we als geladen (1 of True) of ongeladen (0 of False) voorstellen, noemen we één bit. Dat is de kleinste informatie-eenheid in deze metafoor.
Oefenmoment 1 — voorspel en voer uit¶
Voorspel: welke waarde staat na x = 41 in het geheugen? Bespreek kort welke informatie Python daarbij moet bewaren. Voer daarna de cel met x = 41 uit en controleer je voorspelling. Je oefent hier het onderscheid tussen een waarde en de manier waarop die wordt opgeslagen.
Bytes¶

Een byte is een verzameling van 8 bits. Dat is een afspraak die je in bestanden en programma’s vaak tegenkomt. ASCII is een tabel die tekens aan getallen koppelt: ASCII gebruikt 7 bits en een ASCII-teken kan daarom in één byte van 8 bits worden opgeslagen. Je hoeft daarvoor geen binaire omzettingen of talstelselberekeningen te maken.
Hoe zijn gegevens opgeslagen?¶

Dezelfde bits kunnen een andere waarde representeren, afhankelijk van het type!
Laten we eerst kijken hoe karakters worden gerepresenteerd door een computer. De computer kent alleen maar bytes (8 opeenvolgende bits) dus hoe kan het karakters als A, B en C opslaan? Dit kan een computer niet en er is een vertaaltabel nodig om van bits naar karakters te komen en vice versa. De ASCII tekenset is zo’n vertaaltabel.
ASCII¶
American Standard Code for Information Interchange

In deze tabel hoort het teken C bij code 67. ASCII gebruikt daarvoor 7 bits; bij opslag krijgt het teken ruimte in één byte van 8 bits. De tabel vertelt welke betekenis bij de code hoort.
Oefenmoment 2 — zoek een ASCII-code¶
Zoek in de tabel de code van het teken A (of een teken dat je zelf kiest). Noteer alleen het getal en bespreek daarna: ASCII gebruikt 7 bits, terwijl het teken in één byte van 8 bits kan worden opgeslagen. Je hoeft de code niet naar binaire vorm om te rekenen.

Dezelfde opgeslagen gegevens kunnen volgens een afspraak een getal of een teken voorstellen. Het type geeft Python de context: int voor rekenen en str voor tekst. In deze week gebruiken we die representaties om bestanden te lezen en te schrijven; we rekenen niet met binaire getallen.

Denk terug aan de “dozen” die we hebben gebruikt om een voorstelling te maken van wat zich in het geheugen van een computer afspeelt en met wat we nu weten kunnen we dit beeld gaan aanpassen. De “inhoud” van een doos zijn de bits, zoveel is nu wel duidelijk. De inhoud van verschillende dozen kan hetzelfde zijn maar het type bepaalt de representatie, bijvoorbeeld of het integer met waarde 67 of een string met waarde “C” is.
De naam van een waarde (variabele) maakt dus ook niet uit, je weet inmiddels dat je (bijna) elke naam voor een variabele mag kiezen en het is niets meer dan een verwijzing naar de waarde die voor jou betekenis heeft (en je zult misschien hebben gemerkt dat het kiezen van een betekenisvolle naam niet altijd eenvoudig is!).
Bestanden¶
Alles wat we tot nu toe hebben gedaan speelt zich af in het geheugen, en dat geheugen is leeg zodra je programma stopt. Wil je gegevens bewaren, of gegevens gebruiken die iemand anders heeft gemaakt, dan heb je een bestand nodig.
Wat er in een tekstbestand staat¶
Een tekstbestand is precies wat de vorige paragraaf beschreef: een rij bytes, die volgens een afspraak als tekens worden gelezen. Er zit geen enkele extra structuur in.
Ook niet waar je die zou verwachten. Neem een bestand met drie namen:
Anouk
Bram
Chiara
Dat oogt als drie regels, maar in het bestand staat dit:
Anouk\nBram\nChiara\n
Dat \n is één teken, met ASCII-waarde 10, en het heet een newline. Regels
bestaan niet in een bestand; er staan alleen tekens, en sommige daarvan spreken
we af als “hier houdt een regel op”.
Dat lijkt een detail, maar het is de eerste ervaring die iedereen met bestanden heeft: je leest een regel in en er blijkt iets aan te hangen wat je er niet zelf in hebt gezet.
Oefenmoment 3 — voorspel de uitvoer¶
Voorspel eerst wat de code hieronder afdrukt als elke regel in het bestand al een \n bevat. Voer de code daarna uit. Leg uit waarom er lege regels verschijnen: print voegt zelf ook een newline toe.
Een bestand lezen¶
Zo open je een bestand:
with open("namen.txt") as file:
for line in file:
print(line)
Lees de eerste regel als één zin: open dit bestand, en noem het file zolang
dit blok duurt. Zodra het blok afgelopen is, wordt het bestand vanzelf weer
gesloten.
Dat sluiten is geen formaliteit. Een programma mag maar een beperkt aantal
bestanden tegelijk open hebben, en wat je schrijft staat er pas echt in als het
bestand netjes is afgesloten. Met with hoef je daar niet aan te denken, ook
niet als er halverwege iets misgaat. Waaróm dat laatste werkt zie je in
Programmeren 2.
De lus eronder geeft je de regels, één voor één, met de newline er nog aan. De uitvoer van bovenstaand programma is daarom:
Anouk
Bram
Chiara
Die lege regels komen doordat print er zelf ook nog een newline achter zet.
Een bestand schrijven¶
Bij het schrijven geef je een tweede argument mee, "w" van write:
with open("namen.txt", "w") as file:
print("Anouk", file=file)
print("Bram", file=file)
print kan zijn uitvoer naar een bestand sturen in plaats van naar het scherm,
en dat doe je met file=. De newline aan het eind van elke regel zet print er
zoals gewoonlijk zelf achter.
"w" gooit weg
Een bestand openen met "w" maakt het meteen leeg, ook als je er daarna niets
in schrijft. Bestond het nog niet, dan wordt het aangemaakt.