Le tue funzioni
Se usi spesso la stessa formula con numeri diversi, trasformala in una funzione. Definisci una volta il nome, gli argomenti e la formula, poi richiamala dove serve: per una mancia, un calcolo dell’IMC, una proiezione di risparmio o una fattura.
Questa pagina spiega come definire e chiamare funzioni, come usano gli altri nomi della nota, condizioni e ricorsione, e quali limiti si applicano. Per le funzioni integrate, come sqrt e round, vedi la documentazione di riferimento delle funzioni.
Definire e chiamare una funzione
Scrivi il nome della funzione, i parametri tra parentesi, il segno uguale e la formula. Poi chiamala passando i valori nello stesso ordine:
tip(bill, pct) = bill * pcttip($48, 15%) dà $7.20tip($120, 12.5%) dà $15.00tip($36 + $12, 15%) dà $7.20La riga che definisce la funzione non mostra un risultato. Ogni chiamata sostituisce bill e pct con i valori forniti e calcola la formula. Un argomento può essere un’intera espressione, come $36 + $12 sopra.
Gli argomenti sono valori completi, non solo numeri: anche unità di misura e valute vengono quindi usate nella formula.
bmi(weight, height) = weight / height^2bmi(81 kg, 1.8 m) dà 25 kg/m²Le unità restano quelle fornite: bmi(81 kg, 180 cm) restituisce un risultato in kg/cm². Per ottenere sempre la stessa unità, effettua la conversione all’interno della funzione:
bmi(weight, height) = (weight / height^2) in kg/m^2bmi(81 kg, 180 cm) dà 25 kg/m²bmi(80 kg, 5.9 ft) dà 24.7375131668 kg/m²Una funzione può anche non avere parametri. Usa parentesi vuote sia nella definizione sia nella chiamata:
standard_vat() = 20%£120 * standard_vat() dà £24.00Una variabile semplice, come standard_vat = 20%, di solito fa lo stesso lavoro con meno digitazione.
Nomi e parametri
- I nomi di funzioni e parametri devono essere parole singole. Usa lettere, cifre e trattini bassi, come
net_payobmi2, senza spazi. Se scriviarea of circle(r) = pi * r^2, la riga suggerisce il nome corretto:area_of_circle. - I nomi delle funzioni non distinguono maiuscole e minuscole: dopo aver definito
Tip(bill, pct), puoi chiamaretip($48, 15%). - Ogni parametro ha bisogno del proprio nome.
f(a, a) = aè un errore. - Una funzione può avere fino a 32 parametri.
- Non puoi riutilizzare il nome di una funzione integrata:
round(x) = …esqrt(x) = …generano un errore invece di sostituirla. Una variabile normale può comunque usare questi nomi, per esempiofloor = 12 m²: vedi Nomi. - I nomi tipici dei fogli di calcolo
avg,totalestdevsono invece disponibili per le tue funzioni. Se definiscitotal(order), viene eseguita la tua versione. - Una funzione e una variabile possono condividere un nome.
ratelegge la variabile erate(5)chiama la funzione. - Chiama sempre le funzioni con le parentesi. Il nome di una funzione scritto da solo, senza una variabile omonima, non mostra nulla. Fanno eccezione
sum,total,subtotal,grand total,average,maxemin, che calcolano la relativa statistica sulle righe precedenti: vedi Sommare le righe precedenti.
Virgole negli argomenti
Una virgola seguita da uno spazio separa gli argomenti, e una virgola seguita esattamente da tre cifre raggruppa migliaia, in modo da poter scrivere importi come faresti normalmente:
tip(bill, pct) = bill * pcttip($1,200, 15%) dà $180.00tip($1200,15%) dà $180.00Se la funzione richiede più valori di quelli individuati tramite gli spazi, ogni virgola viene considerata un separatore, come nella seconda chiamata. Usa il punto per i decimali, come in tip($48, 12.5%).
Usare altri nomi nella tua nota
Una funzione può usare le variabili della nota, leggendone il valore attuale a ogni chiamata:
vat = 20%with_vat(price) = price * (1 + vat)with_vat(£50) dà £60.00vat = 5%with_vat(£50) dà £52.50La variabile deve già esistere quando definisci la funzione, quindi metti vat = 20% sopra with_vat. Se non esiste ancora, la riga di definizione mostra un errore.
I parametri sono locali alla funzione. Un parametro chiamato price non legge o cambia una variabile chiamata price altrove nella nota:
price = £10double(price) = price * 2double(£3) dà £6.00price dà £10.00Come le variabili, una funzione definita in un blocco di calcolo può essere usata nei blocchi successivi della stessa nota. Varlig elabora la nota dall’alto verso il basso: definisci quindi la funzione prima della prima chiamata. Una chiamata precedente alla definizione non mostra alcun risultato.
Funzioni che chiamano altre funzioni
Puoi combinare piccole funzioni che si richiamano a vicenda:
day_rate = £400fee(days) = days * day_rateinvoice(days) = fee(days) * 1.2invoice(5) dà £2,400.00Una funzione ricorda la versione della funzione ausiliaria esistente al momento della definizione. Se ridefinisci la funzione ausiliaria più avanti nella nota, le funzioni definite prima continuano a usare la versione precedente:
shipping(order) = £4.95total(order) = order + shipping(order)shipping(order) = £2.95total(£30) dà £34.95shipping(£30) dà £2.95Per usare la nuova versione di shipping, definisci nuovamente total sotto di essa. Modificare direttamente la definizione originale non crea questo problema: Varlig ricalcola la nota dall’inizio e tutte le righe successive usano la versione modificata.
Una funzione può anche chiamare una funzione ausiliaria definita più avanti. In questo caso usa la versione disponibile al momento della chiamata: la funzione ausiliaria deve quindi esistere quando chiami quella esterna.
checkout(order) = order + delivery(order)delivery(order) = if order >= £40 then £0 else £3.50checkout(£25) dà £28.50checkout(£60) dà £60.00Condizioni
Usa if … then … else … per scegliere tra i risultati. Concatena un altro if dopo else per più di due casi:
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20postage(90 g) dà £0.85postage(500 g) dà £1.55postage(1.2 kg) dà £3.20Viene calcolato solo il ramo selezionato dalla condizione. Puoi così evitare un’operazione che altrimenti fallirebbe, come una divisione per zero:
per_person(total, people) = if people > 0 then total / people else £0per_person(£90, 3) dà £30.00per_person(£90, 0) dà £0.00Ricorsività
Una funzione può chiamare se stessa, purché una condizione finisca per interrompere la ricorsione. Questa conta le strette di mano quando ogni persona del gruppo stringe una volta la mano a ciascuna delle altre:
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)handshakes(6) dà 15handshakes(10) dà 45Ogni chiamata aggiunge un livello di annidamento; sono ammessi al massimo 12 livelli. handshakes(12) funziona, ma handshakes(13) mostra Error: calculation limit. Una funzione che non raggiunge mai la condizione di arresto viene accettata nella definizione, ma incontra lo stesso limite quando viene chiamata. Anche due funzioni possono chiamarsi reciprocamente, entro questo limite.
Per i conteggi comuni, le funzioni integrate sono più rapide e non hanno questo limite. Anche combination(10, 2) restituisce 45; factorial(n) o n! calcolano il classico esempio ricorsivo del fattoriale.
Elenchi, matrici e altro
Gli argomenti possono essere liste, matrici o numeri complessi e il corpo della funzione può usare qualsiasi funzione integrata:
spread(scores) = max(scores) - min(scores)spread([12, 18, 9, 21]) dà 12Il corpo della funzione può contenere anche una sommatoria o un risolutore di equazioni con una variabile locale propria. Vedi Liste e statistiche e Sommatorie, equazioni e analisi matematica.
Insidie
- Scrivi le potenze con
^.x²non è accettato dentro una funzione. Inoltre, un nome di parametro breve può coincidere con un’unità: inw / h²,h²indica ore al quadrato, non il parametroh. Scriviw / h^2. - Controlla il numero di argomenti. Chiamare
tip($48)quando la funzione richiede due valori genera un errore. - Un prezzo senza unità viene interpretato come prezzo unitario. In
oats(amount) = amount / 1 kg * £0.95, £0,95 è un prezzo al chilogrammo. Ogni chiamata lo segnala: passando il puntatore compare una spiegazione che invita a scrivere esplicitamente £0.95/kg nella funzione oats. Specificando il prezzo unitario nella definizione, l’avviso scompare. - Una riga, una formula. Una definizione è una singola espressione su una riga. Per un calcolo con più passaggi, definisci una piccola funzione per ogni passaggio e combinale.
- Una ridefinizione errata conserva la versione precedente. Se una nuova definizione di
tipcontiene un errore, la riga lo segnala e la precedente versione funzionante ditiprimane disponibile. - I risultati possono cambiare quando la nota viene ricalcolata. Le chiamate vengono eseguite di nuovo ogni volta: una funzione che usa
randomo la data odierna può quindi dare un risultato diverso. - Gli errori vengono propagati. Se un argomento fa fallire la formula, per esempio causando una divisione per zero, la chiamata mostra quell’errore.
Limiti
| Che cosa | Limite |
|---|---|
| Parametri per funzione | 32 |
| Chiamate annidate (una funzione che chiama se stessa o un'altra) | 12 |
| Chiamate eseguite per valutare una chiamata al livello principale | 16,384 |
| Funzioni definite in una nota | 1,024 |
Quando viene raggiunto un limite, compare Error: calculation limit. Il resto della nota continua a funzionare. L’elenco completo è in Errori, diagnostica e limiti.
Un esempio completo
Ecco una fattura per un’attività freelance. Tariffa e IVA sono definite all’inizio come valori con un nome; tre piccole funzioni eseguono i calcoli:
# 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) dà £3,600.00build = fee(4.5) dà £2,025.00subtotal = design + build dà £5,625.00with_vat(subtotal) dà £6,750.00late_fee(with_vat(subtotal), 45) dà £135.00Modificando day_rate o vat si aggiornano tutte le righe successive. Se il cliente paga in ritardo, basta una chiamata per aggiungere la penale.