12: Tips

Deze les bevat een aantal weetjes over Python die niet aan bod zijn gekomen in de voorgaande lessen.

print-opties

De enige manier om uitvoer af te drukken die we tot nu toe gezien hebben is het gebruik van de functie print(), waarmee meerdere waarden kunnen worden afgedrukt, gescheiden door een spatie, en afgesloten met een regeleinde (waardoor verdere uitvoer op een nieuwe regel begint). In feite aanvaardt print een paar sleutelwoordargumenten (Eng.: keyword arguments) die het mogelijk maken dit gedrag aan te passen aan je behoeften.

    • Om een string S te gebruiken als scheiding tussen de waarden in plaats van een spatie: voeg het argument sep = «S» toe
    • Om een string S te gebruiken als afsluiting in plaats van een regeleinde: voeg het argument end = «S» toe

Deze taalvoorziening, sleutelwoordargumenten, is het gemakkelijkst te demonstreren met een paar voorbeelden.

Voorbeeld
Voorbeelden van sep en end. Kijk naar het effect van elke print-opdracht.

De sleutelwoordargumenten moeten aan het einde van de lijst met argumenten worden toegevoegd; anders zal een fout optreden. Wanneer je ze beide gebruikt kunnen ze in willekeurige volgorde worden opgegeven.

Programmeeroefening: Alfabet-aerobics
Debug het volgende programma, door gebruik te maken van hetgeen we zojuist geleerd hebben, zodanig dat het alfabet in hoofdletters op één regel wordt afgedrukt.

Namen die zijn toegestaan voor variabelen en functies

  • Namen kunnen bestaan uit letters, getallen en het underscore (_)-teken
  • Het eerste teken van een naam moet een letter zijn.
  • Python maakt onderscheid tussen hoofdletters en kleine letters.

Zo is my_3rd_int een naam die is toegestaan, maar 3rd_int is dat niet.

Voorbeeld
Een voorbeeld over onderscheid tussen hoofdletters en kleine letters.

Aflopende for-lussen & andere

Herinner je je nog hoe we lieten zien hoe for-lussen getallen kunnen doorlopen in opklimmende volgorde?

Voorbeeld
Een for-lus

Vaak is het nodig om een for-lus te schrijven die getallen doorloopt in dalende volgorde (van het grootste naar het kleinste). Om dat te kunnen doen gebruiken we range met een derde argument met de naam stap:

Voorbeeld
Negatieve stap bij range

Wanneer je even nadenkt, zul je kunnen vaststellen dat range(0, 5) hetzelfde is als  range(0, 5, 1): de verstek- ophoging is 1. Denk eraan dat range(start, stop, step) al stopt, een stap vóórdat stop bereikt wordt. Voor nog meer informatie, zie de Python-handleiding.

Programmeeroefening: Lucky Sevens
Schrijf een programma waarbij je een for-lus gebruikt met stapgrootte 10, om alle getallen met 2 cijfers af te drukken die eindigen op een 7, in oplopende volgorde.

Op dezelfde manier kun je string[x:y:-1] gebruiken om een deel van een string om te draaien.

Voorbeeld
Negatieve stap bij substrings

Zo geeft string[x:y:2] een substring van string met de tekens op positie x, x+2, x+4, ...

Bij een for-lus is er een andere manier om een aflopende volgorde te realiseren: reversed(range(x, y)). De lus gaat dan van y-1 tot x in afnemende volgorde.

Minder code schrijven

Python kent verschillende manieren om de hoeveelheid code te verminderen; we laten er hier een paar zien:

Op deze website zullen we er niet altijd gebruik van maken, omdat daardoor het programma soms moeilijker leesbaar wordt.

Toekenningsopdrachten

In Python kan je schrijven "x += 1"; dat betekent "voeg 1 toe aan x". Het is een verkorte schrijfwijze voor "x = x + 1" zoals we hieronder zullen laten zien:

Voorbeeld
Voorbeelden van +=, -=, *=, /=

Op dezelfde manier bestaan er operatoren voor geheeltallige deling (//=), modulo (%=), en machtsverheffen (**=).

Een lichaam op dezelfde regel (Eng.: inline blocks)

We hebben een aantal opdrachten gezien die worden gevolgd door een ingesprongen "lichaam" met code: for, if, else, elif, while, en def, bijvoorbeeld:

if x==y:
  «lichaam» #ingesprongen, meerdere regels
In het speciale geval dat een «lichaam» maar één regel bevat kun je dat in Python ook als volgt schrijven:

if x==y: «lichaam» # enkele regel
Hier volgt een voorbeeld:

Voorbeeld
Opdracht met lichaam op één regel

Dit is echter wel beperkt: een samengesteld lichaam met een dubbele punt erin (if, for, etc.) kan niet worden gebruikt als een inline block. Bijvoorbeeld if 2>1: if 4>3: print() geeft een syntax error.

Gelijktijdige toekenningen

Python staat je toe meerdere toekenningen tegelijk te doen op één regel:

Voorbeeld
Gelijktijdige toekenningen

Merk op dat dit je in staat stelt om de verwissel-opgave met een programma van 1 regel op te lossen!

Vergelijkingen Rijgen

Python staat je ook toe om meerdere vergelijkingen te combineren:

Voorbeeld
Vergelijkingen rijgen
Elke keten v1 c1 v2 c2 v3 ... waar alle v waarden zijn en alle c vergelijkinsoperatoren, wordt hetzelfde behandeld als (v1 c1 v2) and (v2 c2 v3) and ...

Standaardwaarden voor [:] en range()

Je kan de start- en/of eindwaarden ook weglaten wanneer je de substring-operator [:] gebruikt. (Dit geldt ook voor lijsten, zoals we in de volgende les zullen zien.) De standaardwaarde van de eerste index is 0 (het begin van de string) en de standaardwaarde van de laatste index is de lengte van de string. Op dezelfde manier is range(n) een afkorting voor range(0, n).

Voorbeeld
Gebruik maken van de standaardwaarde van [:] en range()

None

Sommige functies geven een waarde terug als hun belangrijkste effect, zoals abs(x), maar andere functies die belangrijker zijn vanwege hun neveneffecten, zoals print(), geven de verstekwaarde (Eng.: default valueNone terug:

Voorbeeld
Het resultaat van print

We gebruiken None als een speciale waarde in Python wanneer er geen andere waarde geschikt is. Als je type(None) uitvoert zie je dat None zelfs z'n eigen type heeft: NoneType. Laten we ook gelijk even bekijken wat het type van een type is:

Voorbeeld
Het type van een type

In de volgende opgave moet je de tussenresultaten achterhalen van een lange opdracht opgebouwd uit type en print.

Volgorde-oefening: One None
De uitvoer van print(type(print(type(type(print(print())))))) bestaat uit 4 regels. Zet ze in de goede volgorde.
  • <class 'type'>
  • None
  • «blank line»
  • <class 'NoneType'>
Correct!

Laten we het hier maar even bij houden. Je kunt nu door naar de volgende les!