Python – Leren programmeren – deel 3
Welkom terug bij de 3e Python ā Leren Programmeren post! In deel 1 hebben we gekeken naar wat Python is en in deel 2 hebben we al een goede basis gelegd. Wat opvalt is dat het allemaal nog steeds heel goed en duidelijk leesbaar is. Als je de basisregels onthoud kun je dus heel snel een script of programma schrijven. In deze post gaan we verder met een aantal functies en imports.
Imports
Binnen een Python script is het mogelijk om functies van andere scripts te importeren. Python komt met een volle bibliotheek aan mogelijkheden welke kant-en-klaar voor je gereed zijn om te gebruiken. Mocht de benodigde functie niet aanwezig zijn dan kun je de Python bibliotheek altijd proberen aan te vullen door de gewenste functie package te downloaden op het internet. Als je de functie in de bibliotheek hebt staan kun je deze aanroepen in Python. Imports staan meestal bovenin het script.
Je huidige bibliotheek is in PyCharm te zien aan de linkerkant:
Zo is ābase64.pyā een module die standaard aanwezig zijn. We importeren deze als volgt:
import base64 |
We kunnen base64.py gebruiken om zaken te versleutelen via de base64 standaard (op zichtzelf staand een zwakke standaard). Bijvoorbeeld:
import base64 original_string = "Dit is gewone data" print (original_string) encode2byte = str.encode(original_string) type(bytes) # Zorgt ervoor dat de string omgezet wordt naar Byte Data (benodigd voor base64). encoded_string = base64.b64encode(encode2byte) print (encoded_string) |
b’RGl0IGlzIGdld29uZSBkYXRh’
Als we dit script uit zouden voeren zonder de ābase64.pyā module te importeren dan zou dat resulteren in de volgende fout: āNameError: name ‘base64’ is not definedā.
Functies
Een functie in Python is een blok code die wordt gebruikt om ƩƩn specifieke taak uit te voeren en in de rest van het script herbruikbaar is. Functies zorgen voor een betere modulariteit voor de toepassing en een hoge mate van code hergebruik.
We hebben al gespeeld met een aantal ingebouwde Python functies zoals print. Maar in dit hoofdstuk gaan we onze eigen functies creƫren.
Om een functie te maken starten we de functie met het keyword ādefā welke afkomstig is van definiĆ«ren / define. Na ādefā plaatsen we de functienaam. Deze naam kunnen we later in het script weer aanroepen om de functie te gebruiken. Na de functienaam volgen haakjes (). Tussen deze haakje kunnen we input parameters en argumenten plaatsen. Daarna volgt een dubbele punt: en begint de functiecode. De functiecode kan starten met een āfunction docstringā ofwel de uitleg van de functie. Tenslotte schrijven we de functie en als de functie klaar is sluiten we deze af met een āreturnā welke (optioneel) een waarde terugstuurt naar de caller. Een āreturn statementā zonder waarde is hetzelfde als āreturn Noneā.
Een eigen functie wordt als volgt gemaakt:
def happyBirthday(persoon): "Zing Happy Birthday voor alle opgegeven personen." print("Happy Birthday to you!") print("Happy Birthday to you!") print("Happy Birthday, lieve " + persoon + ".") print("Happy Birthday to you!") return happyBirthday('Maaike') happyBirthday('Andre') happyBirthday('Tineke') |
Wat gebeurt er in deze functie:
1. Met ādef happyBirthdayā definiĆ«ren we een functie genaamd āhappyBirthdayā.
2. Met ā(persoon)ā maken we de variabele āpersoonā aan in de functie welke gevuld kan worden met meegestuurde data.
3. Vervolgens openen we de functie met een dubbele punt : en plaatsen we de functie docstring waarin we uitleggen wat de functie doet. Deze docstring (comment) staat tussen “”.
4. Na de docstring start de functie welke verschillende regels tekst op het scherm print. Op de een na laatste regel wordt verwezen naar de variabele āpersoonā. Hier wordt dus de data ingevuld welke meegestuurd is tijdens het aanroepen van de functie.
5. Met een return eindigen we de functie.
Vervolgens zien we dat we in Python 3x de functie aanroepen. We roepen de functie aan gevolgd door de parameters die meegestuurd moeten worden. In dit geval sturen we 3x een andere naam mee, namelijk: 1x Maaike, 1x Andre en 1x met Tineke.
Het resultaat ziet er dan als volgt uit:
Happy Birthday to you!
Happy Birthday to you!
Happy Birthday, lieve Maaike.
Happy Birthday to you!
Happy Birthday to you!
Happy Birthday to you!
Happy Birthday, lieve Andre.
Happy Birthday to you!
Happy Birthday to you!
Happy Birthday to you!
Happy Birthday, lieve Tineke.
Happy Birthday to you!
Let ook op de witruimte binnen de functie. Zoals al eerder gezegd definieert Python hiermee verschillende codeblokken. Dus na ādef happyBirthday(persoon):ā springt de werkelijke functie in met een tab. Nadat de functie met een āreturnā is afgesloten springt de code weer een tab terug.
Deze tabs verhogen de leesbaarheid en zonder deze tabs zou de functie resulteren in een fout āIndentationError: expected an indented blockā.
Globale variabelen (global variables) zijn ook beschikbaar binnen functies. Variabele binnen functies zijn alleen beschikbaar binnen de functie. Normaliter is slim om variabelen zoveel mogelijk binnen de functie te houden om verwarring te voorkomen. Als een variabele echter benodigd is binnen meerdere functies of op meerdere locaties in de code dan is het goed om er een globale variabele van te maken.
Reguliere expressie en Escapes
Binnen Python kunnen we ook werken met reguliere expressies en zullen we soms bepaalde zaken moeten āescapenā. Als je wilt weten hoe reguliere expressies werken check dan even deze post: https://jarnobaselier.nl/reguliere-expressie-regular-expression-regexp-regex-re/. Dan laat ik je verderop zien hoe we dat in Python doen. Maar we starten met de escapes.
Het kan voorkomen dat bepaalde zaken āescapedā moeten worden. Neem als voornbeeld de docstring uit bovenstaande functie:
“Zing Happy Birthday voor alle opgegeven personen.”
Dit werkt prima. Maar als ik er de volgende zin van wil maken (en dus quotes binnen quotes ga gebruiken) dan werkt het niet:
“Zing “Happy Birthday” voor alle opgegeven personen.”
Dit zal resulteren in de error: āSyntaxError: invalid syntaxā.
In dit geval zullen we de quotes van āHappy Birthdayā moeten āescapenā zodat deze als gewone platte tekst geĆÆnterpreteerd wordt. Dit doen we door de toevoeging van het ā\ā symbool (1 backslash) voor het teken dat je wilt escapen. Dus de volgende docstring is dan wel geldig:
“Zing \”Happy Birthday\” voor alle opgegeven personen.”
In bovenstaande voorbeeld hadden we āHappy Birthdayā ook tussen enkele quotes kunnen plaatsen omdat de uitvoer gedefinieerd is tussen dubbele quotes. Dit werkt ook visa versa. Ook speciale karakters e.d. kunnen allen āescapedā worden met de backslash.
Eigenlijk is de backslash een onderdeel van RegEx. RegEx ofwel reguliere expressies worden volledig ondersteund in Python en worden mogelijk gemaakt middels de āreā module. Bij het schrijven van reguliere expressies in Python is het raadzaam om āraw stringsā te gebruiken in plaats van gewone Python strings. Ruwe strings beginnen met een speciale prefix (r). Bij een ruwe string zal Python backslashes en andere speciale karakters in de string niet proberen te verwerken zodat deze direct geparsed worden aan de reguliere expressie (re) module.
Dit betekend dat een patroon, zoals “\ n \ w” niet wordt geĆÆnterpreteerd en gewoon kan worden geschreven als “r \ n \ w” in plaats van “\\ n \\ w”. Dat is makkelijker om te schrijven en lezen.
In principe kunnen we binnen Python alle RegEx sympolen gebruiken zoals ook hier https://jarnobaselier.nl/reguliere-expressie-regular-expression-regexp-regex-re/ beschreven zijn. Hierbij een paar voorbeelden:
- [] – brackets
Tussen brackets geven we de toegestane waardes op. [abc] betekend dus dat op die plek (1 karakter) een a, b of c moet staan om aan het filter te matchen. Het ā-ā teken kan ook gebruikt worden als ātot en metā symbool. Dit is dus ook geldig: [a-c]. - \ – backslash
De backslash is al besproken en is het āescapeā karakter. Wil je dus zoeken op het symbool ā*ā (een RegEx wildcard) dan kun je \* gebruiken. Zoek je op de backslash dan gebruik je ā\\ā. - ^ – dakje
Het dakje (tussen brackets) betekend āalles behalveā. Dus [^a-z] betekend alles behalve de letters a tot en met z. - . – punt
Een punt betekend een willekeurig karakter (behalve \n). - * – sterretje
Het sterretje betekend dat het voorgaande karakter 0x of vaker voor mag komen. ā123*ā kan dus zijn ā12ā, ā123ā, ā1233ā, ā12333ā, ā123333ā etc. - + – plus
Het plusteken betekend dat het voorgaande karakter 1x of vaker voor mag komen. ā123+ā kan dus zijn ā123ā, ā1233ā, ā12333ā, ā123333ā etc. maar niet ā12ā. - ? – vraagteken
Het vraagteken wil zeggen dat het voorgaande karakter maximaal 1x voor mag komen. Dus ā123?ā kan ā123ā en ā12ā zijn. - \n
Een nieuwe lijn / witregel - \d
Elk decimaal teken, dus hetzelfde als [0-9] - \D
Geen decimaal teken, dus hetzelfde als [^0-9] - \s
Elk whitespace karakter, dus hetzelfde als [ \t\n\r\f\v] - \S
Geen whitespace karakter, dus hetzelfde als [^ \t\n\r\f\v] - \t
Een tab - \w
Elk alfanumeriek karakter, dus hetzelfde als [a-zA-Z0-9_] - \W
Geen alfanumeriek karakter, dus hetzelfde als [^a-zA-Z0-9_]
Hier een RegEx voorbeeld in Python:
import re regex = re.compile("[a-zA-Z]+" "[0-9]+" "[a-z]*") str = "Xcddddddddc8dddd" print(regex.match(str).group()) |
In dit simpele voorbeeld zien we de volgende zaken:
1. We importeren de re module zodat we regex kunnen gebruiken.
2. We definieren een regex mask welke we āregexā noemen.
3. We plaatsen een willekeurige string/
4. We matchen de string aan de regex mask en printen de uitkomst.
Als we dit voorbeeld uitbreiden dan zien we het volgende:
import re regex1 = re.compile("[a-zA-Z]") regex2 = re.compile("[a-zA-Z]+" "[0-9]") regex3 = re.compile("[a-zA-Z]+" "[0-9]+" "[a-z]*") regex4 = re.compile("[a-zA-Z]+" "[0-9]+" "[a-zA-Z]*") str = "Ikben1grootfanvanPython" print(regex1.match(str).group()) print(regex2.match(str).group()) print(regex3.match(str).group()) print(regex4.match(str).group()) |
I
Ikben1
Ikben1grootfanvan
Ikben1grootfanvanPython
De 1e mask matched alleen het 1e karakter omdat deze overeenkomt met een kleine letter of een hoofdletter [a-zA-Z]. De 2e mask gaat door t/m het 1e cijfer [a-zA-Z]+” “[0-9]. De derde mask gaat door tot de hoofdletter [a-zA-Z]+” “[0-9]+” “[a-z]* en de laatste mask matched met de gehele string [a-zA-Z]+” “[0-9]+” “[a-zA-Z]*.
In bovenstaande voorbeeld gebruik ik āprint(regex4.match(str).group())ā i.p.v. āprint(regex1.match(str))ā zodat we ook werkelijk de string te zien krijgen die gematched i.p.v het gegeven of er een match is of niet (none).
Bovenstaande match functie controleert of een string matched op een RegEx mask. I.p.v. āmatchā kunnen we ook āsearchā gebruiken voor het zoeken naar een specifiek stukje tekst. Bijvoorbeeld:
import re regex1 = re.compile("[*1*]") str = "Ikben1grootfanvanPython" print(regex1.search(str).group()) |
1
Als we bovenstaande verbeteren dan kunnen we zelfs zoeken en vervangen met de re.sub functie. In onderstaande voorbeeld vervangen we alle eās en oās voor een āaā.
import re string = "Dit is een voorbeeld" replaced = re.sub('[eo]', 'a', string) print (replaced) |
Dit is aan voorbeeld
Conclusie
Dat is al aardig pittig toch? In de volgende post gaan we een ander essentieel onderdeel bespreken, namelijk de loops. Na de volgende post zal je zelf in staat zijn om al aardig te scripten in Python. Tot de volgende post!





