07A: Strings

Les 7 kent drie delen A, B, C die in een willekeurige volgorde kunnen worden doorgenomen.

Tot nu toe hebben we strings (waarden van het type str) alleen nog maar op eenvoudige wijze gebruikt. In deze les zullen we laten zien hoe we strings kunnen bewerken: hoe ze kunnen worden opgesplitst, hoe ze zijn samen te voegen, en hoe de individuele karakters (letters, cijfers, spaties, en leestekens) kunnen worden opgespoord die deel uit maken van een string.

Wat is een string?

Alle gegevens die op een computer worden bewaard bestaan uit 0-en en 1-en. Inclusief tekst, digitale boeken, plaatjes, liedjes, video's en "programma's" zoals spelletjes en toepassingen. Strings, een voorbeeld van tekst, worden op de volgende wijze opgeslagen:

  • een string is een rij karakters (bijv., de string "Hello, World!" bestaat uit 13 karakters waaronder de letters "H", "e" en tekens als " " (spatie) en "!")
  • elk karakter wordt opgeslagen als een getal (bijv. "H" wordt opgeslagen als het getal 40, de ASCII/Unicode-waarde voor "H")

Getallen worden intern op hun beurt weer bewaard in een 0-1 binair formaat.

Het bewerken van een string door deze te zien als een rij karakters: S[]

Om een string te kunnen bewerken is het nodig om de individuele karakters te kunnen selecteren. In Python wordt dit op de volgende manier gedaan: bij een string S en een integer index, is

S[index]
het karakter van S op positie index. In Python begint de string bij index 0: dus is S[0] het eerste karakter en S[1] het tweede karakter, enz. In "Hello, World!" bestaat de lijst van karakters uit:

Index   : 0  1  2  3  4  5  6  7  8  9 10 11 12
Karakter: H  e  l  l  o  ,     W  o  r  l  d  !
Merk op dat het karakter op index 6 een spatie is.

In veel andere programmeertalen bestaat er een speciaal type voor karakters. In Python zijn karakters hetzelfde als strings van lengte 1, met als type str.

Het aantal karakters in een string vaststellen: len

Om het aantal karakters van een string te achterhalen gebruiken we de Python-functie len. Zo is bijvoorbeeld len("Hello, World!") gelijk aan 13.

Meerkeuze-opgave: Laatste karakter
Welke expressie kan worden gebruikt om het laatste karakter van een string S te bepalen?
Juist! len(S) is weliswaar het totaal aantal karakters in S; echter, omdat men begint met index 0, heeft het laatste karakter index len(S)-1.

Hier volgt een voorbeeld van het gebruik van len en [].

Voorbeeld: De lengte van een string en karakters

Je kunt hier in het Engels lezen over de reden waarom de index in Python en vele andere programmeertalen bij 0 begint.

Delen van een string: S[:]

Een deel van een string heet een substring. Zo zijn bijvoorbeeld de strings "her" en "hal" substrings van "herhaling". Om een substring in Python te bepalen, gebruiken we de syntax

S[beginIndex:eindIndex]
.
Het levert de substring startend bij index beginIndex en eindigend bij eindIndex-1. Probeer eerst de uitvoer van het volgende programma te voorspellen voor dat je het uitvoert.
Voorbeeld: Substrings

Merk op het karakter op index beginIndex wel deel uitmaakt van S[beginIndex:eindIndex], en het karakter op index eindIndex niet. Dit geeft vaak aanleiding tot fouten. Het heeft weliswaar ook een aardig bijeffect. Zo is vanwege deze keuze, de lengte van de substring S[i:j] altijd gelijk aan j-i.

Programmeeroefening: Een string inkorten
Schrijf een programma dat een string inleest met behulp van input(), en als uitvoer dezelfde string geeft maar dan zonder het eerste en laatste karakter. (Je mag aannemen dat de invoerstring tenminste een lengte heeft van twee karakters.) Zo zal bijvoorbeeld bij invoer Python een correct programma ytho afdrukken.
Tik de invoer voor je programma hieronder in.

Strings aan elkaar plakken: +

We weten allemaal dat 1+2=3. Met strings krijgen we het volgende resultaat:

Voorbeeld: Strings optellen

Zoals te zien is, is het effect van S+T een nieuwe string die begint met S onmiddellijk gevolgd door T. Dit aan-elkaar-plakken wordt ook concatenatie genoemd.

Programmeeroefening: Heads and Tails
Schrijf een programma dat een string inleest met behulp van input(), en als uitvoer dezelfde string geeft maar waarbij het eerste en het laatste karakter zijn omgewisseld. (Je mag aannemen dat de string tenminste lengte 2 heeft. Zo zal bijvoorbeeld bij invoer kaart een correct programma taark afdrukken. Hint: gebruik hierbij de oplossing van je vorige programma als deel van het antwoord.
Tik de invoer voor je programma hieronder in.

Wanneer je een string en een getal wilt samenvoegen, moet je het getal eerst omzetten in een string. Anders krijg je één van twee foutmeldingen, afhankelijk van de volgorde waarin je het probeert. Voer dit programma uit om de foutmeldingen te zien die kunnen optreden.
Voorbeeld
Voer het programma uit en bekijk de foutmelding. Zet daarna de regels in een andere volgorde om de tweede samenvoeg-foutmelding te zien.
  • print("high " + 5)
  • print(110 + " percent")
Hier is een correct voorbeeld: de str()-functie vertaalt het getal in een string voor de samenvoeging.
Voorbeeld
Vertalen van een getal in een string met str()

Zoals we hebben aangegeven in Les 4, kun je strings vermenigvuldigen met een geheel getal. Zo is S * n een afkorting voor S + S + ... + S, n keer.

Voorbeeld
String-vermenigvuldiging

Codes voor karakters: ord, chr

Zoals we in de inleiding van deze les al vermeldden, wordt in de computer elk karakter opgeslagen als een getal. Welk karakter komt overeen met welk getal? In het algemeen hangt dat af van de codering die je gebruikt, maar vrijwel alle moderne computers interpreteren de getallen tussen 32 en 255 op dezelfde manier als een karakter. Hier volgt de lijst van de karakters die overeen komen met de getallen tussen 32 en 127:

ord: 32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47
chr:      !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /
ord: 48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63
chr:  0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?
ord: 64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79
chr:  @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
ord: 80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95
chr:  P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _
ord: 96  97  98  99  100 101 102 103 104 105 106 107 108 109 110 111
chr:  `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
ord: 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
chr:  p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~
Dit is een zogenaamde ASCII-tabel. Later, in les 8, zul je een programma schrijven om deze tabel te genereren.
Het is niet zinvol om de hele tabel uit je hoofd te kennen, maar er zijn een paar aspecten die nuttig zijn om je te herinneren:

  • de kleine letters a, b, c, ..., z hebben opeenvolgende codes
  • de hoofdletters A, B, C, ..., Z hebben opeenvolgende codes
  • de cijfers 0, 1, 2, ..., 9 hebben opeenvolgende codes

Het karakter met code 32 is de spatie, terwijl het karakter met code 127 een van de speciale besturingskarakters (Eng.: control characters) is. Enkele speciale control karakters zijn die met code 9 (tab), en 10 en 13 die worden gebruikt om naar een nieuwe regel te gaan.

In Python kun je een karakter omzetten naar zijn bijbehorende code door middel van de functie ord. De functie chr doet het omgekeerde: het argument is een getal en de resultaatwaarde is het karakter met die code.

Voorbeeld
Voorbeeld vanord en chr

Programmeeroefening: De volgende letter
Schrijf een programma dat een karakter als invoer neemt (een string met lengte 1), waarbij we aannemen dat het een hoofletter is; en de uitvoer is de volgende letter uit het alfabet. Maar als de input 'Z' is, dan moet de output 'A' zijn. (Je zult daarbij een if-opdracht nodig hebben. Voor nog een aanwijzing klik hier.)
Tik de invoer voor je programma hieronder in.

Sommige systemen ondersteunen slechts karakters met code tussen de 32 en 127; andere systemen ondersteunen karakters tot code 255 of zelfs 65535; in Unicode bestaan honderdduizenden karakters. Je kunt meer lezen over de geschiedenis hier of hier.

Hier volgen nog twee oefeningen. Daarmee sluiten we het hoofdstuk af.

Programmeeroefening: Potjeslatijn
Potjeslatijn is een onzin-taal. Om een woord vanuit het Engels om te zetten naar potjeslatijn, verplaats je de eerste letter naar het einde en je voegt er daarna "ay" aan toe. Zo wordt in het potjeslatijn bijvoorbeeld, monkey onkeymay, en wordt word ordway. Schrijf een programma dat een enkelvoudig woord als invoer neemt en het woord vervolgens omzet naar het potjeslatijn. (In werkelijkheid heeft potjeslatijn complexere regels, maar die laten we achterwege voor wat deze oefening betreft.)
Tik de invoer voor je programma hieronder in.

Programmeeroefening: The Name Game
The Name Game (het namenspel) laat je een liedje maken bij een naam van iemand. Luister naar het liedje en probeer een idee te krijgen hoe het werkt:
Je programma moet de naam van een persoon als invoer krijgen, "pearl" bijvoorbeeld, en drukt het liedje af, bv.

pearl, pearl, bo-bearl
banana-fana fo-fearl
fee-fi-mo-mearl
pearl!
Merk op dat de naam drie keer terugkomt; en de naam komt verder nog drie keer voor waarbij de eerste letter vervangen wordt door b, f, of m. (In werkelijkheid heeft het liedje complexere regels, maar die laten we achterwege in verband met het doel van deze oefening.)
Tik de invoer voor je programma hieronder in.

Ga verder met de volgende les!