Python programmeren
- Introductie
- Compiler en linker
- Declaraties
- Operators
- Functies
- Control statements
- Invoer en uitvoer
- Lists
- Dictionaries
- Methods
- Objects en classes
- Exceptions (fouten)
- Modules
- Packages
- Logging van meldingen (waarschuwing, info, etc.)
- Aandachtspunten
- Links
Introductie
Je kan zien welke versie Python je hebt door op de commandoregel
python -V
in te tikken.
Maar je kan het ook gewoon zien door python
te starten.
Help-informatie
Als je niet meer precies weet hoe een bepaald commando werkt tik je in:
help('commandonaam')
, bv.
help('print')
, gevolgd door
Enter
Aanroepen van Python
Als je een stuk code uit een andere file wilt gebruiken in een interactief
Python-programma, geef je optie -i
mee:
python -i functions.py
In dit geval zijn bv. gedefiniëerde classes uit
functions.py
beschikbaar.
Integrated Development Environment (IDE)
Het is handig om Python in een grafische omgeving te kunnen gebruiken, en daarvoor zijn er o.a. de volgende 2 mogelijkheden:
Anaconda
;PyCharm
.
Werken met Pycharm
Pycharm
kan je
hier downloaden.
Maak een nieuw project met klikken op
File - New Project
, en dan achter
Location
een map te kiezen waar het project heen moet, en een naam voor het project.
Er wordt dan een "virtual environment" aangemaakt (kan even duren).
Klik dan op File - New - Python Package
,
en voer een naam voor het package in.
Klik dan op File - New - Python File
,
en voer een naam in.
Je kan nu programmacode intikken. Als je klaar bent moet je nog een configuratiebestand aanmaken.
Klik op het pijltje naar beneden, rechts op de 2e regel onder de titelbalk, en
dan op Edit Configurations
.
Klik op het plus-teken in de linkerbovenhoek, en dan op
Python
.
Voer een naam in achter Name
, selecteer
achter Script Path
bij welke Python-file de
configuratie hoort.
Daarna kan je evt. de code verder aanpassen, of het programma uitvoeren door op de groene pijl te klikken.
Bij het invoeren van code kan je zien of een regel niet deugt doordat er
dan een rood uitroepteken aan het einde van de regel verschijnt.
Je kan dat bv. simpel testen door een ongeldige naam voor een variabele te
gebruiken:
a$b=3
Package management
De website voor packages is https://pypi.python.org/pypi.
Installeren van een package doe je met
pip install package-name
Met pip list
zie je alle packages die er op het systeem geïnstalleerd zijn.
Met pip show package-name
zie je gegevens over een specifiek package.
Je kan zoeken naar packages met
pip search search-term
Compiler en linker
Declaraties
Variabelen
In Python heb je geen typedeclaraties, dus je kan gewoon zeggen:
a = 10
b = 20.34
Constantes
Booleans
0
is de waarde false, net als de empty string,
""
, alle andere waarden zijn true.
Er is een functie bool
, die de boolean waarde
van iets oplevert.
Dus print(bool(3))
drukt
False
af.
Operators
Complexe operators
Conditional operator
Functies
Ingebouwde functies
Zoeken binnen een string (find)
Minimum (min) of maximum (max)
Resultaat is het kleinste of grootste van een willekeurig aantal parameters.
Absolute waarde van een getal (abs)
Type van een parameter (type)
Control statements
If statement
De code die wordt uitgevoerd als de conditie na 'if' waar is, wordt in Python (i.t.t. veel andere programmeertalen) niet aangegeven door een of ander soort haakjes, maar door indentation (inspringen van de kantlijn). Aangeraden wordt om dit met 4 spaties te doen, hoewel minder geloof ik wel is toegestaan.
Algemene structuur van het if statement:
if condition1:
statements1
elif condition2:
statements2
else:
statements3
Let op de dubbele punt aan het eind van de 'if'-regel en achter de 'else'.
Voorbeeld:
if 10 > 9:
print("Waar")
else:
print("Onwaar")
print("Dit wordt altijd afgedrukt")
De laatste regel wordt altijd afgedrukt omdat de regel niet ingesprongen is. Dus valt hij buiten het if-statement.
For statement
Een simpele for loop ziet er als volgt uit:
for variable in collection:
statements
Met collection bedoel ik een string, een list, een tuple of een dictionary.
Een dictionary is natuurlijk een beetje een speciaal geval. De variabele na 'for' heeft in dat geval betrekking op de keys.
Voorbeeld (veronderstel dat je personen hebt met hun gewicht):
d = {'Jan': 89, 'Henk': 70, 'Kees': 99}
for k in d:
print(k + " " + str(d[k]))
De uitvoer zal zijn:
Jan 89
Henk 70
Kees 99
Maar je kan ook het volgende doen:
for k,v in d.items():
print(k)
print(v)
Je kan met 'for' ook door 2 lists tegelijkertijd gaan. De operatie stopt dan bij de kortste van de 2 lists. Het gaat als volgt:
lst1 = [1, 2, 3, 4]
lst2 = [5, 6, 7, 8, 9, 10]
for x, y in zip(lst1, lst2):
statements
Als er geen break bij de statements zit, zullen er 4 iteraties uitgevoerd worden.
While statement
while conditie:
statements
Er gelden dezelfde principes als bij de if
:
aan het eind van de while-regel moet een dubbele punt staan, en de regels
die bij de 'while' horen moeten inspringen.
Voorbeeld:
l = []
x = 0
while x < 6:
l.append(x)
x = x+1
print(l)
De uitvoer van dit stukje code is:
[0, 1, 2, 3, 4, 5]
Het break statement en het continue statement
break
beëindigt de loop waar het in zit,
en wel de "closest enclosing" loop (vanzelfsprekend).
Range
range(0,20)
levert een class van type "range"
met de getallen van 0 t/m 19 op.
print(range(0,20))
levert niets nuttigs op.
Om de getallen te kunnen zien moet je de range typecast naar bv. een list:
print(list(range(0,20)))
.
Het default beginpunt van een range is 0, dus ik had hierboven ook
range(20)
kunnen zeggen.
Maar je kan ook een ander beginpunt nemen en de stapgrootte veranderen van
1 in iets anders, bv.:
print(list(range(30,40,4)))
levert de getallen
30, 34 en 38 op.
Invoer en uitvoer
Je kan om invoer vragen met de procedure input
(heette in Python 2 nog raw_input
).
Dus bv.: lname = input("What is your last name? ")
File openen voor I/O
Je opent een bestand met de ingebouwde functie
open
Er zijn 4 verschillende modes waarmee je een bestand kunt openen: 'r' (read-only), 'w' (write-only), 'r+' (read and write) en 'a' (append).
Een van de meest eenvoudige manieren om een bestand te openen is
mijn_bestand = open("naam.extensie
,
"mode"), dus bv.:
naw = open("naw.txt", "r+")
Schrijven naar een bestand
De uitvoer naar een bestand is altijd in de vorm van strings.
Veronderstel dat je een bestand opent met
outfile = open("uitvoer.txt", "w")
Je maakt een lijst met
number_list = [1, 2, 3, 4, 5]
Dan kan je die lijst als volgt naar het bestand schrijven:
for item in number_list
outfile.write(str(item))
outfile.close()
Lezen uit een bestand
In dit geval open je het bestand met
infile = open("uitvoer.txt", "r")
Daarna zou je het hele bestand als volgt kunnen afdrukken:
print(str(infile.read())
, of
mydata = infile.read()
print(mydata)
(Je kan ook alleen als statement mydata
intikken,
maar dan krijg je de string tussen aanhalingstekens.)
Met de method readline()
kan je een bestand
ook regel voor regel lezen.
Maar je kan ook een andere truc uithalen.
Stel dat je invoerbestand een getal heeft op elke regel, kan je het volgende
doen:
nummerlijst = invoer.read().splitlines()
De getallen belanden nu als strings in de lijst
nummerlijst
Na schrijfoperaties is het belangrijk dat je een
close()
doet voor je er andere operaties (bv. lezen)
op loslaat.
With as
Als je gebruik maakt van de with... as...
constructie
hoef je niet perse een close
te doen tussen een
schrijf- en leesoperatie.
Zie bv. de volgende code:
with open("test.txt", "w") as write_file:
write_file.write("Dit is een voorbeeld van het gebruik van with.. as")
print()
with open("test.txt", "r") as read_file:
print(str(read_file.read()))
Denk om de ':' aan het eind van de with... as...
regel!
Strings
Je kan de characters in een string benaderen alsof het een array is (waarbij de index van het 1e teken 0 is).
Dus als je als statement print("Groningen"[3])
doet,
krijg je als uitvoer de letter 'n'.
Negatieve indexen zijn ook mogelijk: -1 levert de laatste 'n' op, -2 de 'e'.
Met '+'-tekens kan je meerdere strings aan elkaar knopen.
Je kan een substring uit een string halen door een begin-index en een eind-index op te geven, een zgn. slice. Daarbij is de eind-index exclusive, dus die telt niet mee. Als je na de dubbele punt niets zet krijg je de hele string vanaf de begin-index. Als je voor de dubbele punt niets zet begint de slice bij index 0.
Voorbeeld: print("Groningen"[1:6])
levert
ronin
op.
Tenslotte kan je tussen vierkante haken nog een derde getal toevoegen, de step. In dat geval wordt om de step tekens een teken uit de string gehaald.
Voorbeeld: "Groningen"[1:i:2]
levert
rnne
op.
String methods
Een string is een object, met een o.a. een aantal methods.
Lower
"Henk".lower()
levert henk
op
(en vanzelfsprekend is er ook een method upper()
.
Replace
string.replace(old, new, count)
vervangt de string old
door de string new
count
geeft aan hoeveel keer de string
vervangen moet worden.
Als je geen aantal opgeeft wordt alles vervangen.
String functies
len("Henk")
levert 4
op.
str("23")
levert de string 23
op.
String formatting
Een beetje vergelijkbaar als in C++ kan je ook in Python werken met placeholders voor dingen die je in een string wilt stoppen.
Voorbeeld:
artist = "Radiohead"
location = "Ziggo Dome"
print("Welkom bij het concert van %s in %s", %(artist, location))
levert als output Welkom bij het concert van Radiohead in
Ziggo Dome
Lists
Een list lijkt te zijn wat een array is in andere programmeertalen.
Je kan bv. een list van getallen aanmaken met het statement
numlist = [9, 13, 4, 8]
numlist[2]
heeft dan de waarde
4
In tegenstelling tot strings, waar je geen waarden aan kan toewijzen, kan
dat bij lists wel.
Je zou dus kunnen zeggen numlist[2] = 11
List methods
Lengte van een list (len)
len(listname)
geeft je het aantal elementen
in de list.
Item toevoegen aan list (append)
Met listname.append(item)
voeg je een element aan de list toe (aan het eind).
Item toevoegen aan list (insert)
Met listname.insert(index, item)
voeg je een element aan de list toe (op de plek van de index).
Stel je hebt de list
colors = ["green", "yellow", "orange"]
, en je
voert colors.insert(1, "blue")
uit, dan is
de waarde van colors
veranderd in
["green", "blue", "yellow", "orange"]
Item vinden (index)
Stel je hebt de list
colors = ["green", "yellow", "orange"]
, en je
wilt weten or orange
er in zit, en zo ja, het
hoeveelste element het is.
Dan doe je: result = colors.index("orange")
, en
je krijgt de waarde 2 terug.
Item verwijderen (pop)
Met variable_name = listname.pop()
verwijder je het element aan het einde van de list (en het verwijderde
item komt in variable_name
)
Item verwijderen (remove)
Met listname.remove(itemname)
verwijder je het element itemname
Sorteren van list (sort)
Met listname.sort()
sorteer je de list.
Checken of item in list zit (in)
Met if value in listname:
krijg je de waarde true
of false
terug.
Dictionaries
Een dictionary bestaat uit een aantal paren, waarvan de 1e de key is, en de 2e de waarde. De waardes in de dictionary hoeven niet van hetzelfde type te zijn.
Je zou dus bv. een dictionary kunnen maken met gegevens over een persoon:
person = {'name': 'Henk', 'birthyear': 1956, 'city': 'Groningen'}
Er is geen volgorde in de dictionary, het is een afbeelding van keys op waardes.
De manier om een waarde te benaderen is via de key:
person['city']
levert de waarde
'Groningen'
op.
Je kan als volgt waardes toevoegen aan een bestaande dictionary:
person['phone-number'] = 1234567
Dictionaries kan je nesten, d.w.z. de waarde in een key-value paar kan een nieuwe dictionary zijn. Een waarde binnen een dictionary-waarde benader je door een extra paar vierkante haken met daarin een key van de dictionary-waarde.
Methods
Keys
Van de dictionary
person = {'name': 'Henk', 'birthyear': 1956, 'city': 'Groningen'}
levert person.keys()
het volgende op:
dict_keys(['name', 'birthyear', 'city'])
Values
Deze method doet hetzelfde als keys, maar dan voor de waardes.
Items
Met dezelfde dictionary als in keys levert
person.items()
het volgende op:
dict_items([('name', 'Henk'), ('birthyear', 1956),
('city', 'Groningen')])
Copy
Met deze method kan je een complete dictionary copiëren:
person_copy = person.copy()
person_copy
is nu ook een dictionary, compleet
identiek aan person
Clear
Met deze method poets je de dictionary schoon:
person.clear()
Methods
Een method definieer je met
def method_name(arguments):
gevolgd door de statements (ingesprongen met 4 spaties).
De method roep je aan met zijn naam, net als procedures in andere talen.
Als je wilt dat de method een waarde oplevert gebruik je het
return
statement.
Parameters
Bij de parameters heb je best veel flexibiliteit. Als je bv. een method definieert waarin de parameters worden opgeteld, kan je zowel getallen als strings als parameters meegeven. Maar niet 1 string en 1 getal (het getal wordt niet automatisch geconverteerd).
Ook kan je default waardes voor de parameters definieren,
zodat je de method evt. zonder parameters (of met minder dan het maximale
aantal) kan aanroepen.
Bv.: def som(x=2, y=4):
Als je nu bij de call van som
geen parameters
opgeeft krijg je als resultaat 6.
Je kan ook gebruik maken van positionele parameters, waarbij je de namen van de parameters in de call opgeeft. Je kan dan een andere volgorde gebruiken dan in de definitie.
Je kan een method met een onbeperkt aantal parameters definieren m.b.v.
een asterisk voor de naam van de parameters, bv.:
def maxnum(*args):
Classes
Alles in Python bestaat uit objects, en elk object is van een bepaalde class.
Hoe kan je te weten komen van welke class een object is?
Door het volgende statement uit te voeren:
print(type(object))
Je zou bv. eerst een string kunnen definiëren met
s = "Dit is een string"
en dan kijken wat de class is met
print(type('s'))
Classes hebben methods en properties (eigenschappen).
Definiëren van een class
class Auto(object):
Constructor
Elke class begint met het definiëren van de method
__init__
.
Deze method heet de zng. constructor, en initialiseert variabelen e.d.
De constructor heeft altijd een 1e argument dat verwijst naar het object dat
gecreëerd wordt, en evt. andere argumenten.
def __init__(self):
Instances
Zodra een class is gedefiniëerd kan je objecten (instances van de
class) aanmaken:
auto1 = Auto()
Tussen haakje komen dan nog de evt. argumenten te staan
self
hoef je niet te noemen, maar refereert naar
deze specifieke instance van de class.
Een iets uitgebreider voorbeeld:
class Auto(object):
def __init__(self, type, model):
self.type = type
self.model = model
auto1 = Auto('Volkswagen', 'Up')
auto2 = Auto('Peugeot', '405')
print(auto1.type)
print(auto1.model)
Properties
Een class heeft naast methods ook properties.
De class Auto
zou bv. een property
Wielen
kunnen hebben, met als standaardwaarde 4.
Properties definiëer je meestal voor de methods binnen een class.
Als je een instance van een class maakt, en je verandert de waarde van een property van de class, dan geldt dat alleen voor die ene instance, en niet voor de class als geheel of voor andere instances.
Inheritance
Als je een nieuwe class maakt, zet je tussen haakjes achter de naam van
de class object
.
Dat is omdat object
de basis is van alle andere
classes.
De nieuwe class erft alle eigenschappen en methods
van object
, en kan er nieuwe bij definiëren.
Dit heet inheritance.
Maar je kan ook zelf een nieuwe class definieren die erft van een al eerder
door jou gedefiniëerde class.
Een Volkswagen is een auto, en heeft een aantal generieke kenmerken en
acties die bij auto's horen, maar misschien ook een paar unieke die alleen
bij Volkswagens horen:
class VW(Auto):
De class waarvan je erft wordt ook wel de super-class, base class of parent class genoemd. De class die erft heet de child class.
Override
Als je inheritance gebruikt zou het kunnen zijn dat je niet alle methods net zo wilt gebruiken als in de parent class. In dat geval definiëer je in de child class een method met dezelfde naam, maar andere statements. Deze method zal dan in een instance van de child class de method uit de parent class overrulen (override).
Je zou bv. in de class Auto
een method
Rijden
kunnen hebben, die alleen maar
afdrukt "De auto rijdt".
In de class VW
, die van Auto
erft, zou je de afdrukregel kunnen veranderen in
"De Volkswagen rijdt".
Alle andere properties en methods zouden van Auto
overgenomen worden, alleen de method Rijden
zou anders werken.
In plaats van een complete override, kan je ook gebruikmaken van de method
uit de parent class, en er iets aan toevoegen.
Je kan de method uit de parent aanroepen met de ingebouwde functie
super
.
In het voorbeeld dat ik eerder gebruikte zou je in de class
VW
de volgende aanroep kunnen gebruiken:
super(VW, self).Rijden
Het gevolg is dat Rijden
uit de class
Auto
wordt aangeroepen.
De 2 parameters van super
zijn hier trouwens
niet echt nodig.
Een child class kan properties en methods van meerdere parents erven. Je kan een hele lijst van parent classes tussen haakjes zetten.
Objects
Zoals gezegd is een 'list' ook een object.
Je kan als volgt een nieuw object van het list-type maken:
newlist = list()
newlist
is dan een lege lijst.
Exceptions (fouten)
Exceptions treden op (to throw an exception) als er iets fout gaat in de code, bv. als je een element van een list benadert dat buiten het bereik ligt of als je een dictionary key gebruikt die niet gedefiniëerd is.
Hier vind je een lijst van alle exceptions in Python 3.
Exceptions zijn gewoon classes, dus je kan (voortbouwend op de ingebouwde
exception classes) ook zelf exceptions definiëren.
IndexError
is bv. een class.
Als je een stuk code bestand wilt maken tegen fouten, zet je er de regel
try:
voor.
Achter
except:
zet je dan de code die eventuele fouten afvangt.
Voorbeeld:
try:
a = 10
b = 0
print(a/b)
except:
print("Fout opgetreden")
Je kan ook (verschillende) exceptions noemen, bv.:
try:
print(10 / 0)
print(3 + "aa")
except ZeroDivisionError:
print("Er wordt gedeeld door 0")
except TypeError:
print("Fout met types")
Je kan ook nog een andere tak toevoegen, nl.
else:
De code die daarna staat wordt dus alleen uitgevoerd als er geen exception was.
Tenslotte is er ook nog een tak die altijd wordt uitgevoerd:
finally:
Deze tak kan handig zijn als je bv. wat bestanden wilt sluiten, of andere
aflsuitende activiteiten wilt doen.
Het is verstandig om altijd een specifiek type exception op te geven na de
except
.
Als je een exception wilt forceren, gebruik je het statement
raise Exception("tekst")
Modules
Vanzelfsprekend zijn er al heel veel standaarddingen in Python geschreven, in de vorm van modules (ook wel libraries genoemd). Je kan hier een lange lijst vinden.
Modules zijn gewone Python files.
Er is bv. een module (math.py
) met
allerlei rekenfuncties (methods), maar ook bv. constantes (properties).
Voordat je een module kan gebruiken moet je hem importeren:
import modulenaam
Als je import math
doet, kan je daarna
refereren aan de property math.pi
(de waarde pi).
Of aan de method math.factorial
.
Als je maar 1 functie uit de module importeert kan je ook dit doen:
from modulenaam import functienaam
(en hetzelfde geldt natuurlijk ook voor properties).
Je zou bv. kunnen zeggen:
from math import pi, factorial
Als je daarna refereert aan de geïmporteerde dingen hoef je niet meer
'math.' er voor te zetten.
Packages
Packages zijn collecties van bij elkaar horende modules in dezelfde folder.
In de folder moet wel een speciale file zijn met de naam
__init__.py
Als je in je programma modules uit je package wilt gebruiken, zeg je:
from package_name import module_name
Het is wel belangrijk dat de package folder binnen de folder zit waarin je het programma uitvoert.
Package manager
Het is vaak niet nodig om zelf alle code te schrijven.
Maar naast de in Python ingebouwde modules zijn er ook kant-en-klare packages.
Het vinden van dat soort packages gebeurt met de package manager
(pip
).
In de laatste versies (bv. >= 3.4) wordt pip
automatisch geïnstalleerd.
Je moet hem misschien nog wel upgraden.
Om pip
te installeren download je de file
get-pip.py
, en voert die dan uit in Python.
Met het in Python ingebouwde commando
dir
kan je zien wat er in een package zit, bv.:
dir(requests)
Met pip list
(buiten Python) kan je zien welke
packages er geïnstalleerd zijn.
Voorbeeld
from urllib import request
url = "http:\\" + input("Voer een URL in zonder http en de slashes: ")
webpage = request.urlopen(url)
data = webpage.read()
savefile = input("Voer een bestandsnaam in om de web page in te op te slaan: ")
fileobj = open(savefile, "w+")
fileobj.write(data.decode('utf-8'))
fileobj.close()
Logging van meldingen (waarschuwing, info, etc.)
Er is een standaardmodule voor het produceren van meldingen in een aantal categorieën: DEBUG, INFO, WARNING, ERROR en CRITICAL.
Je kan gebruik maken van de module door het statement
import logging
op te nemen.
Daarna kan je bv. logging.info("melding")
in je code opnemen.
Overigens worden standaard alleen de hoogste 3 categorieën afgedrukt,
dus WARNING en hoger.
Je kan het logging level veranderen met een statement als dit:
logging.basicConfig(filename="test.log", level=logging.DEBUG)
Omdat DEBUG
het laagste niveau is wordt nu alles
gelogged.
De uitvoer gaat naar test.log
Je kan ook de layout van de messages veranderen, bv. als volgt:
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG)
En als je de tijd wilt opnemen, doe je dat door
%(asctime)s
ook nog toe te voegen.
Als de layout van tijd en datum je niet aanstaan, kan je het volgende
stuk toevoegen: datefmt='%m/%d/%Y %I:%M:%S %p'
(%I
staat voor 12-uur klok, i.t.t.
%H
, %p
staat voor AM/PM).
Aandachtspunten
Troubleshooting
Syntax
In geval van syntaxfouten, kan je het beste eerst checken of alle haakjes (zowel de gewone, als de curly braces (zoals '}') in balans zijn.
Een andere, veel voorkomende, fout is het ontbreken van een ';' (semicolon, puntkomma) aan het eind van een statement.
Verder kan je checken of alle variabelen gedeclareerd zijn. Daarbij moet je bedenken dat C(++) case sensitive is!!!
Links
Reageer via E-mail (dalmolen@xs4all.nl)
Deze pagina is voor het laatst gewijzigd op: 09-02-23 14:30:25