Een linuxmag Python beginnerscursus

Python is niet alleen één van de populairste programmeertalen die er is, maar ook één van de snelstgroeiende. Het voordeel van Python is dat het, in tegenstelling tot andere populaire talen zoals Java en C++, weinig voorkennis nodig heeft: je kunt er meteen induiken zonder dat je eerst de basisstructuur van een programma of het gebruik van een compiler moet leren. Bovendien is Python erg leesbaar en daardoor extreem intuïtief: een goedgeschreven programma leest bijna weg als Engels. Kortom, Python is een taal die uitermate geschikt is om te beginnen met programmeren, zonder dat dat wil zeggen dat het een beginnersprogrammeertaal is: Python wordt bijvoorbeeld veel gebruikt bij Google en het is zo ongeveer de standaard programmeertaal van de academische wereld.

Wat is Python

Python is een high-level programmeertaal, net als bijvoorbeeld Java, PHP of C, in tegenstelling tot low-level programmeertalen zoals assembly of machine instructies. Computers kunnen alleen low-level talen begrijpen, maar voor mensen zijn dat soort talen extreem ingewikkeld om te begrijpen en enorm tijdrovend om in te programmeren. Bovendien heeft elke processor architectuur en elk besturingssysteem een eigen set instructies, waardoor hetzelfde low-level programma voor een ARM processor op Linux er compleet anders uitziet dan voor een Intel processor op Windows. Daarom schrijven we programma’s in high-level talen die voor mensen makkelijker te begrijpen zijn en die vervolgens worden omgezet in low-level instructies die de computer kan uitvoeren. Dit omzetten van high-level naar low-level kan op twee manieren. Een compiler vertaalt de high-level taal rechtstreeks naar machine instructies, die je vervolgens kunt uitvoeren—C en C++ zijn voorbeelden van dit soort gecompileerde talen. Het alternatief is een interpreter, die de high-level taal leest en zelf de instructies uitvoert. Python is een voorbeeld van zo’n geïnterpreteerde programmeertaal.

Geïnterpreteerde talen

Er zijn heel erg veel geïnterpreteerde talen. Andere voorbeelden waar je vast wel eens van hebt gehoord zijn Perl, PHP, Javascript en Ruby. Dit soort talen hebben een aantal grote voordelen: je hoeft niets te compileren, ze zijn nóg meer high-level dan gecompileerde talen, en ze zijn platform-onafhankelijk. Daartegenover staat dat gecompileerde talen veel meer controle bieden en een stuk sneller zijn. Ook binnen geïnterpreteerde talen zijn er enorm veel verschillen. Dat zit hem vaak in de syntax, de manier waarop de taal wordt geschreven en de regels waaraan de taal zich moet houden, maar ook in hoe er in de achtergrond met de taal wordt omgegaan. Het voornaamste verschil—aan het oppervlakte tenmiste—van Python ten opzichte van andere geïnterpreteerde talen, is de nadruk op de leesbaarheid en beknoptheid van de code: de taal is zo ontworpen dat je wordt gedwongen tot het schrijven van leesbare code, maar wel in minder regels dan je nodig zou hebben voor een programma in Java of C++.

Populariteit

In 1989 begon Guido van Rossum, aan het Centrum van Wiskunde en Informatie, met de ontwikkeling van Python als hobbyproject. Van Rossum is geen “bekende Nederlander”, maar je zou kunnen zeggen dat Python een onvervalst stukje digitale Hollandse glorie is. In 1991 werd de eerste versie van Python gepubliceerd op de alt.sources nieuwsgroep. In de jaren negentig was Perl dè grote geïnterpreteerde programmeertaal en leek het er op, zeker met de opkomst van het Web, dat Perl erg belangrijk zou worden. Perl ontwikkelaar Larry Wall, sprak vaak grappend over Python. Nu zijn de rollen omgedraaid en is Python vele malen populairder. Daar zijn meerdere redenen voor: belangrijk is de opkomst van Linux en open source software—van Rossum ontwikkelde Python met als specifiek doel om Unix gebruikers en C programmeurs aan te spreken. Bovendien leidde de snelle digitalisering van de maatschappij ertoe dat er vraag was naar een programmeertaal die relatief eenvoudig onder de knie is te krijgen was, maar die toch enorm krachtig is. Perl is niet bepaald een programmeertaal die je als eerste leert, maar Python is dat als gezegd duidelijk wel. Dat komt, om het nog maar eens te benadrukken, door de filosofie van Python: door de focus op leesbaarheid en beknoptheid is er in Python “one obvious way to do things”—de filosofie van Perl was juist “many ways to do one thing”.

Python installeren

Op de meeste Linux distributies is Python standaard geïnstalleerd. Mocht dat niet het geval zijn, dan kan je Python via je favoriete package manager installeren, door bijvoorbeeld een simpele “apt-get install python”. Om te controleren of Python al geïnstalleerd is, typ je simpelweg “python” in je shell: als Python is geïnstalleerd dan opent de interpreter en zie je bijvoorbeeld:

$ python
Python 2.7.9 (default, Mar  1 2015, 12:57:24)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Achter de >>> kan je commando’s intypen, die de interpreter vervolgens uitvoert. Let erop dat er min of meer twee aparte versies van Python zijn en dat deze niet noodzakelijk compatible zijn: Python 2.7 (zoals hierboven) en de nieuwere Python 3.x versies, die een aantal radicale veranderingen in de taal met zich hebben meegebracht. Eerstgenoemde blijft nog tot ten minste 2020 ondersteund en is nog steeds de meest gebruikte versie van Python, maar Python 3 heeft de toekomst.

Interpreter en uitvoeren

Je kunt een programma rechtstreeks in de interpreter typen, zoals in het bovenstaande voorbeeld. Meestal wil je een programma echter eerst in je favoriete tekst editor schrijven en daarna pas uitvoeren. Dit kan door ‘python bestandsnaam.py’ in de shell in te typen: de interpreter leest het bestand dan in en voert het vervolgens uit. Een derde alternatief is om “#!/usr/bin/env python” bovenaan het bestand te zetten, waarna je simpelweg de bestandnaam in de shell kunt intypen om het programma uit te voeren.

Packages

Python heeft enorm veel packages — extra stukken code die je kunt installeren zodat je niet telkens het wiel opnieuw hoeft uit te vinden. Er zijn verschillende manieren om packages te installeren. De meeste grotere packages zijn te installeren via het package management systeem van je Linux distributie. Daarnaast zijn er ook aparte package management systemen specifiek voor Python, in de vorm van easy_install en pip, die op een vergelijkbare manier werken. Om bijvoorbeeld urllib3 te installeren, een handige module die je helpt met het ophalen van Web content, doe je simpelweg “pip install urllib3”. Welke methode je kiest maakt niet zo veel uit, zolang je maar consistent blijft: anders krijg je een wirwar aan Python packages die geïnstalleerd zijn via verschillende package managers. De broncode van Python packages is ook altijd te downloaden. Om op die manier een package te installeren, gebruik je de Python variant van de Makefile, je voert namelijk het volgende commando uit:

“sudo python setup.py install”.

Hello world

Met Python geïnstalleerd kunnen we eindelijk aan de slag. De eerste stap, zoals het in elke beginnerscursus hoort, is het weergeven van “hello world” op het beeldscherm. Om dit te doen openen we een bestand, bijvoorbeeld helloworld.py, en voeren we in:

print(“Hallo wereld”)

Om het programma vervolgens uit te voeren doen we:

$ python helloworld.py
Hallo wereld
$

Makkelijker kan bijna niet! We hadden hetzelfde ook in de interpreter kunnen doen:

>>> print(“Hallo wereld”)
Hallo wereld
>>>

Condities

Goed, laten we het iets ingewikkelder maken. Stel dat we twee variabelen hebben en op basis van de waarde van de ene variabele de waarde van de andere willen bepalen, bijvoorbeeld om te kijken of ‘x’ een even of oneven getal is en dit in ‘y’ op te slaan:

if x % 2 == 0:
   y = “even”
else:
   y = “oneven”

Er zijn een aantal dingen die opvallen aan dit voorbeeld. Het belangrijkste is de indentatie: de rangschikking van de tekst geeft duidelijk de structuur aan. In andere programmeertalen wordt dit vaak gebruikt om code duidelijker of makkelijker leesbaar te maken, maar in Python is het een vereiste. Stel dat we ergens een tab of spatie zouden missen, dan geeft Python een IndentationError. In het begin is dat soms vervelend, maar het dwingt je om goed leesbare code te schrijven. Waar we in andere talen gekrulde haakjes ({ en }) zouden moeten gebruiken om aan te geven waar een conditie begint en eindigt, is dat hier dankzij de indentatie compleet overbodig.

Als je al bekend bent met andere talen, dan is het goed om te weten dat Python geen “switch” statement toestaat — er hoort immers maar één vanzelfsprekende manier te zijn om iets te doen. We kunnen hetzelfde voorbeeld echter wel (volgens dezelfde syntax) versimpelen tot één regel code. Python focust immers ook op beknoptheid. Hier een voorbeeld, dit keer vanuit de interpreter:

>>> x = 3
>>> y = 'even' if x % 2 == 0 else 'oneven'
>>> y
'oneven'

Dit is één van de redenen achter het success van Python: in één regel code doen we iets waar we eerder vier regels voor nodig hadden — zonder dat het minder leesbaar wordt: in het Nederlands zouden we zeggen “x is even als het deelbaar is door twee en anders oneven”.

Loops

In de standaard progressie van het leren van een programmeertaal, ook al is het in dit geval in sneltreinvaart, komt vervolgens de loop. Stel dat we van een rij opeenvolgende getallen willen zeggen of ze even of oneven zijn. We weten zelf natuurlijk het antwoord al, maar het is een illustratief voorbeeld:

for i in range(5):
            print(“%d is een %s getal“ % (i, “even” if i % 2 == 0 else “oneven”))

Als we dit uitvoeren krijgen we terug:

0 is een even getal
1 is een oneven getal
2 is een even getal
3 is een oneven getal
4 is een even getal

In dit voorbeeld zien we weer een aantal nieuwigheden. In plaats van een complexe for-loop waarin we allerlei condities moeten opgeven zoals bij andere talen, gebruiken we de range() functie. Die functie geeft een lijst met getallen terug, vanaf nul tot (en niet tot en met!) het opgegeven getal. Via het “in” keyword kunnen we over die waarden heenlopen. We hadden dezelfde regel dus ook kunnen schrijven als “for i in [0,1,2,3,4]”. De tweede regel laat zien hoe je strings kunt formatteren in Python en hoe je condities kan inbouwen.

Lists, dictionaries en strings

Zoals het bovenstaande voorbeeld laat zien, zijn lijsten enorm belangrijk in Python. Een ander belangrijk data type is een dictionary, soms ook wel een associatieve array genoemd. Een list definieer je met vierkante haakjes en een dictonary met gekrulde:

>>> a = ['hallo', 'wereld']
>>> a
['hallo', 'wereld']
>>> b = {'hallo': 'wereld'}
>>> b
{'hallo': 'wereld'}
>>> a[0] # a[0] is het eerste element van de lijst a
'hallo'
>>> b['hallo']
'wereld'
>>> b[a[0]] # a[0] is hier 'hallo'
'wereld'

Naast de list en dictionary heb je ook een tuple: een onveranderbare lijst met een vastgestelde lengte — in de geformatteerde string in het vorige voorbeeld gebruikten we een tuple (i, ‘even’/’oneven’ afhankelijk van de conditie). Commentaar in code wordt voorgegaan door een # teken en voor commentaar over meerdere regels gebruiken we drie quotes om te openen en af te sluiten. In het bovenstaande voorbeeld definiëren we een lijst ‘a’ en een dictionary ‘b’, en laten we vervolgens via wat simpele voorbeelden zien hoe ze werken. Met name dictionaries zijn erg krachtig. Stel dat we een aantal gegevens over mensen opslaan en daar een loop overheen willen schrijven:

>>> leeftijd = {‘Alice’: 24, ‘Bob’: 58, ‘Charlie’: 9}
>>> for naam in leeftijd:
...     print(naam, leeftijd[naam])
...
('Charlie', 9)
('Bob', 58)
('Alice', 24)

Tekst

Bijna alles wat je kan bedenken is af te vangen met tuples, lists en dictionaries. Een interessant gegeven is dat je een string ook kan interpreteren als een lijst van karakters. In Python kan je dan ook een loop over een string schrijven. Of je kan een zin opsplitsen in stukken en loopen over de lijst met woorden:

>>> s = 'Hallo wereld'
>>> for c in s:
...    
print c, # de komma aan het einde voorkomt een nieuwe regel
...
H a l l o   w e r e l d
>>> for woord in s.split(“ “):
...     print woord
...
Hallo
wereld

Python is erg sterk in het omgaan met tekstuele data. Dat maakt het uitermate geschikt voor de overvloed aan ongestructureerde data op het Web. Het veelbesproken beroep data scientist, een van de snelst groeiende beroepen ter wereld, is in veel gevallen bijna synoniem voor Python programmeur.

Comprehensions

We zagen eerder al hoe je in één regel heel veel gedaan kunt krijgen: je kunt met één regel een conditie instellen en iets uitprinten volgens die conditie. Deze flexibiliteit wordt nog krachtiger als we gebruik maken van comprehensions. Stel dat we een lijst willen bouwen van de even getallen onder de honderd. We zouden dan een loop kunnen schrijven die over de getallen heen gaat, elke keer controleert of het getal even is en in dat geval het getal toevoegt aan een lijst:

lijst = [] # een lege lijst
for i in range(100):
    if i % 2 == 0:
        lijst.append(i)

Hetzelfde is echter veel eenvoudiger te bereiken via een comprehension:

lijst = [i for i in range(100) if i % 2 == 0]

Comprehensions zijn enorm krachtig. Als je enige wiskundige achtergrond hebt, dan zie je dat het concept vergelijkbaar is met set notatie: dezelfde set zouden we wiskundig schrijven als {i : i , i < 100 en i % 2 = 0}. Comprehensions kunnen ook voor dictionaries worden gebruikt en kunnen behoorlijk complex worden. Hier een voorbeeld van een dictionary van even en oneven getallen onder de honderd:

lijst = {soort:[i for i in range(100) if i % 2 == deler] for (soort, deler) in zip([‘even’, ‘oneven’], [0,1])}

Je zou nu kunnen klagen: Python zou toch leesbaar moeten zijn en dit is toch een beginnerscursus?! Dat klopt, maar de notatie in het bovenstaande is erg intuitief als je eenmaal bekend bent met comprehensions — en juist dan is Python enorm krachtig. Probeer het voorbeeld op je gemak te ontcijferen: het is een goed voorbeeld van wat je allemaal kunt bereiken in een enkele regel code.

Hoe verder

We hopen te hebben laten zien dat Python een uitermate geschikte taal is voor beginners, maar tegelijkertijd ook enorm krachtig. Er is een reden dat Python zoveel wordt gebruikt bij grote bedrijven, van Google (waar van Rossum een tijd werkte) tot Dropbox (waar hij momenteel werkzaam is). Python is dé te leren programmeertaal voor snelle en makkelijke data manipulatie, maar bijvoorbeeld ook voor web ontwikkeling (via bijvoorbeeld Django, het “web platform voor perfectionisten met een deadline”) en high-performance computing (via bijvoorbeeld numpy en scipy). Op de website van Python staan een aantal goede tutorials om de taal snel onder de knie te krijgen. Veel succes!

Referenties

www.python.org
www.djangoproject.com
www.numpy.org

NEDLINUX FORUM

Het nederlandse linuxforum
Voor beginners en pro’s

 

 

 

 

E-mailadres



 

 

Nieuwste editie:

Linuxmag op Facebook

@linuxmagnl op Twitter

linuxmagNL Linux Nieuws: @SUSE bestaat 25 jaar en trakteert! Maak kans op entreeticket voor #SUSECON in Praag, zie link!… https://t.co/ENJKDvyZQ8
linuxmagNL De nieuwe editie van Linux Magazine is weer uit! Thema: bescherm jezelf tegen hackers met Linux. Veel leesplezier a… https://t.co/Zcy3Zdjb90
linuxmagNL Ook de Red Hat Forum BeNeLux 2017 mag je dit jaar niet missen. 10 oktober 2017, zet het in je agenda! https://t.co/niY9UdK3Ov