Inhoud Voorwoord Errata en suggesties Gebruikte conventies in dit boek Welkom lezer! Python-promotie Overzicht 0 1 xv xv xv xvii xviii xix Inleiding – Wat is Python? 1 Het is een programmeertaal! Versies van de taal Python Het is een standaardbibliotheek! Het is een filosofie Je reis begint... 2 3 4 4 5 Aan de slag 7 Python 3 ophalen en installeren Windows macOS Linux De shell van Python starten De shell verlaten Windows Mac/Unix Codestructuur en significante inspringing De Python-cultuur Modules uit de standaardbibliotheek importeren Hulp ontvangen Fruit tellen met math.factorial() Verschillende soorten getallen Primitieve gegevenstypen int 8 8 9 10 11 12 13 13 13 17 18 19 21 21 23 23 vii Inhoud 2 3 viii float None bool Relationele operatoren Rijke vergelijkingsoperatoren Programmaverloop: if en while Conditioneel programmaverloop: de opdracht if if...else if...elif...else Conditionele herhaling: de while-lus Samenvatting 24 26 26 28 29 29 29 30 31 32 35 Strings en collecties 37 str – een onveranderlijke reeks Unicode-codepunten Strings markeren Zen-moment 39 Concatenatie van aangrenzende strings Strings met meerdere regels en newlines Raw-strings De constructor str Strings als sequenties Stringmethoden Strings met Unicode bytes – een onveranderlijke reeks bytes Literal bytes Converteren tussen bytes en str list – een reeks objecten dict – sleutels met waarden combineren For-lussen – een reeks items doorlopen Alles samenvoegen Samenvatting 38 38 40 40 42 43 43 43 45 46 46 47 50 51 52 53 57 Modulariteit 59 Code in een .py-bestand ordenen Python-programma’s in de shell van het besturingssysteem uitvoeren Modules in de shell importeren Functies definiëren Module in functies ordenen __name__ en modules vanaf de opdrachtregel uitvoeren Het uitvoeringsmodel van Python De verschillen tussen modules, scripts en programma’s 60 61 62 62 64 65 67 68 Handboek – Python 4 Een functie main met opdrachtregelargument maken Opdrachtregelargumenten accepteren Zen-moment Docstrings Commentaar Shebang Uitvoerbare Python-programma’s bij Linux en Mac Uitvoerbare Python-programma’s bij Windows Samenvatting 68 72 74 75 78 79 79 79 80 Ingebouwde typen en het objectmodel 83 De aard van objectreferenties in Python Een referentie opnieuw toekennen Een referentie aan een andere toekennen De waarde en de identiteit van objecten verkennen met id() Met is op gelijkwaardigheid van identiteit testen Muteren zonder te muteren Verwijzingen naar muteerbare objecten Gelijkheid van waarde (equivalentie) versus gelijkheid van identiteit De semantiek van argumenten – meegeven als objectreferentie Externe objecten in een functie aanpassen Nieuwe objecten in een functie koppelen Het meegeven van argumenten koppelt referenties De semantiek van return in Python Meer informatie over functieargumenten Standaardwaarden voor parameters Sleutelwoordargumenten Wanneer worden standaardargumenten geëvalueerd? Het typesysteem van Python Dynamische typering in Python Sterke typering in Python Variabelendeclaratie en scope LEGB Scopes in de praktijk Identieke namen in globale en lokale scope Het sleutelwoord global Zen-moment Alles is een object Een functie inspecteren Samenvatting 84 84 85 87 87 88 90 92 93 93 94 96 97 98 98 99 99 102 102 103 104 104 105 105 106 107 108 108 110 ix Inhoud 5 x Ingebouwde collectietypen 113 Inleiding tuple – een onveranderlijke reeks objecten Literal-tupels Toegang tot de elementen van een tupel De lengte van een tupel Iteratie langs een tupel Tupels samenvoegen en herhalen Geneste tupels Tupels met één element Lege tupels Optionele haakjes Tupels retourneren en uitpakken Variabelen uitwisselen door tupels uit te pakken De tupelconstructor Lidmaatschapstests Strings in actie De lengte van een string Strings samenvoegen Meerdere strings samenvoegen Strings splitsen Zen-moment Strings opdelen Stringopmaak Andere stringmethoden range – een collectie gelijkmatig verdeelde integers Startwaarde Het argument step Geen gebruikmaken van range: enumerate() list in actie Negatieve indexering voor lijsten (en andere reeksen) Lijsten slicen Lijsten kopiëren Ondiepe kopieën Lijsten herhalen Lijstelementen zoeken met index() Lidmaatschap testen met count() en in Lijstelementen via de index verwijderen met del Lijstelementen via de waarde verwijderen met remove() Elementen aan een lijst toevoegen Lijsten samenvoegen Lijstelementen ordenen Externe herschikking 114 114 114 114 114 115 115 115 115 116 116 116 117 118 118 118 118 119 120 120 121 121 122 123 124 124 125 126 127 127 128 131 132 136 138 139 139 139 140 140 141 142 Handboek – Python 6 dict – woordenboeken Woordenboeken kopiëren Woordenboeken bijwerken Itereren langs woordenboeksleutels Itereren langs woordenboekwaarden Itereren langs sleutel-waardeparen Op lidmaatschap testen bij woordenboeksleutels Woordenboekitems verwijderen Aanpasbaarheid van woordenboeken Leesbaar afdrukken set – ongeordende verzameling unieke elementen De set-constructor Itereren langs sets Lidmaadschapstest voor sets Elementen aan sets toevoegen Elementen uit sets verwijderen Sets kopiëren Rekenkundige bewerkingen bij set Verschil Collectieprotocollen Het protocol container Het protocol sized Het protocol iterable Het protocol sequence Andere protocollen Samenvatting 143 144 145 145 146 147 147 147 148 148 149 150 151 151 151 152 152 153 154 156 157 157 157 157 158 159 Exceptions 161 Wat is een exception? Uitzonderingen en het programmaverloop Exceptions verwerken Meerdere exceptions verwerken Programmeerfouten Lege blokken – de opdracht pass Exception-objecten Onverstandige retourcodes Exceptions opnieuw opwerpen Exceptions maken deel uit van de API van je functie Door Python opgeworpen exceptions Exceptions afvangen Exceptions expliciet opwerpen Exceptions vroeg detecteren 162 162 164 165 167 168 168 169 170 171 173 173 174 175 xi Inhoud 7 xii Exceptions, API’s en protocollen IndexError ValueError KeyError Geen voorzorgsmaatregelen nemen tegen TypeError Pythonische stijl – EAFP versus LBYL Opruimklussen Zen-moment Platformspecifieke code Samenvatting 177 178 178 178 179 180 182 183 184 186 Comprehensions, iterables en generators 187 Inleiding Comprehensions Lijst-comprehensions Set-comprehensions Woordenboek-comprehensions Comprehensions filteren Zen-moment Iteratieprotocollen Een voorbeeld van de iteratieprotocollen Een praktischer voorbeeld van de iteratieprotocollen Generatorfuncties Het sleutelwoord yield Generators zijn iterators Wanneer wordt generatorcode uitgevoerd? Een expliciete toestand in de generatorfunctie behouden Luie generator-pipelines Luiheid en het oneindige Generatorexpressies Batterijen meegeleverd: iteratie-tools De module itertools Sequenties met Booleaanse waarden Sequenties samenvoegen met zip() Luie concatenatie van sequenties met chain() Alles samenvoegen Samenvatting Generators Iteratie-tools 188 188 188 190 190 192 193 194 194 195 196 197 197 199 200 202 203 204 206 207 208 208 210 210 211 211 212 Handboek – Python 8 9 Met klassen nieuwe typen definiëren 213 Inleiding Klassen definiëren Instantiemethoden Instantie-initialisatie Het ontbreken van access-modifiers Validatie en invarianten Een tweede klasse toevoegen Collaborerende klassen Zen-moment Stoelen reserveren Stoelen aan passagiers toewijzen Methoden voor implementatiedetails relocate_passenger() implementeren Beschikbare stoelen tellen Soms is een functie het enige object dat je nodig hebt De klasse Flight instapkaarten laten maken Polymorfisme en duck-typing Aircraft herstructureren Overerving en het delen van implementaties Een basisklasse voor Aircraft Overerving van Aircraft Algemene functionaliteit in een basisklasse zetten Samenvatting 214 215 216 217 218 219 220 222 224 225 228 232 233 235 236 237 238 240 243 243 244 245 247 Bestanden en bronbeheer 249 Bestanden Binaire en tekstmodi Het belang van codering Een bestand openen om naar te schrijven Naar een bestand schrijven Bestanden sluiten Het bestand buiten Python Bestanden lezen Gegevens aan bestanden toevoegen Bestandsobjecten als iterators Contextmanagers Bronnen beheren met finally with-blokken Zen-moment Binaire bestanden Het bestandsformaat BMP 250 250 251 251 252 253 254 254 256 257 259 261 262 263 264 264 xiii Inhoud 10 11 xiv Bitoperatoren Een BMP-bestand schrijven Binaire bestanden lezen Bestandachtige objecten Je hebt al bestandachtige objecten gezien! Bestandachtige objecten gebruiken Andere bronnen Samenvatting 269 270 272 274 274 274 276 279 Tests uitvoeren met de standaardbibliotheek 281 Module unittest Testcases Fixtures Assertions Een voorbeeld van een unittest: tekstanalyse De eerste tests uitvoeren De test laten slagen Met fixtures tijdelijke bestanden maken De nieuwe fixtures gebruiken Met assertions gedrag testen Regels tellen Tekens tellen Testen op exceptions Testen of een bestand bestaat Zen-moment Samenvatting 282 282 282 283 283 284 285 286 287 289 290 291 293 294 295 296 Debuggen met PDB 297 Inleiding Opdrachten van de debugger Het debuggen van een palindroom Naar fouten zoeken met PDB Oneindige lussen proefondervindelijk opsporen Expliciete breekpunten instellen Door de uitvoering stappen De bug repareren Samenvatting 298 298 299 301 303 304 306 307 309 Handboek – Python A B C Index Virtuele omgevingen 311 Inleiding Een virtuele omgeving maken Een virtuele omgeving activeren Een virtuele omgeving deactiveren Andere tools voor virtuele omgevingen 312 312 313 313 314 Pakketten maken en distributie 315 Inleiding Een pakket configureren met distutils Installeren met distutils Pakketten maken met distutils 316 316 319 320 Pakketten van derden installeren 325 De installatie van pip Python Package Index Installeren met pip Lokale pakketten installeren met pip De installatie van pakketten ongedaan maken 326 326 326 328 328 Nawoord 329 331 xv 0 Inleiding – Wat is Python? Hoofdstuk 0 – Inleiding – Wat is Python? Het is een programmeertaal! Wat is Python eigenlijk? Het korte antwoord is dat Python een programmeertaal is. Deze taal is in de late jaren tachtig van de vorige eeuw in Nederland ontwikkeld door Guido van Rossum. Guido is nog steeds actief betrokken bij de ontwikkeling en evolutie van de taal, wat hem de eretitel ‘Benevolent Dictator for Life’ (welwillende dictator voor het leven) of kortweg BDFL heeft opgeleverd. Python is een open-source project dat door iedereen gratis kan worden gedownload en naar eigen inzicht kan worden gebruikt. De non-profitorganisatie Python Software Foundation (https://www.python.org/psf/) beheert het intellectuele eigendom, speelt een grote rol bij de promotie van de taal en financiert sommige onderdelen van de ontwikkeling. Technisch gezien is Python een sterk getypeerde taal. Dit betekent dat elk object een vaststaand type heeft, dat meestal niet te omzeilen is. Tegelijkertijd is Python dynamisch getypeerd, waardoor er geen typecontrole op je code wordt uitgevoerd voor de uitvoering ervan. Dit wijkt af van statisch getypeerde talen als C++ en Java, waarbij een compiler veel typecontroles voor je uitvoert en programma’s verwerpen die objecten misbruiken. De beste beschrijving van het typesysteem van Python is dat het duck-typing gebruikt, waarbij de geschiktheid van een object in een specifieke context op het moment van uitvoering wordt bepaald. Dit onderwerp komt uitgebreid in hoofdstuk 8 aan bod. Python is een algemene programmeertaal. Het is niet bedoeld voor een specifiek domein of een vaststaande omgeving, maar kan worden ingezet voor een grote verscheidenheid aan taken. Er zijn natuurlijk gebieden waar Python minder geschikt voor is dan andere talen, zoals extreem tijdgevoelige of geheugenbeperkte omgevingen, maar over het algemeen is Python net zo flexibel en aanpasbaar als andere moderne programmeertalen en soms zelfs flexibeler en aanpasbaarder. Python is een geïnterpreteerde taal. Eigenlijk klopt dit technische gezien niet helemaal, want Python wordt wel degelijk voor de uitvoering normaal gecompileerd tot een vorm van bytecode. Maar deze compilatie wordt onzichtbaar uitgevoerd, waardoor Python de code onmiddellijk lijkt uit te voeren zonder waarneembare compileerfase. Dit ontbreken van een extra stap tussen bewerking en uitvoering is een van de grote voordelen van het werken met Python. De syntaxis van Python is ontworpen om duidelijk, leesbaar en expressief te zijn. In tegenstelling tot veel andere populaire talen maakt Python gebruik van witruimte om codeblokken te markeren en heeft het hierdoor geen overbodige haakjes nodig om een universele indeling af te dwingen. Hierdoor ziet alle Python-code er in hoofdlijnen hetzelfde uit en leer je snel hoe je Python- 2 Handboek – Python programma’s leest. Bovendien zorgt de expressieve syntaxis ervoor dat je veel betekenis aan een regel code kunt toevoegen. Dankzij de expressieve, leesbare code is het beheer in Python betrekkelijk eenvoudig. Er zijn veel verschillende implementaties van de taal Python. De oorspronkelijke (en nog steeds meestgebruikte) implementatie is in C geschreven. Deze versie wordt meestal aangeduid met CPython. Als iemand zegt dat hij Python ‘uitvoert’, kun je ervan uitgaan dat hij het over CPython heeft. Dit is de implementatie die in dit boek wordt gebruikt. Andere implementaties van Python zijn: • Jython (http://www.jython.org/), geschreven voor Java Virtual Machine • IronPython (http://ironpython.net/), geschreven voor het platform .NET • PyPy (http://pypy.org/), geschreven in de taal RPython (nogal circulair), bedoeld voor het ontwikkelen van dynamische talen als Python Deze implementaties volgen over het algemeen CPython, dat beschouwd wordt als de ‘standaard’ van de taal. Veel van wat je in dit boek leest, is op alle implementaties van toepassing. Versies van de taal Python Er worden op dit moment twee belangrijke versies van de taal Python gebruikt: Python 2 en Python 3. Deze twee versies verschillen op belangrijke punten van elkaar, waardoor code voor een van deze versies vaak niet bij de andere werkt, tenzij je voorzorgsmaatregelen neemt. Python 2 is ouder en bekender dan Python 3 (Al zijn steeds meer projecten voornamelijk of zelfs alleen maar voor Python 3 bedoeld), maar in Python 3 zijn beperkingen van de oudere versie verbeterd. Python 3 is de toekomst van Python, dus maak er gebruik van. Er zijn weliswaar grote verschillen tussen Python 2 en 3, maar de beginselen van beide versies zijn identiek. Leer je een versie kennen, dan is je kennis ook op de andere versie toepasbaar. In dit boek gebruiken we Python 3 en wijzen we je op belangrijke verschillen met Python 2 als dat nodig is. 3 Hoofdstuk 0 – Inleiding – Wat is Python? Het is een standaardbibliotheek! Naast de programmeertaal biedt Python een krachtige en uitgebreide standaardbibliotheek. Een onderdeel van de Python-filosofie is ‘batterijen worden meegeleverd’, wat inhoudt dat Python geschikt is voor veel complexe, praktische taken zonder noodzaak pakketten van derden te installeren. Dit is niet alleen bijzonder handig, maar betekent ook dat je Python sneller leert kennen door gebruik te maken van interessante voorbeelden: iets wat we in dit boek dan ook zeker proberen te doen! Een ander voordeel van de aanpak ‘batterijen meegeleverd’ is dat veel scripts, zelfs uitgebreide exemplaren, rechtstreeks bij elke Python-installatie kunnen worden uitgevoerd. Dit in tegenstelling tot andere programmeertalen, waarbij je vaak een vervelende drempel hebt door het installeren van extra software. De documentatie van de standaardbibliotheek is van hoge kwaliteit. De API’s zijn uitstekend gedocumenteerd en de modules hebben vaak een goede beschrijving met duidelijke uitleg over de manier waarop je ze inzet. De documentatie van de standaardbibliotheek vind je online (https://docs.python.org/ 3/library/index.html), maar kun je ook lokaal installeren als je wilt. Aangezien de standaardbibliotheek zo’n belangrijk onderdeel van Python is, kom je overal in dit boek onderdelen ervan tegen. Toch is het niet mogelijk meer dan een klein gedeelte ervan te behandelen, dus we raden je aan de rest zelf te verkennen. Het is een filosofie Een beschrijving van Python zou onvolledig zijn zonder te melden dat Python voor veel mensen een filosofie voor het schrijven van code voorstelt. Principes van helderheid en leesbaarheid maken deel uit van het schrijven van correcte, oftewel Pythonische code. Het is niet altijd duidelijk wat met Pythonisch wordt bedoeld en soms is er meer dan één manier om iets correct te schrijven. Maar het feit dat de Python-gemeenschap belang hecht aan zaken als eenvoud, leesbaarheid en duidelijkheid betekent dat Python-code er over het algemeen fraai uitziet. Veel Python-principes zijn samengevat in de zogenoemde Zen van Python (zie https://www.python.org/dev/peps/pep-0020/). Deze ‘zen’ bestaat niet uit strenge regels, maar meer uit richtlijnen en aanbevelingen om tijdens het programmeren rekening mee te houden. Als je tussen verschillende manieren van werken kunt kiezen, geven deze principes je vaak een duwtje in de juiste richting. In dit boek kom je overal onderdelen van de zen van Python tegen. 4 Handboek – Python Je reis begint... We vinden Python een prachttaal en helpen je graag je weg erin te vinden. Tegen de tijd dat je dit boek uit hebt, ben je in staat omvangrijke Pythonprogramma’s te schrijven en nog complexere te lezen. Belangrijker is het dat dan de basis is gelegd voor het uitbouwen van je kennis met geavanceerde onderwerpen; hopelijk hebben we je enthousiasme aangewakkerd om dit ook daadwerkelijk te doen. Het is een avontuur om alles wat Python te bieden heeft te ontdekken, want het is een omvangrijke taal met een enorm uitgebreid ecosysteem aan ingebouwde en er rond omheen gebouwde software. Welkom bij Python! 5 1 Aan de slag I n dit hoofdstuk lees je hoe je Python downloadt en installeert met Windows, Ubuntu Linux of macOS. Je gaat eenvoudige Python-code schrijven en maakt kennis met de beginselen van de programmeercultuur van Python, zoals de Zen ven Python, terwijl je de komische oorsprong van de naam van de taal niet uit het oog verliest. Je leert in dit hoofstuk: Hoe en waar je Python downloadt. Hoe je Python installeert op Windows, macOS en Linux. Hoe je de shell start en verlaat. Hoe je code vormgeeft. Werken met gegevenstypen, operatoren en lussen. Hoofdstuk 1 – Aan de slag Python 3 ophalen en installeren Er zijn twee belangrijke versies van de programmeertaal Python: Python 2, de algemeen gebruikte versie en Python 3, het heden en de toekomst van de taal. Veel Python-code werkt naar behoren zonder conversie tussen de laatste versie van Python 2 (Python 2.7) en recente versies van Python 3, zoals Python 3.6 (https://www.python.org/downloads/). Er zijn echter wel enkele belangrijke verschillen tussen de grote versies, waardoor ze strikt genomen niet compatibel zijn. In dit boek gebruiken we Python 3 en melden we de grote verschillen met Python 2. Aangezien die boek over de basiselementen van Python gaat, is de kans groot dat de inhoud ervan ook van toepassing is op toekomstige versies van Python 3, dus wees niet terughoudend om die uit te proberen als ze beschikbaar zijn. Voordat je in Python kunt programmeren, moet je een Python-omgeving downloaden. Python is een bijzonder flexibele taal die voor alle grote besturingssystemen beschikbaar is. Je kunt de voorbeelden in dit boek maken op een computer met Windows, macOS X of Linux; de enige paragrafen met platformspecifieke uitleg volgen hierna, voor de installatie van Python 3. Je hoeft hiervan alleen de paragraaf te lezen die voor jou van toepassing is. Windows 1 Voor een installatie op Windows ga je naar de officiële Python-website (https://www.python.org) en klik je op de downloadlink. Kies het installatieprogramma dat bij het platform past, 32- of 64-bits. 2 Download het installatieprogramma en voer het uit. 3 Geef aan of je Python voor jezelf of voor alle gebruikers van de computer wilt installeren. 4 Kies een locatie voor de Python-distributie. De standaardlocatie voor Python 3.5 is C:\Python35 op het schijfstation C:. We raden je aan Python niet in de map Program Files te zetten, want deze sinds Windows Vista gebruikte virtuele bestandsopslag om toepassingen van elkaar te scheiden kan problemen opleveren met het snel installeren van Python-pakketten van derden. 5 We raden je aan op de pagina Customize Python van het installatieprogramma de standaardinstellingen te gebruiken, die vergen minder dan 40 MB opslagruimte. 6 Het installatieprogramma installeert niet alleen de Python-runtime en de standaardbibliotheek, maar registreert ook verschillende bestandstypen bij de Python-interpreter, zoals *.py. 7 Nadat Python is geïnstalleerd, moet je Python toevoegen aan de omgevingsvariabele PATH van het systeem. Kies hiertoe in het Configuratie- 8 Handboek – Python scherm eerst de categorie Systeem en beveiliging en dan Systeem. Een andere manier om dit venster te openen is met ingedrukte Windows-toets op toets Break op je toetsenbord te drukken. Klik aan de linkerkant van het venster op Geavanceerde systeeminstellingen om het tabblad Geavanceerd van het dialoogvenster Systeemeigenschappen in beeld te brengen. Klik op de knop Omgevingsvariabelen om het bijbehorende dialoogvenster te openen. 8 Heb je beheerdersprivileges (Administrator), dan kun je de paden C:\Python35 en C:\Python35\Scripts toevoegen aan de met puntkomma’s van elkaar gescheiden lijst met items die bij de systeemvariabele PATH hoort. Is dit niet het geval, dan maak je een variabele PATH (of pas je een bestaande versie aan) voor jouw gebruiker met dezelfde waarden. 9 Open nu een nieuw consolevenster, Powershell of cmd voldoet, en controleer of je Python vanaf de opdrachtregel kunt uitvoeren: > python Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. >>> Welkom bij Python! De prompt met drie pijlpunten geeft aan dat Python op je invoer wacht. Je mag de volgende paragrafen over de installatie van Python bij Mac en Linux overslaan. macOS 1 Voor een installatie op macOS moet je de officiële Python-website op http://python.org bezoeken. Klik eerst op de link Downloads en dan op de versie van Python die je wilt installeren. 2 Er wordt een DMG-schijfkopie gedownload die je in de stapel Downloads of in de Finder kunt openen. 3 In het Finder-venster vind je het installatiebestand Python.mpkg. Klik met de secundaire of rechtermuisknop om het contextmenu van dit bestand te openen en kies de optie Open. 4 Bij sommige versies van OS X krijg je de melding dat het bestand van een onbekende ontwikkelaar afkomstig is. Klik in dit dialoogvenster op Open om door te gaan met de installatie. 5 Volg de aanwijzingen van het installatieprogramma van Python. 6 Het is niet nodig de installatie te configureren; gebruik gewoon de standaardinstellingen. Zodra de knop Installeren zichtbaar wordt, klik je erop. Misschien moet je je wachtwoord invoeren voordat de installatie begint. Nadat de installatie is voltooid, sluit je het installatievenster. 9 Hoofdstuk 1 – Aan de slag 7 Na de installatie van Python 3 open je een terminalvenster en controleer je of je Python 3 op de opdrachtregel kunt starten: $ python Python 3.5.0 (default, Nov 3 2015, 13:17:02) [GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin Type “help”, “copyright”, “credits” or “license” for more information. >>> Welkom bij Python! De prompt met drie pijlpunten geeft aan dat Python op je invoer wacht. Linux 1 Gebruik de pakketbeheerder om Python voor een installatie op Linux. We laten zien hoe dit bij een recente versie van Ubuntu in zijn werk gaat, al gaat dit proces op bijna dezelfde manier bij de meeste andere moderne Linux-distributies. 2 Bij Ubuntu start je het ‘Ubuntu Softwarecentrum’. Vaak kun je hiertoe op een knop in de launcher klikken. Maar je kunt het ook via het dashboard uitvoeren door te zoeken naar ‘Ubuntu Softwarecentrum’ en dan op de selectie te klikken. 3 In het softwarecentrum typ je python 3.5 in het zoekvak rechtsboven en druk je op Return. 4 Een van de resultaten die je te zien krijgt, is “Python (v3.5)” met klein eronder “Python Interpreter (v3.5)”. Selecteer dit item en klik op de installatieknop die erbij verschijnt. 5 Misschien moet je je wachtwoord opgeven om de software te kunnen installeren. 6 Er hoort een voortgangsindicator te verschijnen die weer verdwijnt nadat de installatie is voltooid. 7 Open een terminal (met Ctrl-Alt-T) en controleer of je Python 3.5 vanaf de opdrachtregel kunt uitvoeren: $ python3.5 Python 3.5.0+ (default, Oct 11 2015, 09:05:38) [GCC 5.2.1 20151010] on linux Type “help”, “copyright”, “credits” or “license” for more information. >>> Welkom bij Python! De prompt met drie pijlpunten geeft aan dat Python op je invoer wacht. 10 Handboek – Python De shell van Python starten Nadat je Python hebt geïnstalleerd, kun je er direct mee aan de slag gaan. De shell van Python is een handig hulpmiddel om de taal te leren kennen, wat te experimenteren en snelle test uit te voeren tijdens de softwareontwikkeling. De shell is de opdrachtregelomgeving van Python, een zogeheten Read-EvalPrint-Loop. Python leest (Read) de invoer, Evalueert die, Print het resultaat en keer terug (Loop) naar het begin. Naar deze opdrachtregelomgeving wordt ook wel verwezen met het acroniem ‘REPL’. Na te zijn gestart, toont de shell wat informatie over de versie van Python die je gebruikt, gevolgd door een prompt met drie pijlen. Deze prompt laat je weten dat Python op invoer wacht. Tijdens een interactieve Python-sessie kun je fragmenten van Pythonprogramma’s invoeren, waarna je direct resultaat te zien krijgt. Laten we met een paar eenvoudige sommen beginnen: >>> 2 + 2 4 >>> 6 * 7 42 Zoals je ziet, leest Python de invoer, evalueert die, print Python het resultaat en keert hij terug om opnieuw te beginnen. Je kunt variabelen toekennen in de shell: >>> x = 5 de inhoud ervan afdrukken door eenvoudigweg de naam ervan te typen: >>> x 5 en ernaar verwijzen in expressies: >>> 3 * x 15 In de shell gebruik je een van de weinige obscure verkorte notaties van Python, de onderstrepingsvariabele, om naar de laatst afgedrukte waarde te verwijzen: 11 Hoofdstuk 1 – Aan de slag >>> _ 15 Deze onderstrepingsvariabele mag je ook in een expressie gebruiken: >>> _ * 2 30 Alleen in de shell Onthoud dat dit nuttige trucje alleen in de shell werkt; de onderstreping heeft geen speciale betekenis in Python-scripts of -programma’s. Je ziet dat niet alle opdrachten een retourwaarde geven. Bij het toekennen van de waarde 5 aan x was er geen retourwaarde; je maakt er alleen de variabele x mee. Andere opdrachten hebben duidelijkere bijwerkingen. Probeer het volgende eens: >>> print(‘Hello, Python’) Hello, Python Je ziet dat Python deze opdracht onmiddellijk evalueert en uitvoert, de string ‘Hello, Python’ afdrukt en dan terugkeert met een prompt. Het is belangrijk dat je beseft dat deze reactie niet het gevolg is van de expressie die de REPL, oftewel de shell evalueert en weergeeft, maar een bijwerking is van de functie print(). Print() De functie print is een van de grootste verschillen tussen Python 2 en Python 3. In Python 3 zijn de haakjes verplicht, terwijl ze het in Python 2 niet waren. Dit komt doordat print() in Python 3 een functieaanroep is. Verderop lees je meer over functies. De shell verlaten Het is ook belangrijk dat je weet hoe je de shell afsluit om naar de systeemprompt terug te keren. Dit doe je door de stuurcode einde bestand (end-of-file) aan Python te sturen, al gaat dit helaas op verschillende manieren bij verschillende platforms. 12 Handboek – Python Windows Bij Windows gebruik je de toetsencombinatie Ctrl-Z om de shell af te sluiten. Mac/Unix Bij een Mac of Linux gebruik je de toetsencombinatie Ctrl-D om de shell af te sluiten. Maak je regelmatig van verschillende platforms gebruik en gebruik je per ongeluk Ctrl-Z op een Unix-achtige computer, dan pauzeer je de Python-interpreter en keer je terug naar de shell van het besturingssysteem. Je activeert Python dan opnieuw door er simpelweg met de opdracht fg een voorgrondproces van te maken: {lang="text"} $ fg Druk daarna een paar keer op Enter om de prompt met drie pijlen van Python terug te halen. Codestructuur en significante inspringing Start de Python 3-interpreter: {language=doscon} > python bij Windows of: {language=shell} $ python3 op een Mac of bij Linux. De structuren voor het programmaverloop van Python, zoals for-lussen, whilelussen en if-opdrachten, worden allemaal ingeleid met opdrachten die met een dubbele punt eindigen om aan te geven dat wat volgt de inhoud van de opdracht is. Een for-lus heeft bijvoorbeeld inhoud nodig, dus als je het volgende invoert: >>> for i in range(5): ... 13 Hoofdstuk 1 – Aan de slag toont Python een prompt met drie punten om naar die inhoud te vragen. Een opvallend (en soms controversieel) aspect van Python is dat beginspaties syntactisch van belang zijn. Dit houdt in dat Python verschillende niveaus inspringing gebruikt om codeblokken te markeren in plaats van de accolades van andere programmeertalen. Moderne Python-code wordt volgens de conventie met vier spaties per niveau ingesprongen. Dus nadat Python de prompt met drie stippen toont, voeren we vier spaties in en een opdracht die de inhoud van de lus vormt: ... x = i * 10 Bij de inhoud van de lus komt nog een tweede opdracht, dus nadat we op Return hebben gedrukt, voeren we weer vier spaties in, gevolgd met een aanroep naar de ingebouwde functie print(): ... print(x) Om het codeblok te voltooien, voer je een lege regel in de shell in: ... Nadat het codeblok is voltooid, voert Python de ingevoerde code uit en worden de veelvouden van 10 getoond die kleiner zijn dan 50: 0 10 20 30 40 Kijk je naar een scherm dat vol met Python-code staat, dan zie je dat de inspringing duidelijk overeenkomt (en ook moet overeenkomen) met de structuur van het programma; dat zie je goed in de afbeeldingen op de pagina hiernaast. De programmastructuur is ook duidelijk zichtbaar als de code wordt vervaagd. significant_whitespace_barspng Elke opdracht die met een dubbele punt wordt afgesloten, leidt tot een nieuwe regel en een extra niveau inspringing. Dit gaat net zo lang door tot een uitspringing naar een eerder niveau terugkeert. Elk niveau inspringing heeft standaard vier spaties; verderop lees je meer over de regels. 14 Handboek – Python Afbeelding 1.1 Python-broncode. Afbeelding 1.2 Vervaagde code. 15 Hoofdstuk 1 – Aan de slag Pythons aanpak van significante witruimte heeft drie grote voordelen: 1 Ontwikkelaars worden gedwongen één niveau inspringing in een codeblok te gebruiken. Dit wordt over het algemeen in alle talen als een verstandige aanpak beschouwd omdat de code er veel leesbaarder door wordt. 2 Code met significante witruimte hoeft niet volgepropt te worden met overbodige accolades en er ontstaan nooit discussies over de locatie van de accolades. Alle codeblokken zijn in Python duidelijk herkenbaar en worden door iedereen op dezelfde manier geschreven. 3 Significante witruimte vereist een consistente interpretatie van de codestructuur door de auteur, het runtimesysteem van Python en toekomstige programmeurs die de code moeten lezen. Hierdoor is het in een programma niet mogelijk een codeblok volgens Pythons gezichtspunt te hebben dat niet op een blok uit menselijk perspectief lijkt. De regels voor de inspringing bij Python lijken misschien gecompliceerd, maar zijn in de praktijk erg eenduidig. • De gebruikte witruimte mag uit spaties en tabs bestaan. Algemeen geldt dat spaties de voorkeur hebben boven tabs en dat vier spaties de standaard is in de Python-gemeenschap. • Een belangrijke regel is dat je nooit spaties en tabs mag combineren. De Python-interpreter accepteert dit niet en je collega’s zullen je met de nek aankijken. • Het is toegestaan verschillende hoeveelheden inspringing op verschillende momenten te gebruiken. De belangrijkste regel is dat opeenvolgende regels code op hetzelfde inspringingsniveau als onderdeel van hetzelfde codeblok worden beschouwd. • Er zijn enkele uitzonderingen op deze regels, maar die hebben bijna altijd te maken met het verbeteren van de leesbaarheid, bijvoorbeeld door onvermijdelijke lange opdrachten over meerdere regels te verdelen. Deze rigoureuze aanpak bij het opmaken van code is ‘Programmeren zoals Guido het bedoelde’. Een filosofie waarbij veel waarde wordt gehecht aan codekwaliteiten, zoals leesbaarheid, raakt de kern van de Python-cultuur, iets waar we het nu over gaan hebben. 16