Python Cursus - Inleiding

Door naar de Opgaven
Terug naar de cursus pagina

Hoofdstuk 1 - Inleiding


Computers zijn prachtige machines. De meeste machines (auto’s, televisies, magnetrons) zijn gemaakt voor een specifiek doel dat ze effectief en efficiënt kunnen bereiken. Computers daarentegen zijn doelloze machines, die alles wat je maar wilt aangeleerd kunnen krijgen. De kunde die je in staat stelt om computers te laten doen wat je wilt, heet “programmeren.”

In iedere wetenschappelijke richting en in elk beroep, moeten mensen vandaag de dag omgaan met grote hoeveelheden data. Zij die in staat zijn de kracht van computers in te zetten om gebruik te maken van die data, met andere woorden, zij die kunnen programmeren, zijn veel beter in staat hun beroep uit te oefenen dan zij die dat niet kunnen. Ik durf zelfs te stellen dat in de zeer nabije toekomst zij die niet kunnen programmeren niet meer arbeidsgeschikt zijn. Daarom zie ik het als een noodzaak dat iedereen tijdens zijn of haar opleiding leert programmeren.

Programmeren betekent niet alleen dat je weet wat programmeerregels doen; het betekent ook dat je kunt denken als een programmeur, en dat je problemen kunt analyseren vanuit het perspectief dat ze opgelost moeten worden door een computer. Deze vaardigheden kun je niet leren uit een boek. Je kunt ze alleen leren door daadwerkelijk programma’s te maken.

Deze cursus is geschreven om je de basis van de Python 3 computertaal te leren. Met dit boek leer je niet alleen de taal te gebruiken, maar doe je er ook oefeningen mee.


Aannames en veronderstellingen

Deze cursus gaat er van uit dat je geen programmeervaardigheden hebt, maar dat je die wilt aanleren. Het veronderstelt ook dat je in ieder geval het vermogen hebt om abstract te denken.

Realiseer je dat om te leren programmeren je een flinke hoeveelheid tijd moet investeren. Je kunt niet volstaan met het materiaal doorlezen en hier en daar een kleine oefening doen. Je moet daadwerkelijk met de stof oefenen door ook de grotere opgaven te doen.


Waarom Python?

Python wordt door velen gezien als een taal die bij uitstek geschikt is om mensen te leren programmeren. Het is een krachtige taal, die gemakkelijk te gebruiken is, en die alle mogelijkheden biedt die andere talen ook bieden. Je kunt Python programma’s draaien op verschillende machines en verschillende besturingssystemen. Het is gratis verkrijgbaar. Voor beginnende programmeurs heeft het het voordeel dat het dwingt om nette code te schrijven. Python wordt ook in de praktijk veel gebruikt, soms als basis voor complete programma’s, soms als uitbreiding op programma’s die in een andere taal geschreven zijn.

Het belangrijkste voordeel is dat Python het mogelijk maakt om je te concentreren op “denken als een programmeur,” in plaats van op alle excentrieke afwijkingen die een specifieke taal heeft. Hier volgt een voorbeeld van het verschil tussen Python en een aantal andere populaire programmeertalen: Het eerste programma dat iedereen schrijft in een computertaal is Hello World. Dit is een programma dat de tekst “Hello, world!” op het scherm zet. In de zeer populaire taal C++, wordt Hello World als volgt gecodeerd:

#include <iostream>
int main() {
    std::cout << "Hello, world!";
}

In C#, de populaire variant can C++ die uitgebracht is door Microsoft, is het:

using System;
namespace HelloWorld {
    class Hello {
        static void Main() {
            Console.WriteLine( "Hello, world!" );
            Console.ReadKey();
        }
    }
}

In Objective-C, Apple’s variant op C++, is het nog erger:

#import <Foundation/Foundation.h>
int main ( int argc, const char * argv[] ) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLog (@"Hello, world!");
    [pool drain];
    return 0;
}

In Java, dat voor veel studenten aan universiteiten en hogescholen de eerst-geleerde taal is, wordt het:

class Hello {
    public static void main( String[] args ) {
        System.out.println( "Hello, world!" );
    }
}

En zie nu wat Hello World in Python is:

print( "Hello, world!" )

Ik neem aan dat we het met elkaar eens zijn dat de Python versie van dit programma leesbaarder en begrijpelijker is dan de andere varianten – zelfs als je de taal niet kent.


Python’s beperkingen als programmeertaal

Python is een universele programmeertaal. Dat betekent dat je het kunt gebruiken voor alles wat je maar met een programmeertaal zou willen of kunnen doen. Mag je dan concluderen dat als je eenmaal Python beheerst, je nooit meer een andere taal hoeft te leren?

Het antwoord is dat dat afhangt van wat je wilt bereiken. Python kun je inderdaad voor alles gebruiken, maar het is niet voor alles het meest geschikt. Bijvoorbeeld, game ontwikkelaars gebruiken meestal C++ of C#, omdat die talen heel snelle programma’s opleveren, en snelheid is van groot belang voor games. Mensen die complexe statistische berekeningen moeten doen hebben ook hun eigen talen. Soms moet je programma’sschrijven die moeten samenwerken met andere programma’s die in een specifieke taal geschreven zijn, en moet je ook die taal gebruiken. En voor sommige programmeertaken zijn talen met een andere filosofie tot het schrijven van code het meest geschikt.

Samenvattend heeft Python op zich geen beperkingen, maar zijn voor specifieke problemen specifieke andere talen geschikter. Dat gezegd hebbende, voor de meeste mensen is kennis van Python voldoende om alles te doen wat nodig is voor hun studie of beroep. Daarbij komt dat als je eenmaal Python beheerst, je een sterke basis hebt om andere talen te leren. Daarom denk ik dat Python uitermate geschikt is om beginnelingen te leren programmeren.


Wat betekent “denken als een programmeur?”

Dit boek heeft niet alleen als doel om je Python te leren, maar ook om je te leren denken als een programmeur, omdat denken als een programmeur noodzakelijk is om te begrijpen waarvoor je computers kunt gebruiken en hoe je ze moet gebruiken. Maar wat betekent het om te “denken als een programmeur”? Ik zal die vraag beantwoorden door hem te illustreren met een taak:

Stel je voor dat je een stapel kaarten hebt, en op iedere kaart staat een verschillend getal geschreven. Je moet deze kaarten sorteren van laag naar hoog, met het laagste getal bovenop. De meeste mensen kunnen die taak uitvoeren. Voor de meeste mensen geldt ook dat als je ze vraagt hoe ze de taak uitvoeren, ze je vragend aan zullen kijken en zeggen: “Eh..., ik sorteer ze van laag naar hoog... wat bedoel je met hoe ik dat doe?” Anderen zullen zeggen: “Ik zoek eerst de hoogste kaart en die leg ik onderop. Dan zoek ik de op-een-na-hoogste en die leg ik erbovenop. Enzovoorts.” Dit legt min of meer uit hoe ze het doen, maar als je dan vraagt: “Maar hoe vind je de hoogste kaart?” zullen ze je ook vragend aankijken.

Het probleem is dat als je een computer moet uitleggen hoe een stapel kaarten gesorteerd moet worden, je niet kunt veronderstellen dat de computer iets kan met vage uitspraken, zelfs als die uitspraken voor mensen duidelijk zijn. Je kunt niet tegen de computer zeggen: “Zoek de hoogste kaart,” want zelfs als de computer Nederlands zou begrijpen, dan zou hij nog vragen hoe hij de hoogste kaart moet vinden. Je moet heel expliciet zijn over de handelingen die moeten worden uitgevoerd. Je moet iets zeggen als: “Neem de bovenste kaart in je linkerhand. Doe dan het volgende totdat de stapel leeg is: Neem de bovenste kaart in je rechterhand. Als het getal op de kaart in je rechterhand hoger is dan het getal op de kaart in je linkerhand, dan stop je de kaart in je linkerhand in de aflegstapel en stopt de kaart in je rechterhand in je linkerhand. Anders stop je de kaart in je rechterhand in de aflegstapel. Als de stapel leeg is en je rechterhand ook leeg is, is de kaart in je linkerhand de hoogste kaart.”

Natuurlijk heeft een computer geen handen en begrijpt hij ook geen Nederlands. Maar een computer begrijpt wel computertaal. Computertalen hebben een zeer precieze syntax en een zeer precieze semantiek, wat betekent dat een programma een ondubbelzinnige manier is om te beschrijven hoe een taak uitgevoerd moet worden. Dus om een computer een taak uit te laten voeren, moet je met behulp van een computertaal de computer stap voor stap uitleggen hoe de taak uitgevoerd moet worden. Slechts dan kan de computer de taak uitvoeren.

Omdat het vaak lastig is om alle stappen te overzien die een computer moet zetten om een taak uit te voeren, moet je de taak verdelen in kleinere subtaken, die je misschien ook weer moet opdelen in subtaken, totdat de subtaken zo klein zijn dat je gemakkelijk de stappen kunt zien die je nodig hebt om zulke subtaken uit te voeren. Je kunt dan ieder van de subtaken implementeren, en ze samenvoegen om een programma voor de grote taak te vormen.

Denken als een programmeur betekent dat je een taak kunt beschouwen vanuit het perspectief dat een computerprogramma geschreven moet worden om de taak op te lossen, dat je in staat bent een logische opdeling van een taak in subtaken te maken, en dat je kunt herkennen wanneer de subtaken klein genoeg zijn dat je ze kunt implementeren. Dit is een vaardigheid die de meeste mensen kunnen leren, maar die veel oefening vereist omdat er een denkproces voor nodig is dat anders is dan waar de meeste mensen aan gewend zijn.

Door te leren programmeren in Python, beginnend met kleine programma’s die groeien in complexiteit, breng je jezelf langzaamaan ook de denkprocessen bij die een programmeur van nature beheerst.


De kunst van het programmeren

Programmeren is een kunstvorm. Een docent programmeren is in veel opzichten vergelijkbaar met een tekenleraar.

Veel mensen krijgen tekenlessen op de middelbare school. Een tekenleraar vertelt eerst over materialen: potloden en papier, verschillende kleuren, verschillende hardheden, gummen, inkt, inktpennen, verf, etcetera. De leerlingen maken hun eerste tekeningen en schilderijen op basis van die kennis. De leraar legt technieken uit: het mengen van verf, het creëren van speciale effecten, de combinatie van technieken, het gebruiken van perspectief, etcetera. De leerlingen krijgen opdrachten als “teken een kat,” en de leraar geeft een beoordeling zowel wat betreft het gebruik van materialen als in hoeverre wat door de leerlingen geproduceerd wordt daadwerkelijk lijkt op een kat.

Een docent programmeren heeft vergelijkbare taken. Eerst vertelt hij de studenten over programmeerprincipes, basis taalelementen die in iedere computertaal aanwezig zijn. Hij vertelt hoe die taalelementen gebruikt kunnen worden om eenvoudige programma’s te schrijven. Daarna gaat hij dieper op de taal in, en bespreekt geavanceerde technieken die de studenten kunnen gebruiken om complexere programma’s te maken, en lastige concepten op een eenvoudige manier in programma’s op te nemen. Studenten krijgen worden.opdrachten als “schrijf een programma dat een tekst alfabetiseert,” en ze worden beoordeeld zowel op de mate waarin ze programmeertechnieken beheersen, als in hoeverre hun programma’s in staat zijn de taak uit te voeren.

Een tekenleraar zal stellen dat een student die voor de opdracht “teken een kat” een cirkel met twee driehoekjes erboven en twee puntjes in het midden inlevert weliswaar een kat heeft getekend, maar niet de materiaaltechnieken beheerst. Een student die een prachtige tekening van een boom inlevert is misschien een meester in materiaaltechnieken, maar kan ze niet gebruiken om een taak uit te voeren. En twee studenten die precies dezelfde tekening van een kat inleveren, hebben overduidelijk plagiaat gepleegd. Dat gezegd hebbende, er is niet slechts één acceptabele tekening van een kat. Er zijn vele mogelijke tekeningen van een kat die leerlingen kunnen inleveren om aan te tonen dat ze op weg zijn artiesten te worden.

Op dezelfde wijze wil een docent programmeren die een opdracht geeft, zien dat zijn studenten de kennis die ze hebben opgedaan creatief inzetten om een versie van een programma te creëren dat aan de opdracht voldoet. Studenten die de technieken niet beheersen kunnen de taak niet oplossen, of kunnen slechts een gedeeltelijke oplossing inleveren. Studenten die de technieken wel beheersen kunnen nog steeds niet in staat zijn om wat ze hebben geleerd te combineren op nieuwe, originele manieren om een oplossing te produceren. En twee studenten die exact dezelfde oplossing inleveren, hebben die ergens vandaan gekopieerd en proberen weg te komen met plagiaat.

Programmeren is een kunstvorm, waarvoor je niet alleen technieken moet leren beheersen, maar ook moet leren die technieken op een creatieve manier in te zetten om problemen op te lossen. Het grootste verschil tussen het bouwen van programma’s en het maken van schilderijen is dat je wat betreft schilderen nog kunt debatteren of een plaatje van een bulldog met puntoren volstaat als weergave van een kat, terwijl het bij programmeren veel gemakkelijker is om programma’s te diskwalificeren als oplossing voor een specifiek probleem.

Iedereen weet dat je nooit een goede artiest zult worden als je alleen materialen bestudeert. Je moet met de materialen oefenen, en je vaardigheden trainen door verschillende taken uit te voeren. Voor programmeren geldt precies hetzelfde: je kunt niet leren programmeren zonder een hoop programma’s te schrijven. Programmeren vereist niet alleen kennis, maar ook vaardigheden die door toepassing ontwikkeld worden, en een soort creativiteit die je in staat stelt je vaardigheden uit te breiden en nieuwe taken aan te pakken.

Het ligt voor de hand dat er slechts weinig meester-kunstenaars zijn wiens werk in tentoonstellingen te zien is. Maar we kunnen allemaal tekeningen van een kat maken, en dat volstaat voor wat we dagelijks nodig hebben. Op dezelfde manier zijn slechts weinigen in de wieg gelegd om meester-programmeur te worden, maar dat is voor de meesten onder ons ook niet nodig zolang we maar in staat zijn om de programmeerproblemen op te lossen die we tegenkomen in studie en werk. Maar besef wel dat het niet volstaat om slechts de basistechnieken te beheersen: creativiteit is altijd nodig.


Groei van klein naar groot

Dit is niet de enige beschikbare Pythoncursus, maar de meeste boeken veronderstellen behoorlijk wat achtergrondkennis en ervaring. Boeken voor beginners zijn zeldzaam. Een groot probleem met Pythoncursussen voor beginners is dat ze programmeren aantrekkelijk proberen te maken door van meet af aan applicaties te maken die nuttig of leuk zijn. Een typische titel is “Leer Games Maken met Python!”

Een dergelijke aanpak is misleidend. Op de eerste plaats, als je zulke boeken doorneemt, zul je ontdekken dat er slechts eenvoudige woord- en getalspelletjes worden gebouwd, en niet de nieuwe Halo, Civilization, Bejeweled, of zelfs iets simpels als Flappy Bird. Dit is niet wat een student verwacht van een boek over games programmeren. Bovendien zul je ontdekken dat zelfs de simpele spelletjes die het boek gebruikt te lastig zijn voor nieuwelingen om te leren programmeren. Ik snap dat een dergelijk boek enthousiasme bij de studenten probeert te kweken door inherent aantrekkelijk materiaal aan te bieden. Maar zulk enthousiasme verdwijnt snel wanneer de studenten zich realiseren dat het materiaal niet is wat ze verwachtten, en op dat punt wordt het onderwerp meer een obstructie dan een stimulans.

Ongeacht hoe je tegen het onderwerp aankijkt, om te leren programmeren moet je starten met basisconcepten voordat je kunt overgaan naar aantrekkelijke en nuttige toepassingen. De wens of noodzaak om te leren programmeren moet de student motiveren, en niet de loze verwachting dat je na een paar uur studeren een leuk spel in elkaar kunt zetten. Deze cursus begint daarom klein, met basis programmeerkennis, en bouwt gestaag op naar complexere zaken.

Als je wilt leren programmeren en je de opgaven maakt, zal deze cursus je alles leren wat je moet weten om iedere applicatie die je maar wilt te bouwen – zelfs leuke spelletjes als je dat aanspreekt.


Opgaven

Tussen de theorie staan kleine opgaven. Die opgaven zijn bedoeld om iets uit te leggen of als een snelle test of je alles nog steeds begrijpt. Je moet die opgaven meteen doen als je ze tegenkomt. Als je ze niet kunt maken moet je de voorgaande tekst opnieuw bestuderen totdat je het wel kunt. Als het dan nog steeds niet lukt, kun je beter om hulp vragen.

Aan het einde van ieder hoofdstuk is een sectie getiteld “Afsluitende Opgaven”. Je moet al die opgaven proberen te maken, en je moet ze zelfstandig maken (dus zonder hulp en zonder de antwoorden op te zoeken). Ant- woorden voor die opgaven zijn via een linkje onder de opgave te bekijken. Ik wil de volgende punten expliciet onder de aandacht brengen:


Door naar de Opgaven
Terug naar de cursus pagina