Pythonfuncties

Leer je eigen functies in Python schrijven. Definieer functies en roep ze aan, geef waarden door met parameters, benoemde argumenten en standaardwaarden, en geef resultaten terug met return. Ontdek welke variabelen een functie kan zien en wijzigen, beschrijf je functies met docstrings en verdeel een programma in kleine functies met duidelijke namen die je één voor één bouwt en test.

BeginnerLes 4 van 10 in Cursus Inleiding tot programmeren met Python

Wat je leert

  1. Schrijf een functie met def, voer die uit door haar aan te roepen en volg de volgorde waarin Python een programma met functies uitvoert.
    • Definieer een functie en roep die aan
      Schrijf een functiekop en een ingesprongen functie-inhoud, kies een duidelijke naam en voer de functie uit door haar met ronde haakjes aan te roepen.
    • Volg het uitvoeringsverloop
      Volg de volgorde waarin Python instructies uitvoert wanneer functies andere functies aanroepen, en voorspel daarmee de uitvoer van een programma.
  2. Gebruik parameters en argumenten om een functie de waarden te geven waarmee zij werkt, gekoppeld op positie, op naam of via standaardwaarden.
    • Gebruik parameters en positionele argumenten
      Voeg parameters toe aan een functiekop, geef bij een aanroep bijpassende argumenten door en lees de fouten die een verkeerd aantal argumenten oplevert.
    • Roep functies aan met benoemde argumenten
      Geef argumenten door op parameternaam, combineer positionele en benoemde argumenten in de juiste volgorde en herstel de fouten die verkeerde combinaties veroorzaken.
    • Geef parameters standaardwaarden
      Maak parameters optioneel met standaardwaarden, zet verplichte en optionele parameters in de juiste volgorde en weet wanneer een standaardwaarde wordt aangemaakt.
  3. Gebruik return om een waarde terug te geven aan de code die een functie heeft aangeroepen, maak onderscheid tussen teruggeven en afdrukken en schrijf functies waarvan de resultaten kunnen worden opgeslagen, getest en gecombineerd.
    • Geef een waarde terug en gebruik die
      Beëindig een functie met return, gebruik de teruggegeven waarde in variabelen en expressies en ontdek waarom een waarde teruggeven verschilt van die afdrukken.
    • Geef via verschillende uitvoeringspaden waarden terug en combineer resultaten
      Schrijf functies met meerdere return-instructies, geef True of False terug, keer voortijdig terug uit een lus, geef twee waarden terug en geef het resultaat van de ene functie door aan een andere.
  4. Voorspel welke variabelen een functie kan zien en wijzigen, geef gegevens door en terug via parameters en retourwaarden en gebruik global alleen wanneer dat echt nodig is.
    • Werk met lokale variabelen en parameters
      Leg uit waarom variabelen die binnen een functie worden aangemaakt alleen tijdens de aanroep bestaan, hoe Python een naam vindt en waarom het wijzigen van een parameter de variabele van de aanroepende code niet wijzigt.
    • Gebruik globale variabelen zorgvuldig
      Lees globale waarden veilig, begrijp de fout die ontstaat bij toekenning aan een globale naam, gebruik de global-instructie correct en geef de voorkeur aan parameters en retourwaarden.
  5. Beschrijf functies met docstrings, verdeel een probleem over kleine functies met duidelijke namen en bouw en controleer een programma functie voor functie.
    • Documenteer functies met docstrings
      Schrijf docstrings van één en van meerdere regels volgens de gebruikelijke conventies en lees ze met help().
    • Verdeel een probleem over functies
      Verdeel een taak in stappen, maak van elke stap een functie met duidelijke invoer en uitvoer en organiseer het programma rond een main-functie.
    • Bouw en controleer een programma functie voor functie
      Ontwikkel een programma in kleine stappen, test elke functie met invoer waarvan je het resultaat kent en gebruik stacktraces en tijdelijke uitvoerinstructies om programmeerfouten binnen functies te vinden.

Functies in Python: uitleg

5 hoofdstukken

1

Definieer je eigen functies en roep ze aan

Een functie geeft een nuttig stuk code een naam, zodat je het kunt uitvoeren wanneer die taak nodig is. De definitie schrijven en een aanroep doen zijn afzonderlijke handelingen. Dat verschil verklaart waarom sommige programma’s eindigen zonder iets te tonen. Je schrijft correct ingesprongen definities, kiest leesbare namen en volgt de uitvoering wanneer een functie een andere functie aanroept en daarna terugkeert naar de aanroepende code.

1.1 Definieer een functie en roep die aan

Een functie is een benoemd codeblok dat één taak uitvoert. Ingebouwde functies zoals print() en input() bieden al nuttige taken die je kunt aanroepen; met def maak je je eigen functies. Een goede naam maakt van meerdere regels werk een aanroep die zegt wat je wilt laten doen.

Schrijf de kop en de inhoud
def greet():
    print("Hello!")
    print("Welcome to Python.")

greet()
greet()

De kop begint met def, gevolgd door de naam, ronde haakjes en een dubbele punt. De ingesprongen regels vormen de functie-inhoud. Gebruik vier spaties per inspringingsniveau. De niet-ingesprongen regels met greet() staan buiten de functie en zijn dus aanroepen in het hoofdprogramma.

Wanneer Python de definitie bereikt, maakt het de functie en geeft haar de naam greet. Het drukt nog geen van beide berichten af. De eerste aanroep begint bij de eerste regel van de functie-inhoud en drukt “Hello!” af, gevolgd door “Welcome to Python.” De tweede aanroep begint de inhoud opnieuw en drukt dezelfde twee regels af. In totaal zijn er vier uitvoerregels.

Een naam en een aanroep zijn verschillend

De ronde haakjes in greet() maken er een aanroep van, ook al heeft deze functie geen invoer nodig. Een regel met alleen greet verwijst naar de functie en voert niets uit. print(greet) toont een beschrijving van het functieobject, inclusief een geheugenadres; de begroeting wordt niet uitgevoerd.

Python moet een definitie hebben uitgevoerd voordat een aanroep de naam gebruikt. Als een bestand begint met greet() en greet daarna definieert, werpt de eerste regel NameError: name 'greet' is not defined op. Zet de definitie boven de aanroep op moduleniveau.

Kies namen die de taak beschrijven

Gebruik woorden in kleine letters, verbonden door onderstrepingstekens, zoals print_receipt of convert_to_miles. Namen mogen letters, cijfers en onderstrepingstekens bevatten, maar mogen niet met een cijfer beginnen of een gereserveerd woord zoals return zijn. Namen zijn hoofdlettergevoelig: greet en Greet zijn verschillende namen.

Houd ingebouwde namen beschikbaar. Na input = "yes" verwijst de naam input naar tekst, dus werpt input("Name? ") de fout TypeError: 'str' object is not callable op. Als je de variabele answer noemt, blijft de ingebouwde functie bereikbaar.

Herstel eerst de structuur

Een ontbrekende dubbele punt in de kop geeft SyntaxError: expected ':'. Een lege inhoud of een inhoud zonder inspringing geeft een IndentationError. Een geplande functie heeft nog steeds een instructie nodig; pass is een tijdelijke invulling die niets doet:

def print_receipt():
    pass

print_receipt()

Dit programma wordt zonder uitvoer uitgevoerd. De aanroep bereikt pass en daarna het einde van de inhoud. Vervang de tijdelijke invulling door de echte taak wanneer je klaar bent om die te implementeren. Als een regel bij de inhoud hoort maar op het verkeerde moment wordt uitgevoerd, controleer dan de inspringing voordat je de aanroep wijzigt.

Belangrijkste punten

  • Gebruik def name(): en een ingesprongen inhoud om een functie te definiëren.
  • Een definitie maakt de functie aan; ronde haakjes maken een aanroep die haar uitvoert.
  • Voer de definitie van een functie uit voordat je een aanroep doet die haar naam nodig heeft.
  • Kies beschrijvende namen in kleine letters met onderstrepingstekens en vermijd ingebouwde namen.
  • Gebruik pass als een geplande functie een geldige tijdelijke inhoud nodig heeft.

1.2 Volg het uitvoeringsverloop

Een programma met functies voert niet elke functie-inhoud uit in de volgorde waarin die op de pagina staat. Een aanroep verandert het uitvoeringsverloop: Python gaat de aangeroepen functie binnen, maakt haar werk af en hervat de aanroepende code direct na die aanroep.

Volg een aanroep binnen een andere aanroep
def line():
    print("----------")

def banner():
    line()
    print("  REPORT")
    line()

print("Start")
banner()
print("End")

Eerst definieert Python line en banner. Geen van beide functies wordt uitgevoerd. De volgende instructie drukt “Start” af. De aanroep van banner() gaat de functie-inhoud binnen, waarvan de eerste instructie line() aanroept.

Python gaat nu line binnen, drukt “----------” af en bereikt het einde. De uitvoering keert terug naar de volgende instructie in banner, die “ REPORT” afdrukt. De tweede aanroep van line() drukt nog een streepjeslijn af. Ten slotte eindigt banner, zodat het hoofdprogramma verdergaat en “End” afdrukt.

De uitvoer is:

Start
----------
  REPORT
----------
End
Houd niet-voltooide aanroepen bij

Terwijl line wordt uitgevoerd, wacht banner tot die functie klaar is. Het hoofdprogramma wacht ook op banner. Python houdt deze niet-voltooide aanroepen bij op de aanroepstapel. De binnenste actieve aanroep eindigt het eerst en elke aanroepende functie gaat verder bij haar eigen volgende instructie.

Nummer de regels van het programma om het op papier te volgen. Noteer een regel uit een functie-inhoud alleen wanneer de uitvoering die via een aanroep bereikt. Markeer bij elke aanroep waar de uitvoering verdergaat. Schrijf uitvoer op wanneer de bijbehorende print wordt uitgevoerd en behoud spaties en regelafbrekingen. Zo onderscheid je de route door de code van de uitvoer die deze oplevert.

Definieer hulpfuncties voordat ze nodig zijn

De definitie van een hulpfunctie mag onder de definitie van de aanroepende functie staan:

def show_report():
    draw_line()
    print("Ready")

def draw_line():
    print("====")

show_report()

Dit werkt omdat beide definities zijn uitgevoerd voordat de laatste aanroep show_report binnengaat. Python zoekt draw_line op wanneer de functie-inhoud die daadwerkelijk aanroept. Als je show_report() boven def draw_line(): zet, mislukt de aanroep wanneer die de ontbrekende hulpfunctie probeert te gebruiken.

Herhaalde aanroepen beginnen opnieuw

Een aanroep binnen een lus gaat bij elke herhaling de functie-inhoud binnen:

for i in range(3):
    line()

Met de eerste definitie van line drukt dit de streepjeslijn drie keer af. De functie begint bij elke aanroep bij haar eerste instructie.

Als een aanroep mislukt, toont Python een stacktrace. De laatste regel geeft het fouttype en de melding. De aanroepen daarboven lopen van de buitenste niet-voltooide aanroep tot de regel waar de fout optrad. Door eerst de laatste fout te lezen en daarna de binnenste regel en de aanroepende code te controleren, vind je zowel de mislukte bewerking als de route waarlangs de gegevens zijn aangeleverd.

Belangrijkste punten

  • Volg instructies in functie-inhoud in de volgorde van aanroepen en noteer uitvoer wanneer elke print wordt uitgevoerd.
  • De aanroepstapel houdt niet-voltooide aanroepen bij en bewaart waar de uitvoering verder moet gaan.
  • Een hulpfunctie kan onder de aanroepende functie worden gedefinieerd als haar definitie wordt uitgevoerd voordat ze wordt aangeroepen.
  • Lees de laatste fout in een stacktrace en onderzoek daarna de regel met de fout en de aanroepende code.
2

Geef informatie door aan functies

Met parameters kan één functie verschillende invoer verwerken zonder haar inhoud te herschrijven. De aanroepende code levert argumenten en Python koppelt die waarden aan de parameternamen voordat de inhoud begint. Je koppelt argumenten op positie en op naam, combineert deze vormen correct en kiest standaardwaarden voor veelvoorkomende gevallen. Je ziet ook waarom een standaardwaarde wordt aangemaakt wanneer de definitie wordt uitgevoerd en welk effect dat heeft op een lijst als standaardwaarde.

2.1 Gebruik parameters en positionele argumenten

Een functie wordt herbruikbaar voor verschillende invoer als haar kop de benodigde waarden benoemt. Deze namen zijn parameters. De aanroepende code levert argumenten: de werkelijke waarden die bij een bepaalde aanroep worden gebruikt.

Koppel waarden aan namen
def rectangle_area(width, height):
    print("Area:", width * height)

rectangle_area(4, 2.5)
rectangle_area(3, 7)

De parameters zijn width en height. Bij de eerste aanroep zijn de argumenten 4 en 2.5. Positionele argumenten worden van links naar rechts gekoppeld: width krijgt 4 en height krijgt 2,5. De functie-inhoud drukt “Area: 10.0” af. De volgende aanroep geeft dezelfde parameternamen nieuwe waarden en drukt “Area: 21” af.

Elke parameter werkt als een variabele binnen die aanroep. Je hoeft width en height niet vooraf een waarde toe te kennen; de aanroep levert die. Een functie zonder parameters heeft nog steeds lege ronde haakjes nodig, zowel in haar definitie als bij haar aanroepen.

De volgorde kan de betekenis veranderen
def describe_pet(animal, name):
    print(name, "is a", animal)

describe_pet("cat", "Milo")
describe_pet("Milo", "cat")

De eerste aanroep drukt “Milo is a cat” af. De tweede drukt “cat is a Milo” af. Beide aanroepen zijn geldige Python, dus geen foutmelding wijst op de verwisselde betekenis. Lees de volgorde in de kop voordat je positionele argumenten kiest, vooral wanneer meerdere parameters dezelfde soort waarde accepteren.

Argumenten kunnen expressies zijn

Python evalueert elke argumentexpressie voordat de functie-inhoud begint. Met side = 6 geeft de aanroep rectangle_area(side, side) twee keer 6 door en drukt “Area: 36” af. De variabelenaam in de aanroepende code hoeft niet overeen te komen met een van de parameternamen. De aanroep rectangle_area(side + 1, 2) geeft 7 en 2 door; die geeft niet de tekst “side + 1” door.

Lees een fout over het aantal argumenten

Elke parameter zonder standaardwaarde heeft een argument nodig. Met de bovenstaande oppervlaktefunctie:

AanroepWat gaat er mis
rectangle_area(4)height ontbreekt.
rectangle_area(4, 2, 1)Er zijn drie argumenten gegeven voor twee parameters.

De eerste werpt TypeError: rectangle_area() missing 1 required positional argument: 'height' op. De tweede werpt TypeError: rectangle_area() takes 2 positional arguments but 3 were given op. Controleer de kop van de genoemde functie en tel vervolgens hoe de aanroep haar parameters invult.

Geef de soort waarde door die de taak nodig heeft

Python dwingt een type niet af alleen omdat een parameter width heet. rectangle_area("4", 2) drukt “Area: 44” af, omdat tekst vermenigvuldigen met een geheel getal die tekst herhaalt. Omdat input() tekst teruggeeft, zet je numerieke invoer om voordat je die doorgeeft:

width = float(input("Width: "))
rectangle_area(width, 2)

Hier zet float() de ingevoerde tekst om in een getal voordat de oppervlaktefunctie die ontvangt.

Belangrijkste punten

  • Een parameter is een naam in de kop; een argument is een waarde die een aanroep levert.
  • Positionele argumenten vullen parameters van links naar rechts in.
  • Python evalueert argumentexpressies voordat de functie-inhoud wordt uitgevoerd.
  • Elke verplichte parameter heeft een waarde nodig; ontbrekende of overtollige argumenten werpen een TypeError op.
  • Zet numerieke invoer om van tekst voordat je die doorgeeft voor een berekening.

2.2 Roep functies aan met benoemde argumenten

Een benoemd argument noemt in de aanroep de parameter waarvoor het bedoeld is. Dat maakt een aanroep leesbaarder wanneer meerdere waarden met elkaar kunnen worden verward. Python koppelt de naam van het argument aan de naam in de kop in plaats van de positie te gebruiken.

Koppel op naam
def describe_pet(animal, name):
    print(name, "is a", animal)

describe_pet(name="Milo", animal="cat")
describe_pet(animal="cat", name="Milo")

Beide aanroepen drukken “Milo is a cat” af. De volgorde van benoemde argumenten kan veranderen omdat bij elke waarde de parameter staat die ze invult. Op dezelfde manier is rectangle_area(width=4, height=2.5) leesbaar zonder te controleren welke afmeting eerst kwam.

De naam van een benoemd argument is geen nieuwe variabele in de aanroepende code. In describe_pet(name="Milo", animal="cat") leidt name= de waarde “Milo” naar de parameter. Dit kent “Milo” niet toe aan een variabele op moduleniveau met de naam name. Schrijf benoemde argumenten zonder spaties rond =, volgens de gebruikelijke Pythonstijl.

Combineer positionele en benoemde argumenten
describe_pet("cat", name="Milo")

Het eerste argument vult animal op positie in. Het benoemde argument vult name in, zodat elke parameter precies één waarde krijgt. Positionele argumenten moeten eerst komen. De aanroep describe_pet(name="Milo", "cat") wordt afgewezen met SyntaxError: positional argument follows keyword argument.

Vul om een gemengde aanroep te onderzoeken de positionele plaatsen van links naar rechts in en koppel daarna de benoemde argumenten. Controleer of geen plaats twee keer is ingevuld en geen verplichte plaats leeg blijft.

Herstel dubbele of onbekende namen
AanroepDiagnose
describe_pet("cat", animal="dog")animal krijgt zowel “cat” als “dog”.
describe_pet(animal="cat", nmae="Milo")De kop heeft geen parameter met de naam nmae.

De dubbele waarde werpt TypeError: describe_pet() got multiple values for argument 'animal' op. De spelfout werpt TypeError: describe_pet() got an unexpected keyword argument 'nmae' op. Vergelijk namen teken voor teken; ook hoofdletters en kleine letters zijn van belang. Een andere volgorde van argumenten herstelt een dubbele toekenning aan één parameter niet.

Herken benoemde argumenten in ingebouwde functies
print("a", "b", "c", sep="-")
print("Loading", end="...")
print("done")

De eerste regel drukt “a-b-c” af. sep levert de tekst tussen de weergegeven waarden. De volgende twee aanroepen produceren “Loading...done” op één regel: end vervangt de gebruikelijke nieuwe regel na “Loading”.

Sommige ingebouwde functies accepteren ook benoemde argumenten; round(3.14159, ndigits=2) geeft bijvoorbeeld 3,14. Gebruik de parameternamen die zijn gedocumenteerd voor de functie die je aanroept. Een beschrijvend woord dat je zelf bedenkt, wordt niet herkend alleen omdat het bij de taak lijkt te passen.

Belangrijkste punten

  • Benoemde argumenten worden aan parameternamen gekoppeld, dus hun volgorde kan variëren.
  • Zet positionele argumenten vóór benoemde argumenten.
  • Vul elke parameter precies één keer in en spel elke naam van een benoemd argument exact.
  • Een naam bij een argument in een aanroep leidt een waarde naar een parameter; hij kent geen waarde toe aan een variabele in de aanroepende code.
  • Bij print bepaalt sep de scheidingstekst en end de regelafsluiting.

2.3 Geef parameters standaardwaarden

Dankzij een standaardwaarde kan een aanroep een argument weglaten wanneer een gebruikelijke keuze geschikt is. Schrijf de standaardwaarde naast de parameter in de kop. Als je een argument opgeeft, vervangt dat de standaardwaarde voor die aanroep.

Maak een parameter optioneel
def greet(name, greeting="Hello"):
    print(greeting + ",", name + "!")

greet("Ana")
greet("Ana", "Welcome")
greet("Ana", greeting="Hi")

De uitvoer is “Hello, Ana!”, “Welcome, Ana!” en “Hi, Ana!”. name is verplicht omdat die parameter geen standaardwaarde heeft. greet() werpt daarom een TypeError op, ook al is de andere parameter optioneel.

In deze koppen staan verplichte parameters vóór parameters met standaardwaarden. def greet(greeting="Hello", name): is ongeldig. Python meldt een syntaxisfout over een parameter zonder standaardwaarde die volgt op een parameter met een standaardwaarde. Zet name vóór greeting om die verplicht te houden.

Wijzig één optionele keuze
def order_coffee(size, shots=1, milk="none"):
    print(size, "coffee,", shots, "shot(s), milk:", milk)

order_coffee("large", milk="oat")

Dit drukt “large coffee, 1 shot(s), milk: oat” af. Het benoemde argument bereikt milk, terwijl shots de waarde 1 behoudt. Een positionele aanroep order_coffee("medium", 2) wijzigt shots en laat milk op “none” staan. Bij koppeling op positie wordt een optionele parameter niet overgeslagen om de volgende te bereiken.

Ingebouwde functies bieden ook standaardwaarden: gewone print() scheidt waarden met een spatie en eindigt met een nieuwe regel. round(3.7) geeft het gehele getal 4; round(3.14159, 2) vraagt om twee decimalen en geeft 3,14.

Standaardwaarden worden aangemaakt wanneer de definitie wordt uitgevoerd
rate = 0.05

def price_with_tax(price, tax_rate=rate):
    return price * (1 + tax_rate)

rate = 0.08
print(price_with_tax(100))
print(price_with_tax(100, rate))

De standaardwaarde slaat de waarde 0,05 op wanneer def wordt uitgevoerd. Als je rate later wijzigt, verandert die opgeslagen standaardwaarde niet. De aanroepen drukken “105.0” en “108.0” af: alleen de tweede geeft het nieuwe tarief expliciet door.

Voorkom dat je per ongeluk een lijst deelt

Een lijst bevat elementen en append voegt een element toe aan diezelfde lijst. Bij een lijst als standaardwaarde delen alle aanroepen die het argument weglaten die lijst:

def add_item(item, basket=[]):
    basket.append(item)
    print(basket)

add_item("apple")
add_item("pear")

Dit drukt ['apple'] af en daarna ['apple', 'pear']. De standaardlijst is één keer gemaakt, niet één keer per aanroep. Gebruik None als signaal om voor elk weggelaten argument een nieuwe lijst te maken:

def add_item(item, basket=None):
    if basket is None:
        basket = []
    basket.append(item)
    print(basket)

Nu drukken die twee aanroepen ['apple'] en ['pear'] af. Een expliciet doorgegeven lijst wordt nog steeds gebruikt zoals die is. Beschrijf optionele parameters en hun standaardwaarden in de docstring, zodat gebruikers weten welke waarden gelden als ze argumenten weglaten.

Belangrijkste punten

  • Een weggelaten optioneel argument gebruikt de standaardwaarde; een expliciet argument vervangt die.
  • Zet verplichte parameters vóór parameters met standaardwaarden.
  • Gebruik een benoemd argument om een latere optie te wijzigen zonder eerdere optionele plaatsen in te vullen.
  • Standaardexpressies worden één keer geëvalueerd wanneer def wordt uitgevoerd.
  • Een wijzigbare lijst als standaardwaarde wordt gedeeld door aanroepen die het argument weglaten.
  • Gebruik None en maak een lijst in de functie-inhoud wanneer elk weggelaten argument een nieuwe lijst nodig heeft.
3

Geef resultaten terug met retourwaarden

Een berekening wordt nuttiger wanneer haar resultaat kan worden gebruikt in een andere berekening, een voorwaarde of een weergave. De return-instructie maakt dat mogelijk door een waarde terug te geven aan de aanroepende code. Je maakt onderscheid tussen teruggeven en afdrukken, volgt de eerste return die wordt uitgevoerd en controleert paden die zonder bruikbaar resultaat kunnen eindigen. Daarna bouw je booleaanse functies, rond je zoekacties correct af en combineer je de resultaten van kleine functies.

3.1 Geef een waarde terug en gebruik die

Een functie kan een resultaat teruggeven dat de aanroepende code kan gebruiken. De return-instructie beëindigt de aanroep en geeft haar waarde terug. Op het punt van de aanroep staat de aanroep voor die retourwaarde.

Sla resultaten op en combineer ze
def rectangle_area(width, height):
    return width * height

area = rectangle_area(4, 2.5)
print(area)
print(rectangle_area(3, 4) + rectangle_area(2, 5))

De eerste aanroep geeft 10,0 terug, dat aan area wordt toegekend; de eerste print toont die waarde. Op de laatste regel geven de twee aanroepen 12 en 10 terug. Python telt die resultaten op en drukt “22” af. De functie zelf bevat geen print, zodat ze een resultaat kan leveren om op te slaan of als onderdeel van een grotere berekening.

Een retourwaarde kan ook in een voorwaarde worden getest of aan een andere functie worden doorgegeven. Zo staat de taak van de berekening los van de beslissing van de aanroepende code over het gebruik van het antwoord.

Afdrukken en teruggeven hebben verschillende taken
def double_print(n):
    print(n * 2)

result = double_print(5)
print(result)

De aanroep toont “10”, maar dat weergegeven getal wordt niet als resultaat teruggegeven. double_print bereikt het einde van haar inhoud en geeft dus None terug. De laatste regel drukt daarom “None” af.

BewerkingWaar de waarde naartoe gaat
print(value)Toont de waarde aan een persoon.
return valueGeeft de waarde terug aan de aanroepende code voor gebruik in het programma.

double_print(5) + 1 drukt eerst “10” af en werpt daarna TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' op. Vervang de inhoud door return n * 2 wanneer de aanroepende code het dubbele getal nodig heeft. Een functie die alleen bedoeld is om een effect te hebben, zoals een bericht tonen, kan terecht None teruggeven; zulke functies worden soms functies zonder bruikbare retourwaarde genoemd. Een functie met een bruikbaar teruggegeven resultaat wordt soms een functie met een bruikbare retourwaarde genoemd.

Stop bij de eerste uitgevoerde return
def to_fahrenheit(celsius):
    return celsius * 9 / 5 + 32
    print("Converted")

print(to_fahrenheit(20))

Dit drukt “68.0” af. De print binnen de inhoud wordt nooit bereikt omdat return de aanroep al heeft beëindigd. Verwijder die onbereikbare instructie of zet een noodzakelijke actie vóór de return. De omzetting geeft zwevendekommagetallen terug omdat / een zwevendekommagetal oplevert. De invoerwaarden 100 en -40 geven 212,0 en -40,0.

Een kale return zonder expressie beëindigt ook een aanroep en geeft None terug. Elke functieaanroep heeft een resultaat, ook wanneer geen bruikbare waarde is opgegeven.

Maak resultaten zichtbaar in een programmabestand

Een losse rectangle_area(3, 4) berekent in een bestand 12 en gooit het ongebruikte resultaat daarna weg. Gebruik print(rectangle_area(3, 4)) om het te tonen of ken het toe aan een variabele. De interactieve shell toont expressieresultaten behalve None, zodat een geslaagde proef in de shell er anders uit kan zien dan dezelfde regel uitvoeren in een bestand.

Belangrijkste punten

  • return value beëindigt de aanroep en laat de aanroep voor die waarde staan.
  • Afdrukken toont een waarde; teruggeven stelt haar beschikbaar aan de aanroepende code.
  • Het einde van de inhoud bereiken of een kale return gebruiken geeft None terug.
  • Instructies na een uitgevoerde return worden bij die aanroep niet uitgevoerd.
  • Gebruik een retourwaarde door die op te slaan, af te drukken, te testen of te combineren.

3.2 Geef via verschillende uitvoeringspaden waarden terug en combineer resultaten

Verschillende invoerwaarden kunnen verschillende antwoorden vereisen. Een functie kan meerdere return-instructies hebben, maar een aanroep stopt bij de eerste die wordt uitgevoerd. Volg het werkelijke pad door de takken en lussen om het resultaat te vinden.

Zet overlappende tests in de juiste volgorde
def letter_grade(score):
    if score >= 90:
        return "A"
    if score >= 80:
        return "B"
    if score >= 70:
        return "C"
    return "F"

Voor 85 is de eerste test onwaar en de tweede waar. De functie geeft “B” terug zonder de overige voorwaarden te testen. Voor 42 zijn alle drie de tests onwaar, dus levert de laatste return “F”. Afzonderlijke if-instructies werken omdat elke geslaagde tak de aanroep beëindigt.

De hoogste drempelwaarde moet hier eerst worden gecontroleerd. Als score >= 70 eerst kwam, zou een score van 95 “C” teruggeven. Bij overlappende bereiken kan een vroege brede overeenkomst een later, specifieker antwoord verhullen.

Dek het pad zonder passende tak af
def sign(n):
    if n > 0:
        return "positive"
    elif n < 0:
        return "negative"
    return "zero"

De laatste regel verwerkt nul. Zonder die regel zou sign(0) het einde bereiken en None teruggeven. Volg een invoerwaarde uit elke tak en elk overblijvend geval; als je alleen positieve en negatieve invoer test, mis je deze leemte.

Geef een booleaanse vergelijking terug
def is_even(n):
    return n % 2 == 0

if is_even(10):
    print("Even")

De vergelijking levert al True of False op. is_even(10) geeft True terug, terwijl is_even(7) False teruggeeft. Gebruik het resultaat rechtstreeks in een voorwaarde. Een extra == True helpt de test niet.

Rond een zoekactie af voordat je meldt dat er geen overeenkomst is
def smallest_divisor(n):
    for d in range(2, n):
        if n % d == 0:
            return d
    return n

Voor 91 voldoen de kandidaten 2 tot en met 6 niet, waarna 7 het getal zonder rest deelt. De return van 7 beëindigt zowel de lus als de functie. Voor 13 vindt de lus geen deler, dus geeft de laatste return 13 terug.

Een test op priemgetallen moet de zoekactie laten doorgaan nadat een kandidaat niet voldoet:

def is_prime(n):
    if n < 2:
        return False
    for d in range(2, n):
        if n % d == 0:
            return False
    return True

De laatste True staat buiten de lus. Als je die in een else binnen de lus zou zetten, zou de functie al na controle van de eerste kandidaat terugkeren: 9 zou ten onrechte worden aanvaard omdat het niet deelbaar is door 2. Met de gecorrigeerde functie geven 9 en 1 False terug; 2, 7 en 97 geven True terug. Voor 2 heeft de lus geen kandidaten en bereikt de uitvoering de laatste True.

Geef twee waarden terug
def share(total, people):
    return total // people, total % people

each, left = share(17, 5)
print(each, left)

De aanroep geeft één tuple terug, een gegroepeerd resultaat met 3 en 2. De toekenning pakt die uit in twee namen, zodat de uitvoer “3 2” is. Als je de aanroep rechtstreeks afdrukt, verschijnt “(3, 2)”. Het aantal namen moet overeenkomen met het aantal waarden dat wordt uitgepakt.

Combineer aanroepen van binnen naar buiten
def add(a, b):
    return a + b

def to_fahrenheit(celsius):
    return celsius * 9 / 5 + 32

print(to_fahrenheit(add(10, 15)))

add geeft eerst 25 terug. Dat wordt het argument voor to_fahrenheit, die 77,0 teruggeeft. Ten slotte toont print “77.0”. Elke binnenste aanroep moet de waarde teruggeven die de volgende functie nodig heeft.

Belangrijkste punten

  • De eerste uitgevoerde return beëindigt een aanroep, dus zet overlappende tests zorgvuldig op volgorde.
  • Zorg voor een bruikbaar resultaat voor elk invoerpad dat de functie moet verwerken.
  • Een booleaanse functie kan rechtstreeks een vergelijking teruggeven.
  • Geef binnen een zoeklus een gevonden resultaat terug; meld pas dat er geen overeenkomst is als alle kandidaten zijn afgewezen.
  • Door komma’s gescheiden retourwaarden vormen één tuple die kan worden uitgepakt.
  • Bij geneste aanroepen wordt het binnenste resultaat het argument van de buitenste aanroep.
4

Begrijp waar variabelen geldig zijn: lokaal en globaal geldigheidsbereik

Een naam binnen een functie kan er precies hetzelfde uitzien als een naam daarbuiten en toch naar een afzonderlijke variabele verwijzen. Het geldigheidsbereik geeft aan waar een naam kan worden gebruikt, en toekenning helpt bepalen welke naam Python bedoelt. Je volgt parameters en andere lokale variabelen tijdens een aanroep, maakt onderscheid tussen hernieuwde toekenning en het wijzigen van een gedeelde lijst en leest globale instellingen. Je herstelt ook een veelvoorkomende fout met geldigheidsbereik en maakt veranderende waarden expliciet in aanroepen.

4.1 Werk met lokale variabelen en parameters

Geldigheidsbereik beschrijft waar een naam kan worden gebruikt. Parameters en namen waaraan binnen een functie een waarde wordt toegekend, zijn lokaal voor de aanroep van die functie. Aanroepende code en een functie kunnen vergelijkbare namen gebruiken zonder dezelfde lokale variabelen te delen.

Houd lokale namen binnen hun aanroep
def make_greeting():
    message = "Hi"
    print(message)

make_greeting()

Dit drukt “Hi” af. Als je print(message) na de aanroep toevoegt, wordt NameError: name 'message' is not defined opgeworpen: de lokale naam is daar niet beschikbaar. Geef de waarde terug en sla die op om haar beschikbaar te maken voor de aanroepende code:

def make_greeting():
    return "Hi"

message = make_greeting()
print(message)

De message op moduleniveau is een nieuwe variabele in de aanroepende code die de retourwaarde ontvangt. De functie maakt haar eigen lokale namen niet buiten de functie zichtbaar.

Elke aanroep krijgt nieuwe lokale variabelen. Als een functie-inhoud count = 0 instelt, er 1 bij optelt en die afdrukt, drukken twee aanroepen “1” en “1” af. De tweede aanroep gaat niet verder met de teller van de eerste aanroep. Verschillende functies kunnen ook onafhankelijk van elkaar lokale namen zoals total gebruiken.

Volg naamverhulling en het opzoeken van namen
x = 10

def show():
    x = 5
    print(x)

show()
print(x)

De uitvoer is eerst “5” en dan “10”. De lokale x verhult de globale x binnen show; de toekenning wijzigt de waarde op moduleniveau niet. Een globale variabele hoort bij het globale bereik van het bestand. Gewone toekenningen buiten functies maken globale variabelen aan.

Voor een functie die op moduleniveau is gedefinieerd, zoekt Python een naam eerst onder haar lokale namen, dan onder de globale namen van het bestand en daarna onder ingebouwde namen zoals print. De eerste overeenkomst wordt gebruikt. Lokale en globale namen zijn dus verschillende plaatsen om te controleren wanneer een waarde verkeerd lijkt.

Een parameter opnieuw toekennen laat de naam van de aanroepende code ongemoeid
def add_bonus(points):
    points = points + 10
    print(points)

score = 50
add_bonus(score)
print(score)

points begint met de waarde 50. Door de lokale hernieuwde toekenning wordt die 60, dus is de eerste uitvoer “60”. De score van de aanroepende code is nog steeds 50. Gebruik een functie die points + 10 teruggeeft en schrijf daarna score = add_bonus(score) om die naam expliciet bij te werken.

Een lijst wijzigen is een andere bewerking

Een lijst kan via twee namen worden gedeeld:

def add_guest(guests, name):
    guests.append(name)

party = ["Ana"]
add_guest(party, "Ben")
print(party)

De parameter guests en de variabele party van de aanroepende code verwijzen naar dezelfde lijst. append wijzigt de inhoud van die lijst, dus is de uitvoer “['Ana', 'Ben']”. Met guests = [] binnen de functie zou daarentegen alleen de lokale naam naar een nieuwe lijst verwijzen; party zou nog steeds naar de oorspronkelijke lijst verwijzen. Vraag je bij het volgen van een lijstargument af of de regel het gedeelde object wijzigt of alleen opnieuw een waarde aan een lokale naam toekent.

Belangrijkste punten

  • Parameters en namen waaraan binnen een functie een waarde wordt toegekend, zijn lokaal voor haar aanroep.
  • Elke aanroep krijgt nieuwe lokale variabelen; retourwaarden brengen resultaten naar buiten.
  • Een lokale naam kan een globale verhullen zonder de globale waarde te wijzigen.
  • Een parameter opnieuw een waarde toekennen laat de variabele van de aanroepende code ongewijzigd.
  • Een gedeelde lijst wijzigen verandert de lijst die de aanroepende code ziet.

4.2 Gebruik globale variabelen zorgvuldig

Een functie kan een globale naam lezen zonder declaratie. Voor toekenning aan een naam in haar inhoud geldt een andere regel; deze bewerkingen verwarren is een veelvoorkomende oorzaak van UnboundLocalError.

Lees een vaste instelling
TAX_RATE = 0.25

def tax(amount):
    return amount * TAX_RATE

print(tax(80))

De uitvoer is “20.0”. amount is lokaal; TAX_RATE wordt gelezen uit de globale namen van het bestand. Hoofdletters duiden volgens afspraak een constante aan en geven aan dat het programma de instelling vast moet laten. Python dwingt die afspraak niet af.

Toekenning maakt een naam lokaal in de hele inhoud
total = 0

def add_to_total(amount):
    total = total + amount

add_to_total(5)

Door de toekenning is total in heel add_to_total lokaal. Om de rechterkant te berekenen, probeert Python die lokale naam te lezen voordat deze een waarde heeft. Het valt niet terug op de globale total. De aanroep werpt UnboundLocalError: cannot access local variable 'total' where it is not associated with a value op.

De beslissing is gebaseerd op de hele inhoud, niet alleen op regels die al zijn uitgevoerd. Een inhoud met print(count) gevolgd door count = 10 behandelt count ook op de printregel als lokaal. Een globale count kan de ontbrekende lokale waarde niet leveren.

Declareer een bewuste globale toekenning
total = 0

def add_to_total(amount):
    global total
    total = total + amount

add_to_total(5)
add_to_total(7)
print(total)

Nu verwijzen zowel het lezen als de toekenning naar de globale naam, dus is de uitvoer “12”. Zet global total vóór elk gebruik van total in de functie. De naam vóór de declaratie gebruiken is een syntaxisfout.

Een declaratie alleen maakt geen waarde aan. Een daaropvolgende toekenning kan een globale variabele aanmaken die nog niet bestond: een functie-inhoud met global level en daarna level = 1 maakt bij aanroep de globale level aan.

Toon de verandering via invoer en een resultaat

Je kunt hetzelfde lopende totaal schrijven met een expliciete interface:

def add_to_total(total, amount):
    return total + amount

total = 0
total = add_to_total(total, 5)
total = add_to_total(total, 7)
print(total)

Dit drukt ook “12” af. Elke aanroep laat zien dat de oude waarde wordt doorgegeven en de toekenning laat zien waar de nieuwe waarde naartoe gaat. Je kunt add_to_total(10, 3) afzonderlijk controleren zonder eerst een verborgen globale toestand in te stellen. Als meerdere functies dezelfde globale variabele wijzigen, hangt hun gedrag af van de volgorde waarin ze worden uitgevoerd.

Bewerking binnen een functieDeclaratie nodig?
Een globale instelling lezenNee.
Opnieuw een waarde aan een globale naam toekennenglobal name vóór gebruik.
Een element toevoegen aan een bestaande globale lijstNee; aan de naam wordt niet opnieuw een waarde toegekend.

Bij het lezen van een gedeelde lijst en het wijzigen van haar inhoud gebruik je de bestaande referentie. Als je die globale naam naar een andere lijst laat verwijzen, is dat een toekenning en geldt dus de toekenningsregel.

Belangrijkste punten

  • Lees een globale naam zonder speciale declaratie.
  • Een toekenning ergens in een functie maakt die naam lokaal, tenzij die als globaal is gedeclareerd.
  • Het lezen van een lokale naam zonder toegekende waarde werpt UnboundLocalError op.
  • Zet global name vóór het gebruik van een naam waaraan de functie bewust globaal een nieuwe waarde toekent.
  • Geef de voorkeur aan parameters en retourwaarden wanneer een veranderende waarde expliciet kan worden doorgegeven.
  • Voor het wijzigen van een lijst en het opnieuw toekennen van haar naam gelden verschillende regels.
5

Documenteer en ontwerp programma’s met functies

Goede functies hebben duidelijke taken nodig en correcte code. De aanroepende code moet kunnen zien wat een functie nodig heeft, wat ze teruggeeft en welk effect ze heeft, zonder elke regel van haar inhoud te bestuderen. Je schrijft docstrings, verdeelt een volledig programma over hulpfuncties en verbindt die via een kleine main-functie. Daarna controleer je één onderdeel tegelijk met verwachte resultaten, grenswaarden als invoer en de aanwijzingen in een stacktrace.

5.1 Documenteer functies met docstrings

Wie een functie aanroept, moet weten wat haar taak is zonder de volledige implementatie te lezen. Een docstring geeft die beschrijving. Python herkent een string als de docstring van de functie wanneer die de eerste instructie in de functie-inhoud is.

Schrijf eerst een korte beschrijving
def to_fahrenheit(celsius):
    """Convert a temperature from degrees Celsius to degrees Fahrenheit."""
    return celsius * 9 / 5 + 32

print(to_fahrenheit.__doc__)

De uitvoer is de zin tussen de aanhalingstekens. Python slaat de docstring op in __doc__; de driedubbele aanhalingstekens maken geen deel uit van de opgeslagen zin. help(to_fahrenheit) toont de beschrijving samen met de signatuur to_fahrenheit(celsius). Geef de functienaam door aan help, zonder de functie aan te roepen.

De gebruikelijke conventie is driedubbele dubbele aanhalingstekens, ook voor een docstring van één regel. Begin met een opdracht zoals “Geef de oppervlakte van een rechthoek terug.” en eindig met een punt. Houd een korte beschrijving en de afsluitende aanhalingstekens op één regel. Je hoeft de functienaam en de parameterlijst niet te herhalen, omdat de helpweergave die al bevat.

Voeg details toe als de aanroepende code die nodig heeft
def split_bill(total, people, tip_rate=0.2):
    """Return each person's share of a bill, including the tip.

    total: the bill before the tip
    people: the number of people sharing the bill
    tip_rate: the tip as a fraction of the bill (default 0.2)
    """
    return total * (1 + tip_rate) / people

De eerste regel vermeldt het resultaat. Een lege regel scheidt die van details over de invoer. De standaardwaarde is gedocumenteerd als 0,2, een deel van de rekening; dit voorkomt dat iemand die de functie aanroept 20 als de bedoelde waarde voor een fooi van 20 procent ziet. De afsluitende aanhalingstekens van een docstring van meerdere regels staan op een eigen regel.

Bij split_bill(84, 4) past de functie de standaardfooi toe en geeft ze 25,2 terug. Wie de functie aanroept, kan zien wat de drie invoerwaarden betekenen voordat die argumenten kiest. Vermeld eenheden wanneer ze van belang zijn en beschrijf effecten zoals afdrukken, zodat zowel het resultaat als het zichtbare gedrag kan worden voorspeld.

Houd documentatie en commentaar uit elkaar
VormHoofddoel
Eerste string in de inhoudBeschrijft de functie voor wie haar aanroept en verschijnt in help.
#-commentaar in de inhoudLegt een codedetail uit aan iemand die de implementatie leest.

Een string na een toekenning of een andere instructie in de inhoud is niet de docstring van de functie. Het is een ongebruikte stringexpressie en __doc__ is None als er geen docstring als eerste instructie staat. Ook #-commentaar wordt niet de beschrijving in de helpweergave.

Schrijf de samenvatting terwijl je de taak van de functie bepaalt. Als de zin meerdere, niet-samenhangende acties nodig heeft, overweeg dan of de functie moet worden opgesplitst. Werk de docstring tegelijk bij wanneer je parameters, standaardwaarden, retourwaarden of afgedrukte uitvoer wijzigt; wie de functie aanroept, vertrouwt erop als onderdeel van de interface.

Belangrijkste punten

  • Een functiedocstring is de eerste instructie in de functie-inhoud.
  • Gebruik driedubbele dubbele aanhalingstekens en een korte opdrachtzin die eindigt met een punt.
  • Scheid bij langere beschrijvingen de samenvatting met een lege regel van de details.
  • Beschrijf relevante invoer, eenheden, standaardwaarden, resultaten en effecten.
  • Lees opgeslagen documentatie met help(name) of name.__doc__.

5.2 Verdeel een probleem over functies

Decompositie betekent dat je een taak opdeelt in kleinere taken. Elke functie is verantwoordelijk voor één taak, met duidelijke invoer en een duidelijk resultaat of effect. Het hoofdprogramma kan dan lezen als een korte reeks benoemde stappen.

Plan de gegevens voordat je de functie-inhoud schrijft

Onderscheid voor een programma dat een gemiddelde toetsscore en een lettercijfer rapporteert drie soorten werk: scores lezen, een gemiddelde berekenen en een lettercijfer kiezen. Bepaal wat elke hulpfunctie ontvangt en teruggeeft. Houd de weergave in main, waar de resultaten samenkomen.

def get_score(prompt):
    return float(input(prompt))

def average(a, b, c):
    return (a + b + c) / 3

def letter_grade(score):
    if score >= 90:
        return "A"
    if score >= 80:
        return "B"
    if score >= 70:
        return "C"
    return "F"

def main():
    first = get_score("Test 1: ")
    second = get_score("Test 2: ")
    third = get_score("Test 3: ")
    avg = average(first, second, third)
    print("Average:", round(avg, 1), "Grade:", letter_grade(avg))

main()

Bij de scores 78, 92 en 85 geeft average 85,0 terug. Dat resultaat wordt het argument voor letter_grade, die “B” teruggeeft. De weergave is “Average: 85.0 Grade: B”.

main coördineert de volgorde; deze functie hoeft niet te weten hoe letter_grade haar antwoord kiest. Een functie gebruiken via haar taak en interface, zonder elke instructie in de inhoud te volgen, is procedurele abstractie. Je gebruikt print al op deze manier.

Geef de aanroepende code een duidelijke interface

De interface van een functie bestaat uit haar naam, parameters, retourwaarde en gedocumenteerde gedrag. average(a, b, c) vereist drie getallen en geeft hun gemiddelde terug. De aanroepende code hoeft geen invoervraag te lezen of afgedrukte tekst op te vangen om dat getal te krijgen. Je kunt de berekening herschrijven met behoud van de afgesproken invoer en uitvoer, en bestaande aanroepen blijven werken.

Gebruik namen zoals calculate_total en print_receipt voor acties, en is_even of has_discount voor booleaanse vragen. Parameternamen zoals price en quantity leggen uit welke waarden op elke plaats horen. Namen van één letter kunnen geschikt zijn wanneer hun betekenis duidelijk is, zoals bij de drie invoerwaarden voor average.

Maak parameters van herhaalde onderdelen

Als verschillende delen van een programma verschillende titels tussen dezelfde regels met gelijktekens afdrukken, maak dan van de titel een parameter voor print_heading(title). De herhaalde structuur hoort in één functie-inhoud, terwijl de wisselende tekst in de aanroepen hoort. Een latere wijziging van de regellengte vraagt dan maar één aanpassing.

Kies functiegrenzen die taken gemakkelijker te begrijpen of opnieuw te gebruiken maken. Als je elke instructie in één lange main zet, verhul je de kleinere taken. Als je elke eenvoudige expressie opsplitst in een hulpfunctie die één keer wordt gebruikt, kun je namen toevoegen zonder de leesbaarheid te verbeteren. Een nuttige test is of een korte zin elke taak en haar invoer en uitvoer kan beschrijven.

Eindig het bestand na alle definities met de daadwerkelijke aanroep main(). Een programma dat alleen definities bevat, maakt zijn functies aan en eindigt zonder hun inhoud uit te voeren.

Belangrijkste punten

  • Verdeel de taak in deeltaken met benoemde invoer en uitvoer.
  • Houd berekeningen gescheiden van invoer en afdrukken wanneer ze opnieuw moeten worden gebruikt of gecontroleerd.
  • Laat main de hulpfuncties coördineren en roep main() aan na de definities.
  • Gebruik parameters voor de onderdelen die variëren in herhaalde code.
  • Een stabiele interface laat aanroepende code een functie gebruiken zonder afhankelijk te zijn van haar inhoud.
  • Kies functiegrenzen die het programma gemakkelijker te begrijpen maken.

5.3 Bouw en controleer een programma functie voor functie

Als je meerdere functies bouwt voordat je er één uitvoert, is een fout moeilijker te lokaliseren. Incrementele ontwikkeling betekent dat je een klein onderdeel schrijft, het controleert en daarna het volgende onderdeel toevoegt. Je houdt een werkend programma en beperkt tegelijk de hoeveelheid nieuwe code die je moet onderzoeken.

Gebruik tijdens het plannen een functieskelet

Een functieskelet heeft de bedoelde kop en een tijdelijke inhoud. Een docstring en pass houden de definitie geldig, maar de functie geeft None terug totdat je haar implementeert. Een vaste retourwaarde kan helpen om de weergave van de aanroepende code te testen, zonder te stellen dat de echte berekening al werkt.

Begin met een rekenende hulpfunctie waarvan je het resultaat onafhankelijk kunt uitrekenen. Zodra die zich correct gedraagt, verbind je haar met de volgende hulpfunctie. Bewaar interactieve invoer voor later, wanneer de berekeningen met rechtstreekse aanroepen kunnen worden gecontroleerd.

Bepaal verwachte resultaten vóór de uitvoering

Met de functies average en letter_grade hebben de scores 70, 75 en 72 een gemiddelde van ongeveer 72,33, dus is hun verwachte lettercijfer “C”. Controleer beide stappen:

print(average(70, 75, 72))
print(letter_grade(average(70, 75, 72)) == "C")

De uitvoer is “72.33333333333333” en “True”. De vergelijking test het verwachte lettercijfer rechtstreeks; als je alleen naar de eigen uitvoer van een programma kijkt zonder een onafhankelijke verwachting, kan een aannemelijk verkeerd antwoord onopgemerkt blijven.

Test grenzen en gewone invoer

Test voor een drempelwaarde van 90 de waarden 90 en 89,9. De juiste functie voor lettercijfers geeft “A” en “B” terug. Als de eerste voorwaarde score > 90 was, zou alleen de controle precies op de grens laten zien dat 90 ten onrechte doorgaat naar de volgende test.

Neem een typische waarde, exacte grenzen, nabijgelegen waarden en extreme invoer op die de functie moet kunnen verwerken. Bij de functie voor lettercijfers testen 70 en 0 de laagste grens voor een voldoende en het laatste pad naar “F”. Een controle zoals print(letter_grade(85) == "B") is eenvoudig omdat de functie een waarde aanneemt en haar resultaat teruggeeft.

Lees de stacktrace en onderzoek de binnenkomende waarde

Stel dat main de functie letter_grade(input("Score: ")) aanroept. Als je “85” invoert, komt een string terecht in een vergelijking met een getal. De laatste fout is TypeError: '>=' not supported between instances of 'str' and 'int'. De stacktrace wijst naar de vergelijking binnen de hulpfunctie, terwijl een eerdere aanroepregel naar main wijst.

De fout treedt op bij de vergelijking, maar de oplossing hoort op de plaats waar de invoer wordt voorbereid: zet die om met float() voordat je haar doorgeeft. Een tijdelijke eerste regel print("letter_grade got", score) helpt onverwachte invoer zichtbaar te maken. Als het type onduidelijk is, onderzoek dan de aanroepende code en de conversie die daarin wordt gebruikt. Verwijder diagnostische uitvoerinstructies nadat de programmeerfout is hersteld.

Koppel verschijnselen aan waarschijnlijke oorzaken
VerschijnselControleer
Een resultaat is NoneEen ontbrekende return of een niet-afgedekt pad.
Er verschijnt geen effectEen ontbrekende aanroep of een ongebruikt teruggegeven resultaat.
Een aannemelijk resultaat heeft de verkeerde betekenisVerwisselde argumenten.
NameErrorEen verkeerd gespelde of niet-beschikbare functie- of variabelenaam.

Voer na het herstellen van een hulpfunctie opnieuw de controles uit die de betrokken paden testen, evenals de aanroepende code die haar met het programma verbindt.

Belangrijkste punten

  • Bouw en controleer één functie voordat je de volgende toevoegt.
  • Bereken verwachte resultaten onafhankelijk voordat je ze met aanroepen vergelijkt.
  • Test exacte grenzen en nabijgelegen waarden om fouten in vergelijkingen te vinden.
  • Gebruik de stacktrace om de fout en de aanroepende code te vinden.
  • Verwijder tijdelijke diagnostische uitvoerinstructies zodra het probleem is opgelost.

Functies in Python: voorbeelden

5 Walkthroughs

1

Schrijf een functie en volg haar aanroepen

10 stappen
Bouw een herbruikbare begroeting en volg daarna een aanroepende functie door haar hulpfunctie heen en terug naar het hoofdprogramma.
  1. 1
    IntroductieGeef een taak een naam

    Met een functie kun je een nuttige taak één keer schrijven en kiezen wanneer je die uitvoert. Je begint met een begroeting en volgt daarna een rapport dat een hulpfunctie aanroept.

    Houd tijdens het lezen twee vragen uit elkaar: “Heeft Python deze functie aangemaakt?” en “Heeft het programma haar al aangeroepen?” Het eerste maakt de naam beschikbaar; het tweede start het werk van de functie-inhoud. Dit onderscheid verklaart waarom een bestand vol definities zonder uitvoer kan eindigen.

  2. 2
    UitlegSchrijf de herbruikbare inhoud
    def greet():
        print("Hello!")
        print("Welcome to Python.")
    

    De kop gebruikt def, een naam, ronde haakjes en een dubbele punt. De twee regels die vier spaties inspringen, vormen de inhoud. Python maakt de functie aan wanneer deze definitie wordt uitgevoerd, maar geen van beide print-instructies wordt al uitgevoerd.

    De volgende niet-ingesprongen instructie staat buiten de functie. Inspringing vertelt Python waar deze taak eindigt; ze maakt deel uit van de structuur van het programma.

  3. 3
    VoorbeeldVoer de functie twee keer uit

    Voeg deze regels na de definitie toe:

    greet()
    greet()
    

    De eerste aanroep gaat de inhoud binnen en drukt “Hello!” af, gevolgd door “Welcome to Python.” De tweede aanroep begint opnieuw bij de eerste regel van de inhoud en drukt beide berichten opnieuw af. Er zijn vier uitvoerregels.

    De lege ronde haakjes zijn nog steeds van belang: greet alleen verwijst naar het functieobject. Het roept de functie niet aan en print(greet) toont een functiebeschrijving in plaats van de begroeting.

  4. 4
    UitdagingVoorspel het effect van een ontbrekende aanroep

    Wat toont dit bestand?

    def ready():
        print("Ready")
    
    ready
    print("Waiting")
    

    ---reveal---

    Het toont alleen “Waiting”. De definitie maakt ready aan en de naam op zichzelf verwijst naar die functie zonder haar uit te voeren. Om ook het bericht te tonen, verander je ready in ready(). De aanroep zou dan vóór de laatste print-instructie worden uitgevoerd en “Ready” en “Waiting” op afzonderlijke regels geven.

  5. 5
    TipHoud namen en functie-inhoud bruikbaar

    Gebruik namen zoals print_receipt: woorden in kleine letters, verbonden door onderstrepingstekens, die de taak beschrijven. Vervang geen ingebouwde naam. Als je tekst aan input toekent, verhul je de functie, zodat een latere input(...) tekst probeert aan te roepen en mislukt.

    Een onvoltooide functie-inhoud heeft een instructie nodig. Gebruik een ingesprongen pass als tijdelijke invulling. Alleen commentaar vormt geen functie-inhoud en een niet-ingesprongen pass zou buiten de functie staan.

  6. 6
    VoorbeeldGa een aanroepende functie binnen
    def line():
        print("----------")
    
    def banner():
        line()
        print("  REPORT")
        line()
    
    print("Start")
    banner()
    print("End")
    

    Eerst worden beide definities uitgevoerd zonder iets af te drukken. De instructie op moduleniveau drukt “Start” af, daarna gaat banner() de inhoud van banner binnen. De eerste regel daarvan roept line aan, dus moet banner wachten terwijl die hulpfunctie haar streepjes afdrukt. Ga niet verder naar de titel voordat de hulpfunctie klaar is.

  7. 7
    UitlegGa één niveau tegelijk verder

    Wanneer line eindigt, gaat de uitvoering verder bij de print-instructie voor de titel binnen banner. Banner roept line daarna een tweede keer aan, wat de tweede streepjeslijn oplevert. Wanneer banner eindigt, gaat het hoofdprogramma verder en drukt “End” af.

    Pythons aanroepstapel houdt de niet-voltooide aanroepen en hun terugkeerpunten bij. Terwijl de hulpfunctie wordt uitgevoerd, wachten banner en het hoofdprogramma. Bij het volgen op papier kun je deze terugkeerpunten markeren en uitvoer noteren zodra elke print-instructie daadwerkelijk wordt uitgevoerd.

  8. 8
    UitdagingVolg nog een aanroep van een hulpfunctie

    Wat is de uitvoervolgorde?

    def inner():
        print("I")
    
    def outer():
        print("O")
        inner()
        print("P")
    
    outer()
    print("Q")
    

    ---reveal---

    De regels zijn “O”, “I”, “P” en “Q”. De buitenste functie-inhoud drukt eerst af, pauzeert voor inner en gaat daarna verder bij de volgende print-instructie. Pas nadat outer eindigt, wordt de laatste instructie op moduleniveau uitgevoerd. De volgorde van definities bepaalt op zichzelf de uitvoervolgorde niet.

  9. 9
    UitdagingVerplaats een definitie veilig

    Een bestand definieert show met een inhoud die border aanroept. Daarna definieert het border en het eindigt met een lus die show() twee keer aanroept. Veroorzaakt de lager geplaatste definitie van de hulpfunctie een fout en hoe vaak wordt border uitgevoerd?

    ---reveal---

    Het programma werkt: beide definities zijn uitgevoerd voordat de lus show aanroept. Elke aanroep gaat show binnen bij de eerste regel van de inhoud en bereikt één aanroep van border, dus wordt de hulpfunctie twee keer uitgevoerd. Als je de lus boven de definitie van de hulpfunctie zet, is haar naam niet beschikbaar wanneer die voor het eerst nodig is.

  10. 10
    SamenvattingLees vanaf de eerste uit te voeren instructie

    Wanneer je een programma met functies volgt:

    • Controleer de kop en inspringing om elke functie-inhoud te vinden.
    • Begin bij instructies op moduleniveau en ga een functie-inhoud alleen via een aanroep binnen.
    • Markeer de volgende instructie van de aanroepende code voordat je een hulpfunctie volgt.
    • Noteer uitvoer wanneer de bijbehorende print-instructie wordt uitgevoerd.

    Als een aanroep mislukt, lees dan de laatste fout in de stacktrace en onderzoek daarna de regel met de fout en de aanroepende code die daartoe leidde. Het aanroeppad is vaak de sleutel tot het begrijpen van de fout.

2

Vul de parameterplaatsen in

13 stappen
Koppel waarden op positie of op naam en onderzoek daarna standaardwaarden die bij de definitie worden aangemaakt.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieGebruik een taak opnieuw met verschillende waarden
  2. 2
    VoorbeeldKoppel de eerste en tweede invoerwaarde
  3. 3
    UitlegEvalueer argumenten vóór de functie-inhoud
  4. 4
    UitdagingControleer het aantal argumenten
  5. 5
    UitlegGebruik namen om de rollen te tonen
  6. 6
    UitdagingHerstel een dubbel ingevulde plaats
  7. 7
    TipLees benoemde opties van ingebouwde functies
  8. 8
    VoorbeeldMaak de gebruikelijke keuze optioneel
  9. 9
    UitdagingSla een optionele keuze over met een naam
  10. 10
    KernpuntEen standaardwaarde onthoudt het moment waarop ze is aangemaakt
  11. 11
    VoorbeeldZie waarom een lijst als standaardwaarde elementen behoudt
  12. 12
    UitdagingCombineer standaardwaarden met benoemde invoer
  13. 13
    SamenvattingVergelijk de kop met de aanroep
3

Volg waarden terug naar de aanroepende code

14 stappen
Maak onderscheid tussen uitvoer en resultaten en bouw daarna takken, zoekacties en geneste aanroepen die de benodigde waarden teruggeven.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieKijk wat de aanroepende code ontvangt
  2. 2
    VoorbeeldVervang de aanroep door haar resultaat
  3. 3
    UitlegMaak onderscheid tussen het scherm en het resultaat
  4. 4
    UitdagingZoek de waarde die in de optelling wordt gebruikt
  5. 5
    TipControleer waar de aanroep wordt uitgevoerd
  6. 6
    VoorbeeldStop bij het eerste passende lettercijfer
  7. 7
    UitdagingDek de invoer tussen de takken af
  8. 8
    KernpuntLaat een vergelijking de vraag beantwoorden
  9. 9
    VoorbeeldGeef een gevonden deler terug
  10. 10
    UitdagingHerstel een te vroeg succesresultaat
  11. 11
    VoorbeeldPak een gegroepeerd resultaat uit
  12. 12
    VoorbeeldGeef een binnenste resultaat naar buiten door
  13. 13
    UitdagingCombineer een vroeg pad met een resultaat
  14. 14
    SamenvattingVolg paden en retourwaarden samen
4

Volg namen en gedeelde objecten

11 stappen
Maak onderscheid tussen lokale en globale namen en maak daarna een veranderend totaal expliciet in de aanroepende code.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVraag waar de naam thuishoort
  2. 2
    VoorbeeldGeef elke aanroep een eigen teller
  3. 3
    UitlegHoud verhulde namen uit elkaar
  4. 4
    UitdagingMaak de wijziging in de aanroepende code expliciet
  5. 5
    VoorbeeldVolg een gedeelde lijst via een parameter
  6. 6
    VoorbeeldLees een globale variabele zonder declaratie
  7. 7
    KernpuntToekenning bepaalt vroeg het lokale bereik
  8. 8
    UitdagingKies het bereik van een wijziging
  9. 9
    VerbandGeef de veranderende waarde door via de aanroep
  10. 10
    UitdagingMaak onderscheid tussen mutatie en hernieuwde toekenning
  11. 11
    SamenvattingBenoem de bewerking voordat je het effect voorspelt
5

Ontwerp en controleer een scorerapport

12 stappen
Documenteer een hulpfunctie, plan haar invoer en resultaten en controleer daarna grenzen en gegevens uit de aanroepende code voordat je het programma verbindt.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieBouw een programma uit duidelijke taken
  2. 2
    VoorbeeldZet de beschrijving waar help haar kan vinden
  3. 3
    UitlegVoeg details toe die een aanroep beïnvloeden
  4. 4
    UitdagingZoek de ontbrekende documentatie
  5. 5
    UitlegKies een taak voor elke hulpfunctie
  6. 6
    VoorbeeldVerbind de hulpfuncties in main
  7. 7
    UitdagingHoud berekening en weergave uit elkaar
  8. 8
    TipHoud tijdens het bouwen een werkend programma
  9. 9
    VoorbeeldControleer een grens die een programmeerfout kan blootleggen
  10. 10
    UitdagingZoek waar een verkeerd type binnenkomt
  11. 11
    UitdagingLaat documentatie en een controle overeenkomen
  12. 12
    SamenvattingLaat de interface de controles sturen

Functies in Python: oefenvragen

40 Oefenvragen in 4 sets

Set 1: Volg invoer, geldigheidsbereik en ontbrekende resultaten10 Oefenvragen

Vraag 1 van 10

Hoe moet deze onvoltooide functie-inhoud worden aangevuld zodat het bestand geldig is, maar de functie nog niets doet?

def print_ticket():
    # Work to be added later
  1. Voeg onder het commentaar een niet-ingesprongen pass toe.
  2. Voeg eronder nog een ingesprongen commentaarregel toe.
  3. Voeg onder het commentaar een ingesprongen pass toe.
  4. Voeg eronder een niet-ingesprongen print_ticket() toe.
Toon antwoordVerberg antwoord
Antwoord: C
Een ingesprongen pass is een geldige instructie in de functie-inhoud die niets doet. Commentaar alleen telt niet als de vereiste inhoud, dus nog een commentaarregel toevoegen laat de definitie onvolledig. Een niet-ingesprongen instructie hoort buiten de functie en kan haar ontbrekende inhoud niet leveren.

Vraag 2 van 10

Wat drukt dit programma af?

def show_scaled(value, factor):
    print(value * factor)

entry = "6"
show_scaled(entry, 3)
  1. “666”
  2. “18”
  3. “6 6 6”
  4. “9”
Toon antwoordVerberg antwoord
Antwoord: A
Het argument entry bevat tekst en Python herhaalt die tekst wanneer die wordt vermenigvuldigd met het gehele getal 3. De uitvoer is “666”, zonder toegevoegde spaties. Om 18 te krijgen, moet je de tekst vóór de vermenigvuldiging omzetten naar een getal; de parameternaam voert die conversie niet uit.

Vraag 3 van 10

Welke waarde wordt teruggegeven?

step = 4

def advance(position, amount=step):
    return position + amount

step = 9
result = advance(10)
  1. 19
  2. 9
  3. 10
  4. 14
Toon antwoordVerberg antwoord
Antwoord: D
De standaardexpressie wordt geëvalueerd wanneer def wordt uitgevoerd, terwijl step gelijk is aan 4. Als je amount weglaat, wordt daarom 4 bij 10 opgeteld en 14 teruggegeven. Als je step later in 9 verandert, wijzigt de opgeslagen standaardwaarde niet; voor 19 moet je de nieuwe waarde expliciet doorgeven.

Vraag 4 van 10

Welke ene wijziging zorgt ervoor dat result 16 bevat zonder die waarde binnen de hulpfunctie te tonen?

def square(n):
    print(n * n)

result = square(4)
  1. Vervang de inhoud door return print(n * n).
  2. Vervang de inhoud door return n * n.
  3. Voeg return toe na de bestaande print-instructie.
  4. Vervang de aanroep door result = print(square(4)).
Toon antwoordVerberg antwoord
Antwoord: B
Door n * n terug te geven, gaat 16 rechtstreeks naar de toekenning zonder binnen de hulpfunctie te worden afgedrukt. return print(n * n) drukt nog steeds af en geeft het resultaat van print terug, namelijk None. Een kale return na een print-instructie geeft ook None en levert dus niet het berekende getal.

Vraag 5 van 10

Wat wordt afgedrukt?

def pack(total, size):
    return total // size, total % size

def double(n):
    return n * 2

boxes, spare = pack(29, 6)
print(double(boxes) + spare)
  1. “12”
  2. “9”
  3. “14”
  4. “13”
Toon antwoordVerberg antwoord
Antwoord: D
Als je 29 in groepen van 6 verdeelt, geeft de functie de tuple (4, 5) terug, zodat boxes 4 wordt en spare 5. Het aantal dozen verdubbelen geeft 8 en daarna 5 optellen drukt “13” af. Om 14 te krijgen, verwissel je de twee uitgepakte waarden vóór het verdubbelen; dat volgt de retourvolgorde niet.

Vraag 6 van 10

Wat wordt na beide aanroepen afgedrukt?

def add_guest(guests):
    guests.append("Sol")

def replace_guests(guests):
    guests = ["Tao"]

party = ["Ren"]
add_guest(party)
replace_guests(party)
print(party)
  1. ['Tao']
  2. ['Ren']
  3. ['Ren', 'Sol']
  4. ['Ren', 'Sol', 'Tao']
Toon antwoordVerberg antwoord
Antwoord: C
add_guest voegt “Sol” toe aan dezelfde lijst waarnaar party verwijst. replace_guests kent alleen een nieuwe lijst toe aan haar lokale parameter, zodat party nog steeds naar ['Ren', 'Sol'] verwijst. Wie ['Tao'] verwacht, verwart het laten verwijzen van de lokale naam naar een andere lijst met het vervangen van de referentie in de aanroepende code.

Vraag 7 van 10

Wat gebeurt er wanneer inspect() wordt aangeroepen?

count = 11

def inspect():
    print(count)
    count = 2

inspect()
  1. De functie werpt UnboundLocalError op voordat ze een waarde afdrukt.
  2. De functie drukt “11” af en wijzigt daarna de globale count in 2.
  3. De functie drukt “11” af en maakt daarna de lokale count met waarde 2 aan.
  4. De functie drukt “2” af omdat de lokale toekenning eerst wordt uitgevoerd.
Toon antwoordVerberg antwoord
Antwoord: A
De toekenning aan count maakt die naam lokaal voor de hele inhoud, inclusief de eerdere print-instructie. Die lokale variabele heeft nog geen waarde wanneer de print-instructie haar probeert te lezen, dus werpt de aanroep UnboundLocalError op. Python gebruikt niet eerst de globale 11 om pas na het bereiken van de toekenning naar het lokale bereik over te schakelen.

Vraag 8 van 10

Wat bevat show.__doc__?

def show():
    value = 2
    """Display the current value."""
    print(value)
  1. De zin “Display the current value.”
  2. None
  3. Het getal 2
  4. De broncoderegel print(value)
Toon antwoordVerberg antwoord
Antwoord: B
De string volgt op een toekenning, dus is niet de eerste instructie en wordt niet de docstring van de functie. Zonder herkende docstring is show.__doc__ gelijk aan None. Driedubbele aanhalingstekens alleen zijn niet voldoende; verplaats de beschrijving boven de toekenning om haar als documentatie op te slaan.

Vraag 9 van 10

Drie delen van een programma drukken een titel af tussen identieke scheidingslijnen. Welke wijziging verwijdert de herhaalde logica en behoudt verschillende titels?
  1. Maak voor elke titel een afzonderlijke functie zonder parameters.
  2. Sla elke titel op in een globale variabele die één functie leest.
  3. Zet alle drie de blokken ongewijzigd binnen main.
  4. Schrijf print_heading(title) en geef elke titel door.
Toon antwoordVerberg antwoord
Antwoord: D
Eén functie kan de gedeelde structuur van scheidingslijnen en titel bevatten, terwijl een parameter elke verschillende titel levert. Een latere wijziging van de scheidingslijn vraagt dan één aanpassing in de inhoud. De drie ongewijzigde blokken naar main verplaatsen verplaatst alleen de herhaling en vereist nog steeds meerdere aanpassingen om dat gedeelde gedrag te wijzigen.

Vraag 10 van 10

Een categorie moet “volledig” zijn bij 50 of hoger en “gedeeltelijk” onder 50. Welk paar testwaarden legt een onbedoelde test > 50 het beste bloot?
  1. 50 en 49
  2. 51 en 52
  3. 25 en 30
  4. 49 en 48
Toon antwoordVerberg antwoord
Antwoord: A
De invoerwaarde 50 moet het pad “volledig” nemen, terwijl 49 het pad “gedeeltelijk” moet nemen. Door die te testen controleer je de exacte grens en de naastgelegen lagere waarde, waardoor een strikte vergelijking die 50 afwijst aan het licht komt. De invoerwaarden 51 en 52 voldoen allebei aan beide vergelijkingen en missen de grensfout dus.
Set 2: Lees aanroepen en volg hun resultaten10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke uitvoer produceert dit programma?

def announce():
    print("Open")

print("Ready")
  1. “Open” en daarna “Ready”.
  2. Alleen “Ready” op één regel.
  3. “Ready”, daarna “Open” eronder.
  4. Er wordt helemaal geen uitvoer getoond.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Wat is de uitvoervolgorde?

def mark():
    print("M")

def stage():
    print("S")
    mark()
    print("T")

print("R")
stage()
  1. “M”, “S”, “T”, “R”
  2. “R”, “M”, “S”, “T”
  3. “R”, “S”, “T”, “M”
  4. “R”, “S”, “M”, “T”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Wat drukt deze aanroep af?

def describe_trip(origin, destination):
    print(origin, "to", destination)

describe_trip("Mesa", "Salem")
  1. “Mesa to Salem”
  2. “Salem to Mesa”
  3. “origin to destination”
  4. “Mesa Salem to”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Hoe kun je deze functie aanroepen met “Inez” voor de persoon en “West” voor de kamer?

def show_booking(person, room):
    print(person, room)
  1. show_booking(person="Inez", "West")
  2. show_booking("Inez", person="West")
  3. show_booking(room="West", person="Inez")
  4. show_booking(name="Inez", room="West")
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Wat wordt weergegeven?

def label(text, copies=2):
    print(text * copies)

label("Go")
  1. “Go”
  2. “GoGo”
  3. “Go2”
  4. “Go Go”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Wat drukt de laatste regel af?

def triple(value):
    print(value * 3)

answer = triple(4)
print(answer)
  1. “None”
  2. “12”
  3. “4”
  4. Niets; de laatste regel wordt overgeslagen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Wat geeft deze functie terug voor first_factor(25)?

def first_factor(n):
    for candidate in range(2, n):
        if n % candidate == 0:
            return candidate
        return n
  1. 5 na controle van de kandidaten 2 tot en met 5.
  2. None omdat de eerste kandidaat niet voldoet.
  3. 25 na controle van alle kandidaten.
  4. 25 na controle van alleen kandidaat 2.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Wat zijn de twee uitvoerregels?

level = 7

def show_level():
    level = 3
    print(level)

show_level()
print(level)
  1. “3”, daarna “3”
  2. “7”, daarna “3”
  3. “3”, daarna “7”
  4. “7”, daarna “7”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Wat is de rol van de eerste string in deze functie?

def square(n):
    """Return the square of n."""
    return n * n
  1. Een opgeslagen beschrijving die help(square) toont.
  2. De tekst die elke aanroep van square teruggeeft.
  3. Een bericht dat vóór de vermenigvuldiging wordt afgedrukt.
  4. Een standaardwaarde voor wanneer n wordt weggelaten.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een programma leest een afstand, zet die om en toont een bericht. Met welke interface kun je de omzetting controleren zonder invoer te typen?
  1. Een omzetfunctie zonder parameters die de afstand leest.
  2. Een omzetfunctie die de afstand aanneemt en de omgerekende waarde teruggeeft.
  3. Een omzetfunctie die de afstand aanneemt en de omgerekende waarde afdrukt.
  4. Een omzetfunctie zonder parameters die een globale afstand wijzigt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Onderzoek aanroepen en herstel het programmagedrag10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Waarom werkt dit programma ook al is tick onder report gedefinieerd?

def report():
    tick()

def tick():
    print("Done")

report()
  1. Python voert elke functie-inhoud één keer uit vóór alle aanroepen.
  2. De definitie van report verplaatst tick boven zichzelf.
  3. De inhoud van report wordt naar de definitie van tick gekopieerd.
  4. Beide definities worden uitgevoerd voordat report() de functie tick aanroept.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Welke argumentwaarde bereikt width?

def show_width(width):
    print(width)

base = 8
show_width(base + 3)
  1. 8
  2. 11
  3. De tekst “base + 3”
  4. Geen waarde omdat de namen verschillen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Waarom mislukt deze aanroep?

def mark_pages(first, last):
    print(first, last)

mark_pages(4, first=9)
  1. Het benoemde argument volgt op een positioneel argument.
  2. Twee gehele getallen kunnen niet samen als argumenten worden gebruikt.
  3. first krijgt twee waarden en last krijgt er geen.
  4. Namen van benoemde argumenten moeten overeenkomen met variabelenamen in de aanroepende code.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Wat zijn de twee afgedrukte lijsten?

def collect(value, bucket=[]):
    bucket.append(value)
    return bucket

print(collect("red"))
print(collect("blue", []))
  1. ['red'], daarna ['blue']
  2. ['red'], daarna ['red', 'blue']
  3. ['red', 'blue'], daarna ['blue']
  4. ['blue'], daarna ['red', 'blue']
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Wat is de volledige uitvoer?

def shift(n):
    return n + 2
    print("shifted")

shift(5)
print("done")
  1. “shifted”, daarna “done”
  2. “7”, daarna “done”
  3. Alleen “done”
  4. Alleen “shifted”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een functie moet precies dan True teruggeven als een geheel getal een priemgetal is. Waarom aanvaardt deze inhoud 35 ten onrechte?

def is_prime(n):
    if n < 2:
        return False
    for d in range(2, n):
        if n % d == 0:
            return False
        else:
            return True
  1. De functie probeert alle kandidaten maar slaat 5 over.
  2. De functie geeft False terug bij kandidaat 5.
  3. De functie behandelt elk oneven getal onder 2 als priemgetal.
  4. De functie geeft bij kandidaat 2 True terug voordat ze 5 probeert.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Wat wordt afgedrukt?

total = 2

def add(amount):
    global total
    total = total + amount
    return total

first = add(4)
second = add(first)
print(total, second)
  1. “6 12”
  2. “12 12”
  3. “8 8”
  4. “6 6”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een functie verandert haar standaardduur van 15 minuten naar 20 minuten, met dezelfde berekening en eenheden. Welke wijziging in de documentatie is nodig?
  1. Werk de gedocumenteerde standaardwaarde van de optionele parameter bij naar 20 minuten.
  2. Wijzig de functienaam in de docstring zodat die 20 minuten noemt.
  3. Verplaats de docstring na de berekening om het nieuwe resultaat te documenteren.
  4. Verwijder de parameterbeschrijving omdat de kop de naam toont.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een numerieke hulpfunctie behoudt na vereenvoudiging van haar inhoud dezelfde naam, parameters, retourwaarden en gedocumenteerde effecten. Waarom kunnen bestaande aanroepen ongewijzigd blijven?
  1. De aanroepende code ontvangt alle lokale variabelen uit de nieuwe inhoud.
  2. Python bewaart de oude inhoud totdat alle aanroepen zijn herschreven.
  3. De aanroepende code vertrouwt op een interface waarvan het gedrag behouden blijft.
  4. Een docstring laat Python elke aanroep automatisch herstellen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een numerieke hulpfunctie faalt bij if score >= 60: nadat de aanroepende code input("Score: ") heeft doorgegeven. Welke oplossing pakt het type van de invoer aan?
  1. Verander de vergelijking in score >= "60".
  2. Zet de invoer om met float() voordat je de hulpfunctie aanroept.
  3. Voeg na de vergelijking een print-instructie toe om score te tonen.
  4. Verwijder de parameter en lees in plaats daarvan een globale score.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Combineer functieregels in nieuwe situaties10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke naam moet een functie die een betalingsbewijs toont volgens de gebruikelijke Pythonstijl krijgen?
  1. print_receipt
  2. print-receipt
  3. 2print_receipt
  4. print receipt
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Wat wordt afgedrukt?

def outer():
    inner()
    print("Y")

outer()

def inner():
    print("X")
  1. “X”, daarna “Y”
  2. Alleen “Y”, gevolgd door een NameError
  3. Geen uitvoer; binnen outer ontstaat een NameError.
  4. Alleen “X”, gevolgd door een NameError
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Wat is de volledige uitvoer, inclusief regelafbrekingen?

print("N", "S", sep="/", end="|")
print("E", "W", sep="-")
  1. Twee regels: “N/S|” en daarna “E-W”
  2. Eén regel: “N/S|E-W”
  3. Eén regel: “N S|E W”
  4. Twee regels: “N/S” en daarna “|E-W”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een nieuwe aanroep die items weglaat, moet met een nieuwe lijst beginnen, maar een doorgegeven lijst moet ter plaatse worden uitgebreid. Welke vervangende inhoud is correct?

def add_code(code, items=None):
    # replacement body
  1.     items = []
        items.append(code)
        return items
    
  2.     if items == []:
            items = []
        items.append(code)
        return items
    
  3.     if items is None:
            return []
        items.append(code)
        return items
    
  4.     if items is None:
            items = []
        items.append(code)
        return items
    
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Welke wijziging laat deze functie de eerste passende kandidaat teruggeven, of pas None nadat alle kandidaten zijn afgewezen?

def find_divisor(n):
    for d in range(3, n):
        if n % d == 0:
            return d
        else:
            return None
  1. Verander return None in return False in de else.
  2. Verwijder de else en zet return None na de lus.
  3. Zet beide return-instructies na de lus.
  4. Verplaats return d vóór de if-test binnen de lus.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Wat drukt de laatste regel af?

def change(values):
    values.append("B")
    values = ["C"]
    values.append("D")
    return values

original = ["A"]
result = change(original)
print(original, result)
  1. ['A'] ['C', 'D']
  2. ['A', 'B', 'D'] ['C']
  3. ['C', 'D'] ['C', 'D']
  4. ['A', 'B'] ['C', 'D']
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Hoe kan de aanroepende code stock expliciet bijwerken zonder dat de hulpfunctie een globale variabele wijzigt?

stock = 18

def remove(stock, amount):
    return stock - amount

# caller statement
  1. remove(stock, 4)
  2. stock = remove(4, stock)
  3. stock = remove(stock, 4)
  4. remove(stock=4, amount=stock)
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een voorlopige hulpfunctie bevat alleen een docstring en pass. De aanroepende code telt het resultaat van de hulpfunctie op bij 7 en krijgt een TypeError. Wat moet je vervolgens implementeren?
  1. Geef het numerieke resultaat terug dat de taak van de hulpfunctie belooft.
  2. Druk het beloofde getal af vóór de pass-instructie.
  3. Verplaats de docstring onder pass om die uitvoerbaar te maken.
  4. Herhaal de aanroep van de hulpfunctie voordat je haar resultaat bij 7 optelt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Wat wordt afgedrukt?

def add_fee(amount):
    return amount + 3

def twice(amount):
    return amount * 2

print(twice(add_fee(5)))
  1. “13”
  2. “8”
  3. “10”
  4. “16”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Wat wordt afgedrukt?

rate = 2

def scale(value, factor=rate):
    return value * factor

def reset():
    global rate
    rate = 5

reset()
print(scale(3), scale(3, rate))
  1. “15 15”
  2. “6 6”
  3. “6 15”
  4. “15 6”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

56 Kernbegrippen, elk met een definitie

A

aanroepende code
De aanroepende code is de code die een functie aanroept en wacht tot die eindigt voordat ze na de aanroep verdergaat.
Wanneer banner() de functie line() aanroept, is de inhoud van banner de aanroepende code voor de functie die de lijn tekent.
aanroepstapel
De aanroepstapel is Pythons overzicht van aanroepen die zijn begonnen maar nog niet zijn geëindigd, inclusief waar hun aanroepende code verdergaat.
Terwijl een hulpfunctie voor een lijn binnen een banneraanroep wordt uitgevoerd, hebben beide niet-voltooide aanroepen een plaats op de aanroepstapel.
argument
Een argument is een waarde die in een functieaanroep wordt geleverd, nadat een eventuele expressie die de waarde oplevert is geëvalueerd.
In area(side + 1, 2) berekent Python het eerste argument voordat de inhoud van de oppervlaktefunctie begint.

B

benoemd argument
Een benoemd argument noemt in een aanroep de parameter waarvoor het bedoeld is, zodat de koppeling afhangt van de naam in plaats van de positie.
De aanroep describe_pet(name="Milo", animal="cat") vult de parameters in een leesbare volgorde in.
booleaanse functie
Een booleaanse functie beantwoordt een ja-neevraag door True of False terug te geven, vaak rechtstreeks uit een vergelijking.
Met de inhoud return n % 2 == 0 kan is_even(n) rechtstreeks als if-voorwaarde worden gebruikt.

C

constante
Een constante is een instelling die vast moet blijven; volgens de Pythonconventie schrijf je namen van constanten op bestandsniveau in hoofdletters.
Een functie kan TAX_RATE = 0.25 lezen om belasting te berekenen zonder die naam als globaal te declareren.

D

decompositie
Decompositie verdeelt een probleem in kleinere taken die elk als functie kunnen worden geïmplementeerd, begrepen en gecontroleerd.
Een programma voor een scorerapport scheidt scores lezen, een gemiddelde berekenen en een lettercijfer kiezen.
diagnostische uitvoerinstructie
Een diagnostische uitvoerinstructie toont tijdelijk een waarde tijdens het onderzoeken van een programmeerfout en wordt verwijderd wanneer het onderzoek is voltooid.
Een print-instructie op de eerste regel kan de onverwachte score zichtbaar maken die een hulpfunctie van haar aanroepende code ontvangt.
docstring
Een docstring is de string die als eerste instructie in een functie-inhoud staat en bij de functie wordt opgeslagen om haar gebruik voor aanroepende code te beschrijven.
De docstring van een converter kan de temperatuureenheden van invoer en uitvoer uitleggen voordat iemand de formule leest.
docstring van één regel
Een docstring van één regel is een korte opdrachtzin, volgens afspraak tussen driedubbele dubbele aanhalingstekens en eindigend met een punt.
“Geef de oppervlakte van een rechthoek terug.” beschrijft de taak zonder de signatuur van de functie te herhalen.
docstring van meerdere regels
Een docstring van meerdere regels heeft een samenvatting, een lege regel en verdere details over invoer, standaardwaarden, resultaten en effecten.
Een functie om een rekening te verdelen kan documenteren dat tip_rate=0.2 een deel van de rekening is en niet 20.

E

end
De parameter end van print bepaalt de tekst die na de weergegeven waarden wordt toegevoegd en gebruikt standaard een nieuwe regel.
Met end="..." kan de volgende print-instructie na de punten doorgaan in plaats van een nieuwe regel te beginnen.

F

functie
Een functie is een benoemd codeblok dat bij aanroep een taak uitvoert, zodat een programma dezelfde logica opnieuw kan gebruiken.
Een programma voor betalingsbewijzen kan print_receipt() aanroepen wanneer het een volgend betalingsbewijs moet tonen.
functie met een bruikbare retourwaarde
Een functie met een bruikbare retourwaarde geeft een bruikbaar resultaat terug dat de aanroepende code in een expressie, toekenning of voorwaarde kan gebruiken.
Een temperatuurconverter die een getal teruggeeft, kan dat leveren aan een afgedrukte tabel of een vergelijking met een grens.
functie zonder bruikbare retourwaarde
Een functie zonder bruikbare retourwaarde is een functie die wordt gebruikt voor een effect, zoals afdrukken, en geen bruikbaar resultaat naast None levert.
Een functie die een begroeting afdrukt, kan “Hello!” tonen terwijl de aanroepende code None ontvangt.
functie-inhoud
De functie-inhoud is het ingesprongen blok instructies onder de functiekop, dat bij elke aanroep vanaf het begin wordt gevolgd.
Twee ingesprongen regels met print onder def greet(): horen allebei bij de functie-inhoud.
functieaanroep
Een functieaanroep is een expressie die een functie uitvoert, geschreven met haar naam en ronde haakjes met eventuele argumenten.
De regel greet() voert de begroeting uit, terwijl een regel met alleen greet dat niet doet.
functiedefinitie
Een functiedefinitie is een def-instructie met een kop en ingesprongen inhoud die een functie onder een naam aanmaakt.
Python maakt greet aan bij def greet(): en wacht op een aanroep voordat het de inhoud uitvoert.
functiekop
Een functiekop is de openingsregel met def, de functienaam, ronde haakjes voor parameters en een dubbele punt.
In def print_line(length): noemt de kop de taak en haar invoer voordat de inhoud begint.
functieskelet
Een functieskelet is een onvoltooide functie met haar bedoelde kop en een tijdelijke inhoud, zodat aanroepende code tijdens de ontwikkeling kan worden uitgevoerd.
Een docstring en pass maken een geldig functieskelet, al geven aanroepen ervan nog steeds None terug totdat het is geïmplementeerd.

G

geldigheidsbereik
Het geldigheidsbereik is het deel van een programma waarin een naam kan worden gebruikt en bepaalt welke variabele met een naam wordt aangeduid.
Een naam die alleen binnen make_greeting() is aangemaakt, is na de aanroep niet beschikbaar voor een print-instructie op moduleniveau.
gemengde argumentdoorgifte
Gemengde argumentdoorgifte geeft sommige waarden op positie en andere op naam door, met de positionele waarden eerst.
In describe_pet("cat", name="Milo") wordt de eerste plaats op positie en de tweede op naam ingevuld.
geneste aanroep
Een geneste aanroep is een functieaanroep binnen de argumentexpressie van een andere aanroep, waarvan het resultaat nodig is voordat de buitenste aanroep wordt uitgevoerd.
In print(to_fahrenheit(add(10, 15))) wordt eerst de optelling uitgevoerd, daarna de omzetting en vervolgens het afdrukken.
global-instructie
De global-instructie laat een naam binnen een functie verwijzen naar de binding op bestandsniveau voor daaropvolgende leesbewerkingen en toekenningen.
Zet global total voordat de functie total gebruikt om een gedeelde lopende teller bij te werken.
globale variabele
Een globale variabele hoort bij het globale bereik van een bestand en kan volgens de regels voor het opzoeken van namen worden gelezen door functies in dat bestand.
Een x = 10 op moduleniveau blijft 10 wanneer een hulpfunctie haar eigen afzonderlijke lokale x = 5 toekent.
grenswaardetest
Een grenswaardetest controleert invoer precies op een beslisgrens, vaak samen met een nabijgelegen waarde die het andere pad neemt.
Scores van 90 en 89,9 leggen een voorwaarde voor een lettercijfer bloot die per ongeluk > gebruikt in plaats van >=.

H

help
De functie help toont informatie over een functie, inclusief haar signatuur en opgeslagen docstring als die aanwezig is.
Gebruik help(to_fahrenheit) om de converter te onderzoeken zonder er eerst een temperatuur aan door te geven.
hernieuwde toekenning
Een hernieuwde toekenning geeft een bestaande naam een nieuwe waarde of een nieuw object; een nieuwe waarde aan een parameter toekennen wijzigt die lokale binding.
De regel points = points + 10 wijzigt de lokale parameter en laat de score van de aanroepende code ongewijzigd.

I

incrementele ontwikkeling
Incrementele ontwikkeling bouwt een programma met kleine toevoegingen en controleert elk onderdeel voordat meer werk wordt verbonden.
Als je eerst een hulpfunctie voor het gemiddelde controleert, beperk je de te onderzoeken code wanneer een later rapport met lettercijfers misgaat.
interface
De interface van een functie bestaat uit haar naam, parameters, teruggegeven resultaat en gedocumenteerde gedrag: de afspraak die haar aanroepende code gebruikt.
Een berekening kan worden herschreven terwijl aanroepen ongewijzigd blijven als de interface nog steeds hetzelfde beloofde resultaat geeft.

L

lokale variabele
Een lokale variabele hoort bij een functieaanroep; daaronder vallen parameters en gewone namen waaraan in die functie een waarde wordt toegekend.
Elke aanroep kan zijn eigen count = 0 initialiseren, zodat twee aanroepen onafhankelijk van elkaar de waarde 1 kunnen afdrukken.

M

main
Een main-functie coördineert de kleinere taken van een programma en verbindt invoer, resultaten van hulpfuncties en de uiteindelijke weergave.
Een laatste aanroep main() voert de stappen van een scorerapport uit nadat alle definities van hulpfuncties zijn uitgevoerd.
mutatie
Een mutatie wijzigt de inhoud van een bestaand object, zodat een andere naam die naar hetzelfde object verwijst die wijziging kan waarnemen.
Als je via een lijstparameter “Ben” toevoegt, verandert de gastenlijst die de aanroepende code heeft doorgegeven.

N

naamverhulling
Naamverhulling treedt op wanneer een lokale naam binnen een functie een gelijk gespelde globale naam verhult zonder de globale binding te vervangen.
Als een hulpfunctie lokaal x = 5 toekent terwijl globaal x = 10 geldt, levert de x van de hulpfunctie 5 op en levert een latere globale x nog steeds 10 op.
None
None is Pythons speciale waarde voor geen waarde, ook bruikbaar als signaal dat optionele invoer is weggelaten.
Met basket=None kan de functie binnen if basket is None: een nieuwe lijst aanmaken.

O

optionele parameter
Een optionele parameter heeft een standaardwaarde, zodat een aanroep het argument kan weglaten of de standaardwaarde kan vervangen door een expliciet argument.
Een aanroep van een koffiefunctie kan milk="oat" instellen terwijl een eerdere optionele parameter voor het aantal shots op de standaardwaarde blijft.

P

parameter
Een parameter is een naam in een functiekop die bij een aanroep een argumentwaarde ontvangt als lokale variabele.
De kop def area(width, height): geeft elke aanroep van de oppervlaktefunctie lokale namen voor haar twee afmetingen.
pass
De pass-instructie is een tijdelijke invulling die geen actie uitvoert en een geplande functie-inhoud geldige Python maakt.
Een functie met alleen pass kan worden aangeroepen terwijl haar echte afdrukgedrag nog wordt geschreven.
positioneel argument
Een positioneel argument wordt op basis van zijn volgorde in een aanroep aan een parameter gekoppeld, waarbij de eerste waarde de eerste plaats invult.
Bij describe_pet(animal, name) zet describe_pet("cat", "Milo") de waarde “cat” in animal.
procedurele abstractie
Procedurele abstractie laat code een functie gebruiken via haar afgesproken taak zonder afhankelijk te zijn van hoe haar inhoud die taak uitvoert.
De aanroepende code kan letter_grade(avg) gebruiken zonder elke drempelvergelijking in de inhoud te volgen.

R

retourpad
Een retourpad is een route door de takken en lussen van een functie die een return-instructie of het einde van de inhoud bereikt.
Een tekenfunctie heeft een resultaat voor nul nodig, naast paden die labels voor positief en negatief teruggeven.
retourwaarde
Een retourwaarde is het resultaat dat een aanroep aan de aanroepende code levert, waar het kan worden opgeslagen, getest of aan een andere bewerking doorgegeven.
Na area = rectangle_area(4, 2.5) bevat area het teruggegeven resultaat 10,0 voor later gebruik.
return-instructie
Een return-instructie beëindigt de huidige functieaanroep en geeft het resultaat terug aan de aanroepende code; zonder expressie geeft ze None terug.
Met de instructie return width * height kan de aanroepende code een oppervlakte opslaan of in een andere berekening gebruiken.

S

sep
De parameter sep van print bepaalt de tekst die tussen weergegeven waarden wordt ingevoegd en gebruikt standaard een spatie.
De aanroep print("a", "b", "c", sep="-") toont de drie letters als “a-b-c”.
stacktrace
Een stacktrace is een foutrapport dat het pad van niet-voltooide aanroepen, de regel met de fout en het uiteindelijke fouttype en de melding toont.
Lees in een traceback eerst de laatste fout en onderzoek daarna de falende regel in de hulpfunctie en de aanroepende code die haar invoer leverde.
standaardwaarde
Een standaardwaarde is een waarde die voor een parameter wordt opgeslagen wanneer de definitie wordt uitgevoerd en wordt gebruikt wanneer een aanroep dat argument weglaat.
Bij def greet(name, greeting="Hello"): kan een aanroep de begroeting weglaten en toch de naam opgeven.

T

tuple
Een tuple is een gegroepeerde sequentie van waarden; door komma’s gescheiden waarden in een return vormen één tupleresultaat voor de aanroepende code.
De instructie return total // people, total % people groepeert een aandeel en een rest samen.
TypeError
Een TypeError meldt een ongeschikte bewerking op een waarde of een aanroep met een ongeldige combinatie van argumenten.
Een functie met twee parameters aanroepen met één argument werpt een TypeError op voor de ontbrekende invoer.

U

uitpakken
Uitpakken kent de afzonderlijke waarden van een gegroepeerd resultaat toe aan bijpassende namen, met behoud van de oorspronkelijke volgorde.
Als share(17, 5) 17 // 5, 17 % 5 teruggeeft, zet de toekenning each, left = share(17, 5) 3 in each en 2 in left.
uitvoeringsverloop
Het uitvoeringsverloop is de volgorde waarin instructies worden uitgevoerd, inclusief sprongen naar functies en terugkeer naar hun aanroepende code.
Een rapport kan “Start” afdrukken, banner() binnengaan, de aanroepen van hulpfuncties voltooien en daarna “End” afdrukken.
UnboundLocalError
Een UnboundLocalError ontstaat wanneer een functie een lokale naam probeert te lezen voordat die lokale naam een waarde heeft.
Een latere toekenning aan count maakt ook een eerdere print(count) lokaal, zelfs als er een globale variabele bestaat.

V

verborgen toestand
Een verborgen toestand is informatie waarvan een functie afhankelijk is of die ze wijzigt zonder dat via haar parameters en teruggegeven resultaat te tonen.
Een functie die een globaal totaal bijwerkt, vereist dat dit totaal vóór een onafhankelijke controle wordt voorbereid.
verplichte parameter
Een verplichte parameter heeft geen standaardwaarde en moet bij elke geldige aanroep een waarde krijgen, op positie of via een geaccepteerd benoemd argument.
Bij def greet(name, greeting="Hello"): veroorzaakt het weglaten van name een fout voor een ontbrekend argument.
verwacht resultaat
Een verwacht resultaat is een antwoord dat onafhankelijk vóór een controle is berekend en wordt gebruikt om te beoordelen wat een functie daadwerkelijk teruggeeft.
Door een gemiddelde met de hand te berekenen, kun je programma-uitvoer herkennen die aannemelijk lijkt maar verkeerd is.
voortijdige terugkeer
Een voortijdige terugkeer beëindigt een functie voordat haar latere instructies worden uitgevoerd, vaak wanneer een tak of zoekactie het antwoord al heeft gevonden.
Een zoekactie naar delers geeft voor 91 de waarde 7 terug zodra die kandidaat het getal zonder rest deelt en beëindigt daarmee ook de lus.

W

wijzigbare standaardwaarde
Een wijzigbare standaardwaarde is een opgeslagen standaardobject waarvan de inhoud kan veranderen, zodat aanroepen die het argument weglaten eerdere wijzigingen kunnen delen.
Als je een element toevoegt aan een standaardlijst voor een mandje, kan dat element bij de volgende aanroep zichtbaar blijven.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag