Uit de cursus: Basisbeginselen van programmeren: voorbeelden uit de echte wereld

Koken met functies

- Een van de eerste dingen die iedereen wordt geleerd bij het leren programmeren, is hoe je een functie kunt creëren. De syntaxis voor functies kan van taal tot taal verschillen, maar het algemene concept is altijd hetzelfde. Een functie is een routine of procedure die al dan niet enkele invoerwaarden nodig heeft, het voert een soort verwerking uit en retourneert vervolgens mogelijk een uitvoerwaarde. Elke programmeercursus leert je hoe je functies in die specifieke taal kunt maken, maar wat vaak over het hoofd wordt gezien, is de vraag waarom je een functie zou moeten maken en wanneer je een specifiek proces wel of niet in een functie zou moeten veranderen. Het korte antwoord is dat de functie moet worden gemaakt voor veelgebruikte routines. Om dat concept te demonstreren, gaan we naar de keuken en kijken we naar een routine die ik elke dag doe. Goedemorgen. Elke dag als ik wakker word, kook ik graag zelf een stevig ontbijt om de dag goed te beginnen. Er zijn veel stappen betrokken bij het koken van dat ontbijt. Ik zet altijd koffie, kan wat eieren scharrelen, wat toast maken en natuurlijk eet ik eindelijk. Elk van die stappen in het ontbijtbereidingsproces bestaat uit veel meer kleinere stappen. Het proces van het maken van koffie omvat bijvoorbeeld het meten van de koffiebonen, het malen van de koffiebonen, het plaatsen van de gemalen koffiebonen in het filter, het meten van het water, het starten van het koffiezetapparaat en ten slotte het gieten van de koffie. Er waren veel stappen in dat proces, maar die stappen zouden precies hetzelfde zijn elke keer dat ik koffie zet. En daarom heb ik besloten om die stappen te combineren tot een mentale functie. Als ik nu besluit om koffie te zetten, gaan mijn hersenen op de automatische piloot en doe ik al die dingen zonder expliciet na te hoeven denken over elke stap. Mmm. Koffie zetten is slechts een deel van mijn ontbijtroutine die ik heb omgezet in een mentale functie. Laten we een ander ontbijtproces afbreken, een omelet maken. Om een omelet te maken, begin ik met het mengen van mijn ingrediënten in een kom, ik giet dat mengsel in een koekenpan, ik kook de omelet aan de ene kant, ik draai het om, ik kook de andere kant, en de output van dat proces is een omelet. Het is niets bijzonders, maar ik ben een computerprogrammeur, geen chef-kok. Net als bij het maken van koffie, heb ik ook het proces voor het maken van een omelet gefunctionaliseerd. Dat betekent dat als mijn vrouw, Olivia, wil dat ik een omelet maak voor het ontbijt, ze me niet elk van die stappen hoeft te vertellen, de ingrediënten mengt, ze in de koekenpan giet enzovoort, alles wat ze te zeggen heeft is - Maak me een omelet, alsjeblieft? - En ik weet precies wat ik moet doen. Laten we eens kijken naar dat omelet-maakproces als een functie in Python. Ik heb de IDLE Python-editor open voor het start_01_01_breakfast_function script dat ik zal gebruiken om de tools samen te stellen om een functioneel ontbijt te maken. Op dit moment is het script gewoon een reeks gedrukte uitspraken die elk van de stappen in mijn omeletproductieproces vertegenwoordigen. Python kan veel dingen doen, maar het kan niet echt een omelet maken, dus we zullen een beetje fantasie moeten gebruiken. De stappen in het omeletbereidingsproces omvatten het mengen van de ingrediënten, het gieten van het mengsel in een koekenpan, het koken van de eerste kant, het omdraaien en vervolgens het koken van de andere kant. Aan het einde van het proces maak ik een nieuw stringobject om de smakelijke omelet weer te geven die ik zojuist heb gekookt en wijs ik deze toe aan de variabele naam omelet. Ik zal dit script in IDLE uitvoeren door naar Run, Run Module te gaan. En dat brengt de interactieve Python-shell naar boven. Zoals je kunt zien, heeft het script die vijf stappen in het omelet-maakproces afgedrukt. Als ik omelet typ om toegang te krijgen tot die variabele, krijg ik het stringobject terug dat de smakelijke omelet beschrijft, precies wat ik had verwacht. Dus dat was een omelet voor mij om te eten. Maar wat als Olivia ook een omelet als ontbijt wil? In dat geval moet ik al die stappen nog eens herhalen om een tweede omelet voor Olivia te maken. Een manier waarop ik dat zou kunnen bereiken, zou zijn om al die stappen in het proces opnieuw uit te typen, maar omwille van de tijd zal ik gewoon kopiëren en plakken. En ik zal de variabele namen aanpassen omelet1 en omelet2 te zijn, zodat ik ze uit elkaar kan houden. Nu, wanneer ik dit script opsla en uitvoer, doorloopt het de stappen om twee keer een omelet te maken. En als ik omelet1 typ, zie je dat het een lekkere omelet is. En hetzelfde geldt voor de variabele omelet2. Dat script kookte met succes ontbijt voor Olivia en mezelf, maar wat als ik meer dan alleen twee omeletten moest maken? Laten we zeggen dat ik besloot om een stel vrienden uit te nodigen voor het ontbijt. Als ik alle stappen handmatig zou blijven kopiëren elke keer dat ik een omelet wilde maken, zou mijn script uiteindelijk erg lang zijn. En hoe langer het script wordt, hoe groter de kans dat ik een fout maak. Omdat ik elke keer dat ik een omelet wil maken exact dezelfde acties uitvoer, is dit het perfecte scenario voor ons om die stappen te combineren tot één functie. Dus laten we dat nu doen. Voordat ik een functie kan gebruiken, moet ik deze eerst definiëren. Dus bovenaan het script typ ik D-E-F, wat het sleutelwoord is om Python te laten weten dat ik een nieuwe functie definieer. Ik geef de functie een naam, make_omelette en maak vervolgens open en dichte haakjes gevolgd door een dubbele punt. De specifieke syntaxis voor het definiëren van een functie varieert als u in een andere taal programmeert, maar dit is hoe het wordt gedaan in Python. Nu moet ik al die stappen voor het maken van een omelet in mijn nieuwe make_omelette functie stoppen. Python gebruikt inspringing om aan te geven dat een specifieke coderegel bestaat binnen iets anders, zoals een functiedefinitie, dus ik zal al deze afdrukinstructies inspringen om ze onderdeel te maken van de functie make_omelette. Ik zal ook de tweede set gedrukte afschriften verwijderen, omdat ik deze niet meer nodig heb. Op dit punt heb ik een functie gemaakt met de naam make_omelette, en wanneer ik het gebruik, zal het die stappen afdrukken en een nieuwe string maken die een smakelijke omelet beschrijft. Maar er is nog één ding dat ik moet doen. Ik wil niet alleen dat het touwtje dat een smakelijke omelet beschrijft, in deze functie bestaat. Als ik de make_omelette-functie aanroep, wil ik die string terugkrijgen als uitgang. Om dat te doen, kan ik de instructie retouromelet aan het einde van de functie toevoegen en ik zal ook de variabelenaam wijzigen van omelet1 terug naar gewoon omelet. Terwijl deze functie wordt uitgevoerd, wordt de functie afgesloten en wordt de gewenste omelet als uitvoer doorgegeven wanneer deze bij de return-instructie komt. Nu is onze functie voltooid, dus laten we hem gebruiken. Om een omelet voor mezelf te maken, kan ik omelet1 = make_omelette typen met open en dichte haakjes achteraf. Hiermee wordt de make_omelette functie uitgevoerd die alle benodigde omelet-makende stappen uitvoert en de smakelijke omeletreeks retourneert die ik vervolgens toewijs aan de variabele naam omelet1. Ik moet ook aardig zijn en een omelet maken voor Olivia en dat kan ik op dezelfde manier doen door simpelweg omelet2 = make_omelette te typen. Wanneer ik dit script nu opsla en uitvoer, voert het de stappen uit om net als voorheen twee omeletten te maken. En we kunnen controleren of de variabele omelet1 een smakelijke omelet is. En dat geldt ook voor omelet2. Perfect. Nu hebben we een omeletfunctie, we hebben het getest en we weten dat het werkt. We kunnen het keer op keer gebruiken om zoveel omeletten te maken als we willen. Ik kan het hier zelfs gebruiken in de interactieve schil. Als ik make_omelette typ en op enter druk, voert het de nodige stappen uit en retourneert de functie de string \ "een smakelijke omelet " die automatisch wordt afgedrukt door de Python-shell. Dit toont een voordeel van het organiseren van code in functies, hergebruik van code. Ik heb mijn omelet-maakfunctie ooit geschreven en nu kan ik het gemakkelijk steeds opnieuw gebruiken. De functie voert alle tussenstappen uit van het mengen, koken en omdraaien van de omelet, zodat ik me geen zorgen hoef te maken over een van die stappen wanneer ik de functie gebruik.

Inhoud