- Leren
- Informatica & ICT
- Programmeren
- Inleiding tot programmeren met Python
- Functies in Python
Pythonfuncties
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
- 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 aanSchrijf 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 uitvoeringsverloopVolg de volgorde waarin Python instructies uitvoert wanneer functies andere functies aanroepen, en voorspel daarmee de uitvoer van een programma.
- Definieer een functie en roep die aan
- 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 argumentenVoeg 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 argumentenGeef argumenten door op parameternaam, combineer positionele en benoemde argumenten in de juiste volgorde en herstel de fouten die verkeerde combinaties veroorzaken.
- Geef parameters standaardwaardenMaak parameters optioneel met standaardwaarden, zet verplichte en optionele parameters in de juiste volgorde en weet wanneer een standaardwaarde wordt aangemaakt.
- Gebruik parameters en positionele argumenten
- Gebruik
returnom 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 dieBeë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 resultatenSchrijf 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.
- Geef een waarde terug en gebruik die
- Voorspel welke variabelen een functie kan zien en wijzigen, geef gegevens door en terug via parameters en retourwaarden en gebruik
globalalleen wanneer dat echt nodig is.- Werk met lokale variabelen en parametersLeg 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 zorgvuldigLees 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.
- Werk met lokale variabelen en parameters
- 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 docstringsSchrijf docstrings van één en van meerdere regels volgens de gebruikelijke conventies en lees ze met
help(). - Verdeel een probleem over functiesVerdeel 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 functieOntwikkel 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.
- Documenteer functies met docstrings
Functies in Python: uitleg
1Definieer 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
passals 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
printwordt 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.
2Geef 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:
| Aanroep | Wat 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
TypeErrorop. - 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
| Aanroep | Diagnose |
|---|---|
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
printbepaaltsepde scheidingstekst enendde 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
defwordt uitgevoerd. - Een wijzigbare lijst als standaardwaarde wordt gedeeld door aanroepen die het argument weglaten.
- Gebruik
Noneen maak een lijst in de functie-inhoud wanneer elk weggelaten argument een nieuwe lijst nodig heeft.
3Geef 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.
| Bewerking | Waar de waarde naartoe gaat |
|---|---|
print(value) | Toont de waarde aan een persoon. |
return value | Geeft 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 valuebeë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
returngebruiken geeftNoneterug. - 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.
4Begrijp 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 functie | Declaratie nodig? |
|---|---|
| Een globale instelling lezen | Nee. |
| Opnieuw een waarde aan een globale naam toekennen | global name vóór gebruik. |
| Een element toevoegen aan een bestaande globale lijst | Nee; 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
UnboundLocalErrorop. - Zet
global namevóó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.
5Documenteer 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
| Vorm | Hoofddoel |
|---|---|
| Eerste string in de inhoud | Beschrijft de functie voor wie haar aanroept en verschijnt in help. |
#-commentaar in de inhoud | Legt 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)ofname.__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
mainde hulpfuncties coördineren en roepmain()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
| Verschijnsel | Controleer |
|---|---|
Een resultaat is None | Een ontbrekende return of een niet-afgedekt pad. |
| Er verschijnt geen effect | Een ontbrekende aanroep of een ongebruikt teruggegeven resultaat. |
| Een aannemelijk resultaat heeft de verkeerde betekenis | Verwisselde argumenten. |
NameError | Een 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
1Schrijf een functie en volg haar aanroepen
10 stappen
- 1IntroductieGeef 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.
- 2UitlegSchrijf 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.
- 3VoorbeeldVoer 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:
greetalleen verwijst naar het functieobject. Het roept de functie niet aan enprint(greet)toont een functiebeschrijving in plaats van de begroeting. - 4UitdagingVoorspel 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
readyaan en de naam op zichzelf verwijst naar die functie zonder haar uit te voeren. Om ook het bericht te tonen, verander jereadyinready(). De aanroep zou dan vóór de laatste print-instructie worden uitgevoerd en “Ready” en “Waiting” op afzonderlijke regels geven. - 5TipHoud 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 aaninputtoekent, verhul je de functie, zodat een latereinput(...)tekst probeert aan te roepen en mislukt.Een onvoltooide functie-inhoud heeft een instructie nodig. Gebruik een ingesprongen
passals tijdelijke invulling. Alleen commentaar vormt geen functie-inhoud en een niet-ingesprongenpasszou buiten de functie staan. - 6VoorbeeldGa 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 roeptlineaan, dus moet banner wachten terwijl die hulpfunctie haar streepjes afdrukt. Ga niet verder naar de titel voordat de hulpfunctie klaar is. - 7UitlegGa één niveau tegelijk verder
Wanneer
lineeindigt, gaat de uitvoering verder bij de print-instructie voor de titel binnenbanner. Banner roeptlinedaarna 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.
- 8UitdagingVolg 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
inneren gaat daarna verder bij de volgende print-instructie. Pas nadatoutereindigt, wordt de laatste instructie op moduleniveau uitgevoerd. De volgorde van definities bepaalt op zichzelf de uitvoervolgorde niet. - 9UitdagingVerplaats een definitie veilig
Een bestand definieert
showmet een inhoud dieborderaanroept. Daarna definieert hetborderen het eindigt met een lus dieshow()twee keer aanroept. Veroorzaakt de lager geplaatste definitie van de hulpfunctie een fout en hoe vaak wordtborderuitgevoerd?---reveal---
Het programma werkt: beide definities zijn uitgevoerd voordat de lus
showaanroept. Elke aanroep gaatshowbinnen bij de eerste regel van de inhoud en bereikt één aanroep vanborder, 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. - 10SamenvattingLees 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.
2Vul de parameterplaatsen in
13 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieGebruik een taak opnieuw met verschillende waarden
- 2VoorbeeldKoppel de eerste en tweede invoerwaarde
- 3UitlegEvalueer argumenten vóór de functie-inhoud
- 4UitdagingControleer het aantal argumenten
- 5UitlegGebruik namen om de rollen te tonen
- 6UitdagingHerstel een dubbel ingevulde plaats
- 7TipLees benoemde opties van ingebouwde functies
- 8VoorbeeldMaak de gebruikelijke keuze optioneel
- 9UitdagingSla een optionele keuze over met een naam
- 10KernpuntEen standaardwaarde onthoudt het moment waarop ze is aangemaakt
- 11VoorbeeldZie waarom een lijst als standaardwaarde elementen behoudt
- 12UitdagingCombineer standaardwaarden met benoemde invoer
- 13SamenvattingVergelijk de kop met de aanroep
3Volg waarden terug naar de aanroepende code
14 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieKijk wat de aanroepende code ontvangt
- 2VoorbeeldVervang de aanroep door haar resultaat
- 3UitlegMaak onderscheid tussen het scherm en het resultaat
- 4UitdagingZoek de waarde die in de optelling wordt gebruikt
- 5TipControleer waar de aanroep wordt uitgevoerd
- 6VoorbeeldStop bij het eerste passende lettercijfer
- 7UitdagingDek de invoer tussen de takken af
- 8KernpuntLaat een vergelijking de vraag beantwoorden
- 9VoorbeeldGeef een gevonden deler terug
- 10UitdagingHerstel een te vroeg succesresultaat
- 11VoorbeeldPak een gegroepeerd resultaat uit
- 12VoorbeeldGeef een binnenste resultaat naar buiten door
- 13UitdagingCombineer een vroeg pad met een resultaat
- 14SamenvattingVolg paden en retourwaarden samen
4Volg namen en gedeelde objecten
11 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVraag waar de naam thuishoort
- 2VoorbeeldGeef elke aanroep een eigen teller
- 3UitlegHoud verhulde namen uit elkaar
- 4UitdagingMaak de wijziging in de aanroepende code expliciet
- 5VoorbeeldVolg een gedeelde lijst via een parameter
- 6VoorbeeldLees een globale variabele zonder declaratie
- 7KernpuntToekenning bepaalt vroeg het lokale bereik
- 8UitdagingKies het bereik van een wijziging
- 9VerbandGeef de veranderende waarde door via de aanroep
- 10UitdagingMaak onderscheid tussen mutatie en hernieuwde toekenning
- 11SamenvattingBenoem de bewerking voordat je het effect voorspelt
5Ontwerp en controleer een scorerapport
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieBouw een programma uit duidelijke taken
- 2VoorbeeldZet de beschrijving waar help haar kan vinden
- 3UitlegVoeg details toe die een aanroep beïnvloeden
- 4UitdagingZoek de ontbrekende documentatie
- 5UitlegKies een taak voor elke hulpfunctie
- 6VoorbeeldVerbind de hulpfuncties in main
- 7UitdagingHoud berekening en weergave uit elkaar
- 8TipHoud tijdens het bouwen een werkend programma
- 9VoorbeeldControleer een grens die een programmeerfout kan blootleggen
- 10UitdagingZoek waar een verkeerd type binnenkomt
- 11UitdagingLaat documentatie en een controle overeenkomen
- 12SamenvattingLaat de interface de controles sturen
Functies in Python: oefenvragen
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
Toon antwoordVerberg antwoord
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)
Toon antwoordVerberg antwoord
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)
Toon antwoordVerberg antwoord
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)
Toon antwoordVerberg antwoord
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)
Toon antwoordVerberg antwoord
(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)
Toon antwoordVerberg antwoord
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()
Toon antwoordVerberg antwoord
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)
Toon antwoordVerberg antwoord
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
Toon antwoordVerberg antwoord
main verplaatsen verplaatst alleen de herhaling en vereist nog steeds meerdere aanpassingen om dat gedeelde gedrag te wijzigen.Vraag 10 van 10
> 50 het beste bloot?Toon antwoordVerberg antwoord
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")
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()
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")
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)
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")
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)
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
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)
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
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
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()
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)
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)
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", []))
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")
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
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)
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
if score >= 60: nadat de aanroepende code input("Score: ") heeft doorgegeven. Welke oplossing pakt het type van de invoer aan?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
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")
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="-")
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
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
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)
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
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
pass. De aanroepende code telt het resultaat van de hulpfunctie op bij 7 en krijgt een TypeError. Wat moet je vervolgens implementeren?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)))
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))
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
aanroepende code
banner() de functie line() aanroept, is de inhoud van banner de aanroepende code voor de functie die de lijn tekent.aanroepstapel
argument
area(side + 1, 2) berekent Python het eerste argument voordat de inhoud van de oppervlaktefunctie begint.B
benoemd argument
describe_pet(name="Milo", animal="cat") vult de parameters in een leesbare volgorde in.booleaanse functie
True of False terug te geven, vaak rechtstreeks uit een vergelijking.return n % 2 == 0 kan is_even(n) rechtstreeks als if-voorwaarde worden gebruikt.C
constante
TAX_RATE = 0.25 lezen om belasting te berekenen zonder die naam als globaal te declareren.D
decompositie
diagnostische uitvoerinstructie
docstring
docstring van één regel
docstring van meerdere regels
tip_rate=0.2 een deel van de rekening is en niet 20.E
end
end van print bepaalt de tekst die na de weergegeven waarden wordt toegevoegd en gebruikt standaard een nieuwe regel.end="..." kan de volgende print-instructie na de punten doorgaan in plaats van een nieuwe regel te beginnen.F
functie
print_receipt() aanroepen wanneer het een volgend betalingsbewijs moet tonen.functie met een bruikbare retourwaarde
functie zonder bruikbare retourwaarde
None levert.None ontvangt.functie-inhoud
print onder def greet(): horen allebei bij de functie-inhoud.functieaanroep
greet() voert de begroeting uit, terwijl een regel met alleen greet dat niet doet.functiedefinitie
def-instructie met een kop en ingesprongen inhoud die een functie onder een naam aanmaakt.greet aan bij def greet(): en wacht op een aanroep voordat het de inhoud uitvoert.functiekop
def, de functienaam, ronde haakjes voor parameters en een dubbele punt.def print_line(length): noemt de kop de taak en haar invoer voordat de inhoud begint.functieskelet
pass maken een geldig functieskelet, al geven aanroepen ervan nog steeds None terug totdat het is geïmplementeerd.G
geldigheidsbereik
make_greeting() is aangemaakt, is na de aanroep niet beschikbaar voor een print-instructie op moduleniveau.gemengde argumentdoorgifte
describe_pet("cat", name="Milo") wordt de eerste plaats op positie en de tweede op naam ingevuld.geneste aanroep
print(to_fahrenheit(add(10, 15))) wordt eerst de optelling uitgevoerd, daarna de omzetting en vervolgens het afdrukken.global-instructie
global-instructie laat een naam binnen een functie verwijzen naar de binding op bestandsniveau voor daaropvolgende leesbewerkingen en toekenningen.global total voordat de functie total gebruikt om een gedeelde lopende teller bij te werken.globale variabele
x = 10 op moduleniveau blijft 10 wanneer een hulpfunctie haar eigen afzonderlijke lokale x = 5 toekent.grenswaardetest
> gebruikt in plaats van >=.H
help
help toont informatie over een functie, inclusief haar signatuur en opgeslagen docstring als die aanwezig is.help(to_fahrenheit) om de converter te onderzoeken zonder er eerst een temperatuur aan door te geven.hernieuwde toekenning
points = points + 10 wijzigt de lokale parameter en laat de score van de aanroepende code ongewijzigd.I
incrementele ontwikkeling
interface
L
lokale variabele
count = 0 initialiseren, zodat twee aanroepen onafhankelijk van elkaar de waarde 1 kunnen afdrukken.M
main
main-functie coördineert de kleinere taken van een programma en verbindt invoer, resultaten van hulpfuncties en de uiteindelijke weergave.main() voert de stappen van een scorerapport uit nadat alle definities van hulpfuncties zijn uitgevoerd.mutatie
N
naamverhulling
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.basket=None kan de functie binnen if basket is None: een nieuwe lijst aanmaken.O
optionele parameter
milk="oat" instellen terwijl een eerdere optionele parameter voor het aantal shots op de standaardwaarde blijft.P
parameter
def area(width, height): geeft elke aanroep van de oppervlaktefunctie lokale namen voor haar twee afmetingen.pass
pass-instructie is een tijdelijke invulling die geen actie uitvoert en een geplande functie-inhoud geldige Python maakt.pass kan worden aangeroepen terwijl haar echte afdrukgedrag nog wordt geschreven.positioneel argument
describe_pet(animal, name) zet describe_pet("cat", "Milo") de waarde “cat” in animal.procedurele abstractie
letter_grade(avg) gebruiken zonder elke drempelvergelijking in de inhoud te volgen.R
retourpad
retourwaarde
area = rectangle_area(4, 2.5) bevat area het teruggegeven resultaat 10,0 voor later gebruik.return-instructie
None terug.return width * height kan de aanroepende code een oppervlakte opslaan of in een andere berekening gebruiken.S
sep
sep van print bepaalt de tekst die tussen weergegeven waarden wordt ingevoegd en gebruikt standaard een spatie.print("a", "b", "c", sep="-") toont de drie letters als “a-b-c”.stacktrace
standaardwaarde
def greet(name, greeting="Hello"): kan een aanroep de begroeting weglaten en toch de naam opgeven.T
tuple
return total // people, total % people groepeert een aandeel en een rest samen.TypeError
TypeError meldt een ongeschikte bewerking op een waarde of een aanroep met een ongeldige combinatie van argumenten.TypeError op voor de ontbrekende invoer.U
uitpakken
share(17, 5) 17 // 5, 17 % 5 teruggeeft, zet de toekenning each, left = share(17, 5) 3 in each en 2 in left.uitvoeringsverloop
banner() binnengaan, de aanroepen van hulpfuncties voltooien en daarna “End” afdrukken.UnboundLocalError
UnboundLocalError ontstaat wanneer een functie een lokale naam probeert te lezen voordat die lokale naam een waarde heeft.count maakt ook een eerdere print(count) lokaal, zelfs als er een globale variabele bestaat.V
verborgen toestand
verplichte parameter
def greet(name, greeting="Hello"): veroorzaakt het weglaten van name een fout voor een ontbrekend argument.verwacht resultaat
voortijdige terugkeer
W
wijzigbare standaardwaarde
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.