# 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:
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:
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.

### 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.

### 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.

### 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.

### Booleaanse operatoren

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

### 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.

### 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.

### 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).

#### While-statement

De while-lus herhaalt een statement aan de hand van een expressie:
Bij for- en while-statements kan de range-functie worden gebruikt.

### Abstractie
#### Functies

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

### 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:

## 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.