14: Methoden

Tot zover hebben we een tweetal data structuren in Python laten zien: strings en lijsten. Elk ervan kent meerdere methoden, die een variant zijn op functies.

Zo is bijvoorbeeld reverse() een methode bij een lijst. Zoals de naam suggereert draait deze methode de lijst om. Zo wordt bijvoorbeeld het eerste element van de lijst de laatste en omgekeerd). Je roept een methode aan door de punt (.) structuur te gebruiken zoals bijvoorbeeld in:

«objectNaam».«methodeNaam»(«lijst met argumenten, mogelijk leeg»)

Ter vergelijking, de syntax die we eerder gezien hebben bij functies:

«functieNaam»(«lijst met argumenten, mogelijk leeg»)

Hier volgt een voorbeeld van een aanroep van de methode reverse die werkt op een lijst.

Voorbeeld
Een lijst omdraaien.

Een voorbeeld van een methode met een argument is str.startswith:

Voorbeeld
Een string methode.

Veel methoden.

Hieronder zullen we de meest voorkomende methoden voor strings en lijsten noemen. Het gaat hierbij om taken die je ook zelf wel kunt schrijven, maar het gebruik van standaard methoden heeft het voordeel dat het je programma makkelijker leesbaar maakt om te lezen en ook makkelijker om je programma aan te passen.

Lijsten

De volgende methoden veranderen de lijst niet:

  • list.index(X): zoekt X in de lijst. In het bijzonder geeft het een i terug zodanig dat list[i]==X terwijl het alle elementen doorzoekt. De kleinst mogelijke i wordt teruggegeven. Wanneer X niet voorkomt in de lijst wordt er een ValueError veroorzaakt.
    • X in list geeft True terug wanneer X een element van de lijst is, anders False. Door hiervan gebruik te maken wordt een ValueError vermeden. (Merk op dat in een operator is, geen methode.)
  • list.count(X): geeft terug het aantal keren dat X voorkomt in de lijst

Voorbeeld
Lijst methoden.

De volgende methoden passen de lijst aan:

  • list.append(X) voegt X toe aan het van de lijst
  • list.insert(i, X) voegt X toe op positie i
  • list.extend(L) voegt een lijst L toe als elementen aan het eind van de lijst
  • list.remove(X) verwijdert het eerste voorkomen van X
  • in de lijst

  • list.pop(i) verwijdert & geeft terug list[i], terwijl list.pop() verwijdert & geeft terug het laatste element
  • del list[i] verwijdert het i-de element van list (`merk op dat dit een "del statement" is, geen methode)
  • list.reverse() keert de liist om
  • list.sort() sorteert de lijst

Alle methoden, behalve pop geven None terug. Sommige van deze functies kunnen ook worden aangeroepen met iets andere argumenten; voor een compleet overzicht bekijk je de sectie lijst methoden in de Python documentatie. Bij lijsten kunnen "slices" (sublijsten) worden ingevoegd en verwijderd, vergelijkbaar met de string[x:y:z] notatie die we in voorgaande lessen zijn tegengekomen.

Programmeeroefening: De vervangingen
Gebruik index en andere lijst methoden om een functie replace(list, X, Y) te schrijven die alle X-en die voorkomen in list vervangt door Y. Bijvoorbeeld, wanneer  L = [3, 1, 4, 1, 5, 9] dan zal replace(L, 1, 7) bovengenoemde lijst L omzetten in [3, 7, 4, 7, 5, 9]. Om deze oefening uitdagender te maken, mag je geen [] gebruiken.
Merk op dat je geen return. hoeft te gebruikenHint
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

Strings

Evenzo als bij lijsten, kun je inindex en count ook gebruiken bij strings. Ze zijn zelfs sterker, omdat ze ook met substrings werken en niet alleen voor individuele karakters werken:

  • S in T geeft een Boolean (True of False) wanneer string S een substring is van string T
  • S.index(T) geeft de eerste index van S waar de substring T begint
  • S.count(T) geeft het aantal keren dat T niet overlappend voorkomt als substring van S

Voorbeeld
index en count gebruiken bij strings.

Hier volgen een paar nuttige str methoden:

  • Over hoofdletters en kleine letters: capitalize, lower, upper, islower, isupper
  • Karakters (letters, cijfers en tekens): isalpha, isdigit
  • Uitlijnen: center, ljust, rjust; strip verwijdert het uitlijnen
  • Substrings: endswith, startswith, find, replace
  • Parsing: split, splitlines

We zullen ze, wanneer nodig, meer in detail introduceren . Een complete gedetailleerde lijst met string methoden staat in de Python documentatie.

Strings zijn onveranderbaar. We noemden reeds list.reverse() die de volgorde van een lijst verandert door het om te keren, maar er bestaat geen str.reverse() methode. Dat is vanwege het feit dat string objecten niet kunnen worden aangepast zodra ze gemaakt zijn. In les 17 zullen we er meer over vertellen.

Hier volgt een voorbeeld van een string methode: S.replace(old, new) dat een veranderde versie van S teruggeeft waarbij iedere substring van old is vervangen door new. Dit heeft een nieuwe string tot gevolg zonder dat de de oude wordt aangepast:

Voorbeeld
Voorbeeld: replace geeft een nieuwe string terug, maar verandert niet de oude.

Bij de volgende oefening zijn de volgende methoden nuttig:

  • str.replace, die we zojuist hebben besproken
  • de Boolse methode str.isalpha() die True teruggeeft wanneer str een string (of karakter) is die alleen bestaat uit letters
  • de Boolse methode str.isdigit() die True teruggeeft wanneer str een string (of karakter) is die alleen bestaat uit cijfers
  • str.upper() die een versie van str teruggeeft in hoofdletters.

Programmeeroefening: Postcode in Canada
Definieer een functie postalValidate(S) die eerst nagaat of S een toegestane Canadese  postcode is:

  • verwijder eerst alle spaties;
  • de rest moet van de vorm L#L#L# zijn waarbij L letters zijn ( kleine letters of hoofdletters) en # cijfers zijn.

Wanneer S geen geen toegestane Canadese postcode is, geef je de Boolean False terug. Wanneer S dat wel is geef dan dezelfde postcode terug maar dan in een fraai format L#L#L# waarbij elke L een hoofdletter is.

Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

De rest van deze les is wat technisch van aard en bevat geen vereiste voorkennis voor de rest van de lessen.

Meer over objecten

Wanneer je meer over Python leert, zul je nog meer soorten classes (klassen) tegenkomen dan strings en lijsten. Andere die je waarschijnlijk ook nuttig zult vinden zijn file (bestand) objecten , sets (verzamelingen), en dictionaires.  Ze  kennen allemaal vele nuttige methoden. Je kunt Python vragen naar alle methoden van een gegeven object door de  dir functie te gebruiken:

Voorbeeld
De methoden van een str. Merk op dat startswith een van de methoden is.

Kijken naar de eigenschappen van een object wordt ook wel introspection (introspectie) genoemd. In Python kunnen allerlei objecten methoden hebben:

Voorbeeld
De  members van  int.

Sommige elementen van dir zijn member variabelen in plaats van methoden, zo is bijvoorbeeld  int.denominator een getal en geen functie. Technisch gezien, zijn in Python functies objecten, en zijn member functies speciale gevallen van member variabelen.

Je kunt ook introspectie toepassen op modules. Wanneer je import math (math importeert) en daarna dir(math) uitvoert, krijg je een lijst met alles uit de math module, inclusief het getal pi en de functie sqrt.

Waarom objecten?

Waarom hebben we methoden zoals S.index(T) in plaats van een eenvoudige functieaanroep index(S, T)? Of anders gezegd waarom willen we  überhaupt een object S en de methode str.index()?

De belangrijkste voordelen van objecten worden duidelijker naar mate je meer complexe en gevarieerde datatypen gebruikt bij het programmeren. Elk type object (bijv. de str class) representeert zowel de onderliggende data die wordt opgeslagen (bijv. een rij karakters en zijn lengte) als het type operaties die er op kunnen worden uitgevoerd  (bijv., het omzetten naar hoofdletters of het produceren van een substring). Een meer complex voorbeeld vormen de file objecten: ze representeren de naam van de file die kan worden geopend, de huidige positie in de file, en methoden om er in te schrijven en er uit te lezen. Je kunt zelfs je eigen datatypen definiëren!

Deze algemene aanpak wordt ook wel  "object-oriented programming" (OOP) genoemd. Enige voordelen zijn:

  • organisatie: Alles uit de math module kan worden gebruikt door middel van de  math.«name» syntax, waarmee wordt vermeden dat bestaande variabelen in je programma worden overschreven.
  • encapsulation: Zoals een programma tegelijkertijd kan werken met verschillende strings en files,  kun je werken met vele verschillende kopieën (instances) van het data type gedefinieerd door een andere element uit een class.
  • hergebruik: Wanneer je eenmaal een data type (zoals str) of een bibliotheek met methode (zoals math) hebt, kun je het  keer op keer gebruiken, of het delen met andere mensen.
  • debugging: Eerder zagen we dat door een functie te schrijven het hebben van vele kopieën van gelijksoortige code overbodig maakt, waardoor het debuggen gemakkelijker wordt. Functies verzamelen die samenhangen met een data type op een enkele plaats  (de class definitie heeft hetzelfde effect.
  • relaties tussen classes: Python weet dat de index methode het een kan betekenen voor een string maar iets anders voor lijst. Evenzo, kan Python niet alleen files  lezen en schrijven op je computer, maar het kan ook data lezen en schrijven  van het Internet. In beide gevallen (karakters of lijst elementen, en lokale files of die op afstand) de classes die er mee samenhangen kunnen op dezelfde manier worden gebruikt waarbij het concept overerving (inheritance) optreedt.

In de rest van de CS Circles lessen zulllen we alleen maar objecten en methoden gebruiken; je kunt later meer leren over het zelf maken van classes (kijk op de Resources pagina).

De volgende drie lessen kunnen in een willekeurige volgorde worden doorgewerkt. Ze vormen een scala aan uitdagingen waarin onderwerpen uit vroegere lessen gecombineerd aan de orde zullen komen.