Hoofdstuk 5 Moppen 36 Hoofdstuk 5 MOPPEN In dit hoofdstuk behandelen we: Het gebruik van het sleutelwoord end als argument in de print-functie om niet naar een nieuwe regel te gaan Escape-tekens Het gebruik van enkele en dubbele aanhalingstekens in strings Meer doen met print() De meeste games in dit boek maken gebruik van eenvoudige tekst voor invoer en uitvoer. De invoer wordt door de gebruiker op het toetsenbord getypt en op die manier in de computer ingevoerd. De uitvoer is de tekst die op het scherm wordt weergegeven. In Python wordt de functie print() gebruikt voor het weergeven van de tekstuitvoer op het scherm. Maar we kunnen nog meer leren over hoe strings en print() werken in Python. Het programma in dit hoofdstuk vertelt een paar moppen aan de gebruiker. Voorbeelduitvoer van Moppen Hoe opent een skelet een deur? Met zijn sleutelbeen! Wat doen pizza's als ze ziek zijn? Ze bellen Dr. Oetker! Zeg eens: "Koe die in de rede valt". Koe die in de rede v-boe! Broncode van Moppen Typ de volgende broncode in de bestandseditor en sla het bestand op met de naam moppen.py. Vergeet niet dat je het nummer aan het begin van de regel NIET typt. Dat nummer is alleen om naar de regels te kunnen verwijzen in de uitleg. Als je een foutmelding krijgt nadat je deze code hebt ingetypt, controleer dan goed op typefouten. 1. print('hoe opent een skelet een deur?') 2. input() 3. print('met zijn sleutelbeen!') 4. print() 5. print('wat doen pizza\'s als ze ziek zijn?') 6. input() 7. print('ze bellen Dr. Oetker!') 8. print() 9. print('zeg eens: "Koe die in de rede valt."') 10. input() 11. print('koe die in de rede v', end='') moppen.py
Hoofdstuk 5 Moppen 37 12. print('-boe!') Geen zorgen als je niet alle code begrijpt. Sla het programma gewoon op en voer het uit met F5. Hoe de code werkt 1. print('hoe opent een skelet een deur?') 2. input() 3. print('met zijn sleutelbeen!') 4. print() De regels 1 t/m 4 bevatten drie functieaanroepen voor print(). Je wilt niet dat de speler de clou van de mop meteen al ziet, dus na de eerste print() wordt de functie input() aangeroepen. De speler kan de eerste regel van de mop dan lezen en daarna op Enter drukken, om vervolgens de clou te lezen. De gebruiker kan ook een antwoord typen als hij wil, en dan op Enter drukken, maar wat de gebruiker typt, wordt niet in een variabele opgeslagen. Het programma negeert een eventueel antwoord van de speler dus gewoon en gaat naar de volgende regel code. De laatste aanroep van print() heeft geen stringargument. Op deze manier krijgt het programma de opdracht alleen een lege regel weer te geven. Lege regels zijn handig om te zorgen dat de regels van een stukje tekst niet allemaal op een hoopje staan. Escape-tekens 5. print('wat doen pizza\'s als ze ziek zijn?') 6. input() 7. print('ze bellen Dr. Oetker!') 8. print() In de eerste print()-functie hierboven staat een backslash voor het enkele aanhalingsteken. (Het teken \ noemen we een backslash, en / heet een slash.) Deze backslash laat weten dat het teken dat er direct achter komt, een bijzonder teken is. Met een escape-teken kun je tekens weergeven die normaal een andere betekenis hebben dan binnen Python. In deze aanroep naar print() is de backslash het escape-teken. Dit teken staat vóór het enkele aanhalingsteken omdat Python anders zou denken dat het einde van de string was gekomen. Maar dit aanhalingsteken maakt juist onderdeel uit van de string. Door de backslash weet Python dat het enkele aanhalingsteken deel uitmaakt van de string en niet het einde van de string aangeeft.
Hoofdstuk 5 Moppen 38 Een paar andere escape-tekens Wat zou je moeten doen als je een backslash zou willen weergeven op het scherm? Deze regel code zou niet goed werken: >>> print('sla het bestand op in C:\test.') Die print()-functie zou dit resultaat opleveren: Sla het bestand op in C: est. Dat komt omdat de 't' van 'test' gezien wordt als een bijzonder teken omdat het na een backslash kwam. De combinatie \t simuleert het indrukken van de Tab-toets op het toetsenbord. Als je een echte backslash in je tekst wilt in plaats van een bepaalde opdracht in Python te geven, moet je nog een backslash typen. Probeer deze regel eens: >>> print('sla het bestand op in C:\\test.') Sla het bestand op in C:\test. In Tabel 5-1 zie je een lijst met de escape-tekens in Python. Tabel 5-1: Escape-tekens Escape-teken Wat op het scherm wordt weergegeven \\ Backslash (\) \' Enkel aanhalingsteken (') \" Dubbel aanhalingsteken (") \n Een nieuwe regel \t Een tab Enkele en dubbele aanhalingstekens Strings hoeven niet per se tussen enkele aanhalingstekens te staan in Python. Je mag ze ook tussen dubbele aanhalingstekens zetten. Deze twee regels geven hetzelfde weer: >>> print('hallo wereld') Hallo wereld >>> print("hallo wereld") Hallo wereld Maar je mag aanhalingstekens niet door elkaar gebruiken. Deze regel heeft een foutmelding als resultaat: >>> print('hallo wereld") SyntaxError: EOL while scanning single-quoted string
Hoofdstuk 5 Moppen 39 Ik gebruik zelf altijd enkele aanhalingstekens. Dan hoef ik de Shift-toets niet ingedrukt te houden als ik een aanhalingsteken typ. Dat is gemakkelijker typen en Python maakt het niets uit. Net als bij \' moet je een backslash gebruiken als je een dubbel aanhalingsteken wilt weergeven in een string die al tussen dubbele aanhalingstekens staat. Kijk bijvoorbeeld eens naar deze twee regels: >>> print('ik vroeg of ik Theo\'s auto een week mocht lenen. Hij zei: "Geen probleem."') Ik vroeg of ik Theo's auto een week mocht lenen. Hij zei: "Geen probleem." >>> print("hij zei: \"Niet te geloven dat je Theo's auto zo maar mocht lenen.\"") Hij zei: "Niet te geloven dat je Theo's auto zo maar mocht lenen." In de strings die beginnen en eindigen met enkele aanhalingstekens hoef je geen escape-tekens voor dubbele aanhalingstekens te zetten en in de strings die beginnen en eindigen met dubbele aanhalingstekens hoef je geen escape-teken voor enkele aanhalingstekens te zetten. De Pythoninterpreter is wel zo slim om te begrijpen dat als een string begint met het ene type aanhalingsteken, het andere type niet betekent dat dat het eind van de string is. Het sleutelwoord end als argument van de functie print() 9. print('zeg eens: "Koe die in de rede valt."') 10. input() 11. print('koe die in de rede v', end='') 12. print('-boe!') Zag je de tweede parameter op regel 11 bij print()? (Een parameter is trouwens een soort variabele, daar komen we later nog op terug.) Normaal is het zo dat de functie print() aan het eind van de string een nieuwe regel invoert. Dat wordt gedaan met een nieuweregelteken. Daarom krijg je een lege regel als je een print()-functie aanroept zonder tekst. Maar de print()-functie kan ook een tweede parameter bevatten (met de naam 'end'.) De lege string die wordt doorgegeven, wordt een sleutelwoordargument genoemd. De parameter end heeft een specifieke naam en als je een argument wilt doorgeven aan deze specifieke parameter, moet je end= typen. Door een lege string door te geven aan end, voegt de functie print() geen nieuweregelteken toe aan het eind van de regel, maar een lege string. Daarom wordt '-BOE!' uiteindelijk weergegeven achter de vorige regel en niet eronder. Er stond nu dus geen nieuweregelteken achter de string 'Koe die in de rede v'. Samenvatting In dit hoofdstuk keken we naar een paar dingen die je met de functie print() kunt doen. Escapetekens moet je gebruiken voor letters en tekens die een specifieke betekenis hebben in Python, bijvoorbeeld \', \", \\, \n, \t. Escape-combinaties worden getypt met een backslash \ en dan het teken met de speciale betekenis. \n gebruik je bijvoorbeeld als je een nieuwe regel wilt aanbrengen. Als je een backslash in je uitvoer wilt weergeven, moet je de backslash twee maal typen. De functie print() voegt aan het einde van de string die wordt doorgegeven voor uitvoer op het scherm automatisch een nieuweregelteken toe. Dit is meestal handig. Maar soms wil je geen nieuweregelteken aan het einde van je zin. Dan kun je het sleutelwoordargument end doorgeven met
Hoofdstuk 5 Moppen 40 een lege string door end=' ' te typen. Als je bijvoorbeeld 'ham' wilt weergeven op het scherm zonder een nieuweregelteken, roep je de functie als volgt aan: print('ham', end=''). Met deze kennis over hoe je de print-functie kunt gebruiken, kun je flexibeler zijn in hoe je tekst weergeeft op het scherm.