Je eigen functies
Typ je dezelfde formule steeds met andere getallen, maak er dan een functie van. Je benoemt formule en invoer eenmaal en roept haar overal aan: voor fooien, BMI, spaargroei of facturen.
Deze pagina behandelt functies definiëren en aanroepen, andere namen gebruiken, voorwaarden, recursie en geldende limieten. Voor ingebouwde functies zoals sqrt en round zie de functiereferentie.
Een functie definiëren en aanroepen
Schrijf de functienaam, parameters tussen ronde haakjes, een gelijkteken en de formule. Roep haar daarna aan met waarden in dezelfde volgorde:
tip(bill, pct) = bill * pcttip($48, 15%) geeft $7.20tip($120, 12.5%) geeft $15.00tip($36 + $12, 15%) geeft $7.20De definitieregel toont geen resultaat. Elke aanroep vervangt bill en pct door je waarden en berekent de formule. Een argument mag een hele berekening zijn, zoals $36 + $12 hierboven.
Argumenten zijn volledige waarden, niet alleen getallen. Eenheden en valuta blijven dus in de formule behouden:
bmi(weight, height) = weight / height^2bmi(81 kg, 1.8 m) geeft 25 kg/m²Eenheden blijven zoals je ze invoert: bmi(81 kg, 180 cm) geeft kg/cm². Reken binnen de functie om als je ongeacht de invoer dezelfde eenheid wilt:
bmi(weight, height) = (weight / height^2) in kg/m^2bmi(81 kg, 180 cm) geeft 25 kg/m²bmi(80 kg, 5.9 ft) geeft 24.7375131668 kg/m²Een functie mag ook geen parameters hebben. Schrijf dan lege haakjes bij zowel definitie als aanroep:
standard_vat() = 20%£120 * standard_vat() geeft £24.00Een gewone variabele zoals standard_vat = 20% doet meestal hetzelfde met minder typwerk.
Namen en parameters
- Functie- en parameternamen zijn één woord. Gebruik letters, cijfers en underscores zonder spaties, zoals
net_payofbmi2. Schrijf jearea of circle(r) = pi * r^2, dan stelt de regel de juiste naam voor:area_of_circle. - Functienamen zijn niet hoofdlettergevoelig: na
Tip(bill, pct)kun jetip($48, 15%)aanroepen. - Elke parameter moet een eigen naam hebben.
f(a, a) = ais een fout. - Een functie mag maximaal 32 parameters hebben.
- Je kunt de naam van een ingebouwde functie niet hergebruiken.
round(x) = …ensqrt(x) = …geven een fout in plaats van die functie te vervangen. Een gewone variabele mag zo’n naam wel gebruiken, zoalsfloor = 12 m². Zie Namen. - De spreadsheetnamen
avg,totalenstdevmag je vrij gebruiken. Definieer je zelftotal(order), dan wordt jouw versie uitgevoerd. - Een functie en variabele mogen dezelfde naam hebben.
rateleest de variabele;rate(5)roept de functie aan. - Roep een functie altijd met ronde haakjes aan. Een losse functienaam zonder gelijknamige variabele toont niets. Uitzonderingen zijn
sum,total,subtotal,grand total,average,maxenmin, die deze statistiek voor de regels erboven berekenen. Zie Bovenstaande regels optellen.
Komma’s in argumenten
Een komma gevolgd door een spatie scheidt argumenten; een komma gevolgd door precies drie cijfers groepeert duizendtallen. Zo kun je bedragen op de gebruikelijke manier schrijven:
tip(bill, pct) = bill * pcttip($1,200, 15%) geeft $180.00tip($1200,15%) geeft $180.00Heeft een functie meer waarden nodig dan de spaties opleveren, dan scheidt elke komma argumenten, zoals in de tweede aanroep. Gebruik een decimale punt voor gebroken getallen, zoals tip($48, 12.5%).
Andere namen uit je notitie gebruiken
Een functie kan variabelen uit je notitie gebruiken. Ze leest hun huidige waarde bij elke aanroep:
vat = 20%with_vat(price) = price * (1 + vat)with_vat(£50) geeft £60.00vat = 5%with_vat(£50) geeft £52.50De variabele moet al bestaan als je de functie definieert. Zet vat = 20% dus boven with_vat. Bestaat de variabele nog niet, dan geeft de definitieregel een fout.
Parameters zijn lokaal voor de functie. Een parameter price leest of verandert geen variabele price elders in de notitie:
price = £10double(price) = price * 2double(£3) geeft £6.00price geeft £10.00Net als variabelen kunnen functies uit een rekenblok in latere rekenblokken van dezelfde notitie worden gebruikt. Varlig werkt van boven naar beneden; definieer een functie dus boven de eerste aanroep. Een aanroep boven de definitie toont geen resultaat.
Functies die andere functies aanroepen
Kleine functies kunnen op elkaar voortbouwen:
day_rate = £400fee(days) = days * day_rateinvoice(days) = fee(days) * 1.2invoice(5) geeft £2,400.00Een functie onthoudt de versie van een hulpfunctie die bij haar definitie bestond. Definieer je die hulpfunctie lager opnieuw, dan blijven eerder gedefinieerde functies de oude versie gebruiken:
shipping(order) = £4.95total(order) = order + shipping(order)shipping(order) = £2.95total(£30) geeft £34.95shipping(£30) geeft £2.95Definieer total opnieuw onder de nieuwe shipping om die versie te gebruiken. Een bestaande definitie ter plekke bewerken veroorzaakt dit niet: Varlig rekent vanaf boven opnieuw en alles eronder gebruikt de gewijzigde versie.
Een functie mag ook een pas later gedefinieerde hulpfunctie aanroepen. Ze gebruikt dan de versie die op het moment van aanroepen bestaat. De hulpfunctie moet dus bestaan wanneer je de buitenste functie aanroept:
checkout(order) = order + delivery(order)delivery(order) = if order >= £40 then £0 else £3.50checkout(£25) geeft £28.50checkout(£60) geeft £60.00Voorwaarden
Gebruik if … then … else … om tussen resultaten te kiezen. Zet na else nog een if voor meer dan twee gevallen:
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20postage(90 g) geeft £0.85postage(500 g) geeft £1.55postage(1.2 kg) geeft £3.20Alleen de toepasselijke tak wordt berekend. Zo voorkom je een berekening die anders faalt, zoals delen door nul:
per_person(total, people) = if people > 0 then total / people else £0per_person(£90, 3) geeft £30.00per_person(£90, 0) geeft £0.00Recursie
Een functie mag zichzelf aanroepen zolang een voorwaarde haar uiteindelijk stopt. Deze telt handdrukken wanneer iedereen in een groep elkaar eenmaal de hand geeft:
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)handshakes(6) geeft 15handshakes(10) geeft 45Elke aanroep nestelt één niveau dieper; maximaal 12 geneste aanroepen zijn toegestaan. handshakes(12) werkt nog, maar handshakes(13) geeft Error: calculation limit. Een functie zonder bereikbare stopvoorwaarde wordt bij definitie geaccepteerd en loopt bij aanroepen tegen dezelfde limiet. Twee functies mogen elkaar ook aanroepen, binnen die limiet.
Voor gewone telproblemen zijn ingebouwde functies sneller en geldt die limiet niet. combination(10, 2) geeft ook 45; factorial(n) of n! dekt het klassieke recursievoorbeeld.
Lijsten, matrices en meer
Argumenten mogen lijsten, matrices of complexe getallen zijn. De functiedefinitie mag elke ingebouwde functie gebruiken:
spread(scores) = max(scores) - min(scores)spread([12, 18, 9, 21]) geeft 12De definitie mag ook een sommatie of vergelijkingsoplosser met een eigen lokale variabele bevatten. Zie Lijsten en statistiek en Sommatie, vergelijkingen en calculus.
Valkuilen
- Schrijf machten met
^.x²wordt binnen een functie niet geaccepteerd. Bovendien kan een korte parameternaam een eenheid zijn: inw / h²betekenth²vierkante uren, niet de parameterh. Schrijfw / h^2. - Controleer het aantal argumenten.
tip($48)aanroepen terwijl de functie twee waarden verwacht geeft een fout. - Een losse prijs wordt als prijs per eenheid gelezen. In
oats(amount) = amount / 1 kg * £0.95is £0,95 een kiloprijs. Elke aanroep meldt dat; houd de aanwijzer erboven voor de uitleg dat £0,95 in oats als prijs per kg is behandeld en £0.95/kg dit expliciet maakt. Schrijf het tarief volledig in de definitie om de melding weg te nemen. - Eén regel, één formule. Een definitie is één uitdrukking op één regel. Definieer bij meerdere stappen een kleine functie per stap en combineer ze.
- Een ongeldige herdefinitie behoudt de oude versie. Bevat een nieuwe definitie van
tipeen fout, dan meldt de regel dat en blijft de vorige werkendetipbeschikbaar. - Resultaten kunnen bij herberekenen veranderen. Elke aanroep wordt opnieuw berekend. Een functie met
randomof de datum van vandaag kan dus een ander resultaat geven. - Fouten worden doorgegeven. Laat een argument de formule mislukken, bijvoorbeeld door delen door nul, dan toont de aanroep die fout.
Limieten
| Onderdeel | Limiet |
|---|---|
| Parameters per functie | 32 |
| Geneste aanroepen (een functie die zichzelf of een andere aanroept) | 12 |
| Aanroepen tijdens het uitwerken van één aanroep op het hoogste niveau | 16,384 |
| Functies die in een notitie zijn gedefinieerd | 1,024 |
Bij een overschreden limiet verschijnt Error: calculation limit. De rest van de notitie blijft werken. Zie Fouten, diagnostiek en limieten voor alle limieten.
Alles combineren
Hier staat een freelancefactuur. Tarief en btw staan bovenaan als benoemde waarden; drie kleine functies doen het rekenwerk:
# March invoiceday_rate = £450vat = 20%fee(days) = days * day_ratewith_vat(amount) = amount * (1 + vat)late_fee(amount, days_late) = if days_late > 30 then amount * 2% else £0design = fee(8) geeft £3,600.00build = fee(4.5) geeft £2,025.00subtotal = design + build geeft £5,625.00with_vat(subtotal) geeft £6,750.00late_fee(with_vat(subtotal), 45) geeft £135.00Verander day_rate of vat en alle regels eronder worden bijgewerkt. Betaalt de klant te laat, dan voegt één aanroep de toeslag toe.