Python (programmeertaal)

Python is een programmeertaal die begin jaren 90 ontworpen en ontwikkeld werd door Guido van Rossum, destijds verbonden aan het Centrum voor Wiskunde en Informatica (daarvoor Mathematisch Centrum) in Amsterdam. De taal is mede gebaseerd op inzichten van professor Lambert Meertens, die de programmeertaal ABC ontworpen had, bedoeld als alternatief voor BASIC, maar dan met geavanceerde datastructuren. Inmiddels wordt de taal doorontwikkeld door een enthousiaste groep, tot juli 2018 geleid door Van Rossum. Deze groep wordt ondersteund door vrijwilligers op het internet. De Python Software Foundation leidt de ontwikkeling van Python. Python is vrije software.

Python dankt zijn naam aan het favoriete televisieprogramma van Guido van Rossum, Monty Python's Flying Circus.

Kenmerken

Syntaxis 
Python is ontwikkeld met het oog op leesbare code. Dit uit zich op verschillende manieren. Zo wordt structuur aangebracht door indentatie (regelinspringing) in plaats van bijvoorbeeld accolades zoals in C-achtige talen. Statements (vergelijkbaar met zinnen uit gewone taal) worden simpelweg beëindigd door het eind van de regel. Variabelen krijgen geen typedeclaratie. Python maakt gebruik van duck-typing.

Inspringing 
Python gebruikt als een van weinige talen de mate van inspringing van de regel, ook wel indentatie genoemd, als indicatie van gelaagdheid van de verschillende onderdelen van het programma. Dit is iets wat Jaap van Ganswijk, de ontwerper van JPL en UHL al sinds het begin van de jaren tachtig voorstaat, maar dat ook anderen wel geopperd hebben. 

Andere talen verschillen hierin door het gebruik van haakjes, die dan bestaan uit de woorden BEGIN en END (bij Pascal, Algol en PL/1) of accolades (bij C, C++ en Java) om een blokstructuur aan te duiden. In de praktijk zal een programmeur ook bij deze talen de regels inspringen om het programma leesbaarder te maken.

Bij Python wordt de blokstructuur uitsluitend door inspringing bepaald. Door deze inspringing en een aantal andere elementen kan de structuur van de taal worden vergeleken met de structuur van de pseudoprogrammeertaal die in veel gevallen wordt gebruikt in de literatuur om algoritmen uit te leggen.

Duck-typing 

Python implementeert het zogenaamde duck-typing. Dit houdt in dat het type van een variabele en het type van een argument van bijvoorbeeld een functie niet gedefinieerd hoeft te worden. Bij compilatie vindt (dus) ook geen typecontrole plaats. In runtime wordt slechts gecontroleerd of de methoden die worden gebruikt voor het betreffende object, gedefinieerd zijn. Als dat niet zo is, volgt een foutmelding.

EAFP 
Een veel voorkomende wijze van programmeren in Python is het zogenaamde EAFP-systeem (Easier to Ask for Forgiveness than Permission, naar een uitspraak van Grace Hopper). Hierbij wordt een functie of methode gestart zonder eerst te controleren of deze wel goed werkt, en vervolgens een foutmelding gegeven en afgevangen als dat niet het geval is. In de meeste andere programmeertalen is dit ofwel onmogelijk, of het wordt als slechte programmeerstijl beschouwd. Die gebruiken wat in Python LBYL-programmeerstijl (Look Before You Leap) heet: eerst de argumenten van een functie bekijken om te zien of de functie goed gaat, en slechts verdergaan als dat het geval is.

Uitvoering 
Een Python-programma wordt geschreven in een of meer tekstbestanden met de extensie .py. Om een Python-programma uit te voeren dient men, in het geval van CPython, de Python-interpreter aan te roepen, gevolgd door de naam van het bestand, waarin het begin van het programma wordt gecodeerd.

Interpreter 
De CPython-interpreter zet de Python-programmacode niet meteen om in machine-instructies, maar compileert naar een tussenvorm, bytecode genoemd. Deze code wordt opgeslagen in de vorm van een .pyc-bestand (met de c van compiled, gecompileerd). De bytecode is onafhankelijk van het besturingssysteem – ze kan verhuisd worden naar een ander besturingssysteem. De volgende stap is het uitvoeren van de bytecode door de Python-virtual-machine. Deze zet de bytecode om in machinetaal (instructies voor de processor). De eerste stap is alleen nodig als de interpreter geen up-to-date .pyc-compilatie vindt. De tussenstap vindt plaats omdat bytecode geoptimaliseerd is om sneller te worden omgezet in machine-instructies. Daarnaast zorgt de virtual machine voor de garbage collection.

Omdat Python een zogenaamde interpreter is, zijn programma's geschreven in Python langzamer dan programma's geschreven in een taal met een compiler, zoals C. Pythonprogramma's zijn ook langzamer door de garbage collection.

Garbage collection 
Net als in veel andere moderne scripttalen wordt in Python geheugenruimte automatisch gereserveerd voor nieuwe variabelen of variabelen die groeien, en weer vrijgegeven als er geen referenties meer zijn aan die variabelen (garbage collection). Op deze manier wordt de programmeur een hoop werk bespaard dat hij of zij in sommige talen (zoals C en C++) wel moet doen.

Standalone executables 
Het is ook mogelijk Python te gebruiken zonder de Python-interpreter en -bibliotheken te installeren. Een voorbeeld van een tool hiervoor is Py2exe.

Bibliotheken 
Python wordt geleverd met een uitgebreide bibliotheek om van alles en nog wat standaard te kunnen bewerken. Het is erg eenvoudig om in Python herbruikbare code te schrijven. Doordat veel van de bibliotheken die mensen schrijven, gratis en vrij aan anderen ter beschikking worden gesteld, groeien de mogelijkheden van de bibliotheek voortdurend. Python wordt zo tot een programmeertaal die voor razendsnel ontwikkelen van een nieuwe applicatie kan worden gebruikt, zonder dat de daarbij geproduceerde code onleesbaar wordt.

Syntaxis

Uitvoer 
Vertoning van uitvoer op de standaarduitvoer (meestal het scherm) gebeurt in Python 3 met de print-functie:

print("Hallo wereld")
>> Hallo wereld

print(3*2)
>> 6

print("3*2")
>> 3*2

Python gaat na de print-functie meteen een regel verder. Om op dezelfde regel nog iets te printen, is er het end-argument met een string als invoer:

print("Hallo")
print("wereld")
>> Hallo
>> wereld

print("Hallo", end=" ")
print("wereld")
>> Hallo wereld

In Python maakt het overigens niet uit of de af te drukken string tussen enkele of dubbele aanhalingstekens wordt gezet, als het maar consequent gebeurt.

print("'s Morgens zeg ik", ':', ' "Hallo!"')
>> 's Morgens zeg ik: "Hallo!"

Commentaar 
Om in een script tekstcommentaar te plaatsen dat niet uitgevoerd mag worden, kan het #-teken worden gebruikt. Voor commentaar met meerdere regels wordt een blok met drie dubbele aanhalingstekens gebruikt.

# print("Deze regel wordt niet uitgevoerd")

"""
print("En deze regels?")
print("Ook niet!")"""

print("Deze regel wel")
>> Deze regel wel

Variabelen en feedback 
Variabelen zijn containers die een waarde toegewezen krijgen of hebben gekregen. Variabelen kunnen worden gemanipuleerd, gebruikt of getoond. In Python hoeft de variabele niet van tevoren te worden gedeclareerd. Om de invoer van een gebruiker te kunnen opvragen wordt de input-functie gebruikt. De invoer wordt vervolgens aan een variabele toegekend.

# Werking van variabelen
som = 4*3
print(som)
>> 12

# Manipulatie van variabelen
vijf = 4
drie = 3
print(vijf + drie)
>> 7
correctie = 5
vijf = correctie
print(vijf + drie)
>> 8

# Nog een voorbeeld van manipulatie
breedte = 20
hoogte = 10
oppervlakte = breedte * hoogte
print(oppervlakte)
>> 200
hoogte = hoogte * 2 # hoogte *= 2 mag ook
oppervlakte = breedte * hoogte
print(oppervlakte)
>> 400

# Invoer van gebruiker vragen
naam = input("Wat is uw naam?")
print("Hallo " + naam + "!")
>> Wat is uw naam?
<< Monty
>> Hallo Monty!

Expressies 
Expressies worden met de standaard vergelijkingsoperatoren bepaald en hebben als uitkomst de waarden True of False. Om een onware overeenkomst te testen wordt een uitroepteken gebruikt.

hoog = 5
laag = 2
print(laag < hoog)
>> True
print(laag == 3)
>> False
print(laag != 3)
>> True

Booleaanse operatoren 
Bij een expressie kunnen de booleaanse operatoren or en and worden gebruikt.

hoog = 9
laag = 3
print(hoog < laag or laag == 3) # Test of een van de expressies waar is
>> True
print(hoog < laag and laag == 3) # Test of beide expressies waar zijn
>> False

Beslissingen 
Beslissingen worden genomen met een if-statement, aan de hand van een expressie. Deze kunnen worden aangevuld met een else-statement en elif-statements.

# Importeren van library voor het tonen van willekeurige getallen
import random
win = random.randint(1,3)

print("Welkom bij Let's make a deal. Kies een deur.")
print("[1] Deur Een")
print("[2] Deur Twee")
print("[3] Deur Drie")
deur = int(input("Geef een keuze op:"))

# If-else-blok
if deur == win:
    print("Achter de deur zit een koffer met een miljoen euro. Jij wint!")
else:
    print("Achter de deur bevindt zich een pakezel waarmee je terug naar huis kan gaan. Jij verliest!")

# Ervan uitgaand dat de "win"-variabele hetzelfde is als de opgegeven invoer
...
>> Geef een keuze op:
<< 3
>> Achter de deur zit een koffer met een miljoen euro. Jij wint!

Datastructuren 
De meestvoorkomende datastructuur in Python is de ‘list’. Deze bestaat uit een index van verschillende soorten eenheden. Het eerste indexgetal is hierbij altijd een nul.

kleuren = ["rood", "geel"]

print(kleuren[1])
>> geel
print(kleuren)
>> ['rood', 'geel']
kleuren.append("blauw")
print(kleuren)
>> ['rood', 'geel', 'blauw']

Repetitie 
Python heeft twee lusconstructies om een statement herhaaldelijk uit te voeren, namelijk de while-lus en de for-lus.

For-statement 
De for-lus is gemaakt om datastructuren af te lopen. Hij verschilt van de meeste andere for-lussen uit programmeertalen en is het best te vergelijken met de foreach-lus uit PHP).

# Voorbeeld met for-lussen
kleuren = ["rood", "geel", "blauw", "zwart", "oranje", "paars", "groen"]
hoeveelheid = 0 # Deze variabele wordt gemanipuleerd in de for-lus, dus moet hij hier vooraf worden gedeclareerd

for aantal in kleuren:
    hoeveelheid += 1

print("In mijn doos met kleurpotloden zitten " + str(hoeveelheid) + " potloden.") 
# Integers kunnen niet worden geconcateneerd met strings, vandaar de str-functie
# Zie ook http://nl.wikipedia.org/wiki/Concatenatie

>> In mijn doos met kleurpotloden zitten 7 potloden.

# Nog een voorbeeld met for-lussen
kleuren = ["rood", "geel", "blauw", "zwart", "oranje", "paars", "groen"]

print("Mijn doos met kleurpotloden bevat een", end=" ")

for kleur in kleuren:
    if kleur == kleuren[-1]: # Vergelijking met laatste element uit lijst
        print(kleur + " potlood.")
    elif kleur == kleuren[-2]: # Vergelijking met een-na-laatste element uit lijst
        print(kleur, end=" en ")
    else:
        print(kleur, end=", ")

>> Mijn doos met kleurpotloden bevat een rood, geel, blauw, zwart, oranje, paars en groen potlood.

While-statement 
De while-lus herhaalt een statement aan de hand van een expressie:
getal = 1

print("Ik kan tot vijf tellen!")

while getal <= 5:
    print(getal)
    getal += 1

>> Ik kan tot vijf tellen!
>> 1
>> 2
>> 3
>> 4
>> 5

Bij for- en while-statements kan de range-functie worden gebruikt.

print("Ik kan tot vijf tellen!")

for getal in range(1, 6): # Laatste getal wordt niet meegeteld
    print(getal)

# Output hetzelfde als vorige voorbeeld

Abstractie

Functies 
Functies worden gemaakt met het def-statement, met of zonder argumenten.

def kwadrateren(getal):
    return getal*getal

print(kwadrateren(6))
>> 36

Foutafhandeling 
Python heeft geavanceerde procedures voor exception handling, die worden gebruikt in de zogenaamde EAFP-stijl (Easier to Ask Forgiveness than Permission) van programmeren. De volgende code geldt als acceptabele Pythoncode:

try:
  x = 1 / y
except ZeroDivisionError:
  x = 0

Implementaties en versies
De standaardimplementatie van Python is geschreven in C. Vandaar wordt ze ook soms CPython genoemd.

CPython
De eerste implementatie van Python is geschreven in C. Dit is de meestgebruikte versie. Ze is beschikbaar via de officiële Pythonwebsite, en staat voorgeïnstalleerd op de meeste distributies en versies van Linux en Mac OS.

Van deze distributie bestaan twee veelgebruikte versies: 2 en 3. Aangezien versie 3 een aantal veranderingen inhoudt die niet compatibel zijn met versie 2, is versie 3 niet zomaar een vervanging van versie 2. Om een Pythonprogramma uit te voeren is het belangrijk te weten welke versie van Python het gebruikt.

Jython
De J staat hier voor de programmeertaal Java. Deze Pythonversie wordt uitgevoerd aan de hand van de Java Runtime Environment. Dit is een programmeerplatform waarop verschillende talen (niet enkel Java) systeemonafhankelijk uitgevoerd kunnen worden.

IronPython

Ook .NET heeft haar eigen versie van Python. .NET is de tegenhanger van de Java Runtime Environment gecreëerd door Microsoft, en biedt programmeurs een platform om Windows-applicaties te schrijven.

PyPy

Deze implementatie van Python is geschreven in RPython (een beperkte Python-variant), en focust op snelheid. De naam verwijst naar haar implementatietaal: de extensie van een Python-bestand is: .py.

Use cases van Python 
Python is een programmeertaal met een enorm aanbod aan bibliotheken en kan in zo goed als elk programmeerdomein gebruikt worden. Voor sommige specifieke usecases is Python echter speciaal geschikt.

OS Scripting 
Python is een scripttaal gebruikt voor het uitvoeren van taken op een besturingssysteem. Voordelen van Python voor deze usecase zijn haar scriptachtige syntaxis, de tools die de Pythontaal en standaardbibliotheek aanbiedt voor zulke taken en dat Python min of meer systeemonafhankelijk werkt. Dit laatste wil zeggen dat dezelfde Pythoncode op verschillende besturingssystemen gebruikt kan worden.

Wiskunde en wetenschap 
Python is ook bekend als programmeertaal voor wiskundige en wetenschappelijke programma's. NumPy en SciPy zijn krachtige bibliotheken voor wiskundige en wetenschappelijke berekeningen.

Web 
Python kan ook gebruikt worden om webapplicaties te ontwikkelen. Hiervoor bestaan allerlei webapplicatie-frameworks, zoals Django en Flask, en servertechnologieën, zoals mod_python. Men heeft ook een standaard gedefinieerd, genaamd Web Server Gateway Interface (WSGI), voor de communicatie tussen webservers en webapplicatie-frameworks. Op deze manier kunnen portable webapplicaties en frameworks geschreven worden in Python.

Zie ook 
 Lijst van programmeertalen

Externe links 
 Officiële website
 Interview met Guido van Rossum, ontwerper van Python

Opensourcesoftware en vrije software
Programmeertaal
 
Wiskundige software