Συναρτήσεις: ένα όνομα για κάθε υπολογισμό

Ένα e-shop κάνει 20% έκπτωση σε όλα τα προϊόντα και θέλει να τυπώνει τις νέες τιμές. Ο πρώτος κώδικας που γράφει κανείς για τρία προϊόντα είναι αυτός:
python
laptop = 800
headphones = 60
mouse = 25

print("Laptop:", laptop - laptop * 20 / 100)
print("Ακουστικά:", headphones - headphones * 20 / 100)
print("Ποντίκι:", mouse - mouse * 20 / 100)
Ο ίδιος υπολογισμός είναι γραμμένος τρεις φορές. Όταν η έκπτωση γίνει 25%, αλλάζεις τρία σημεία. Αν σε μία γραμμή γράψεις κατά λάθος headphones - mouse * 20 / 100, το πρόγραμμα θα τρέξει κανονικά και θα τυπώσει μια λάθος τιμή. Και με 200 προϊόντα ο κανόνας της έκπτωσης θα ήταν γραμμένος 200 φορές.
Θέλεις να δώσεις όνομα στον ίδιο τον υπολογισμό, όπως δίνεις όνομα σε μια τιμή με μια μεταβλητή.

Μια συνάρτηση δίνει όνομα σε έναν υπολογισμό

python
Οι δύο πρώτες γραμμές φτιάχνουν μια συνάρτηση με όνομα discounted. Το print και το int είναι κι αυτά συναρτήσεις, έτοιμες από την Python. Τη discounted τη γράφεις εσύ:
  • Το def λέει στην Python ότι ακολουθεί ορισμός συνάρτησης. Μετά έρχεται το όνομα και, σε παρένθεση, η παράμετρος price: μια μεταβλητή που θα πάρει τιμή τη στιγμή που θα χρησιμοποιήσεις τη συνάρτηση. Η γραμμή τελειώνει με :, όπως το if και το while.
  • Οι γραμμές με εσοχή είναι το σώμα της συνάρτησης. Εδώ είναι μόνο μία.
  • Το return επιστρέφει την τιμή που έχει δίπλα του στο σημείο από όπου κάλεσες τη συνάρτηση.
Όταν γράφεις discounted(800), καλείς τη συνάρτηση: η Python βάζει το 800 στο price, τρέχει το σώμα και στη θέση του discounted(800) μπαίνει η τιμή που επιστρέφει, το 640.0. Εκεί το print την τυπώνει.
Τρέξε το και μετά κάνε την έκπτωση 25%. Αλλάζεις ένα σημείο, στη γραμμή του return, και αλλάζουν και οι τρεις τιμές.

Το return και το print

Η παρακάτω συνάρτηση δεν έχει return, έχει print:
Πρόβλεψε
def double(n):
    print(n * 2)

result = double(5)
print(result)

Τι θα εμφανιστεί στην οθόνη;

Διάλεξε μία

Στην οθόνη τα δύο μοιάζουν, γι' αυτό τα μπερδεύεις εύκολα. Το print γράφει χαρακτήρες για να τους διαβάσεις εσύ και το πρόγραμμα δεν τους κρατάει. Το return δίνει την τιμή πίσω στη γραμμή που κάλεσε τη συνάρτηση και εκεί μπορείς να την αποθηκεύσεις σε μεταβλητή, να την προσθέσεις σε κάτι ή να τη δώσεις σε άλλη συνάρτηση. Όταν η συνάρτηση δεν έχει return, επιστρέφει None, μια ειδική τιμή που σημαίνει «καμία τιμή».

Δύο παράμετροι και μία κλήση βήμα βήμα

Αν κάθε προϊόν έχει δική του έκπτωση, το ποσοστό γίνεται δεύτερη παράμετρος. Οι παράμετροι χωρίζονται με κόμμα και οι τιμές που δίνεις στην κλήση, τα ορίσματα, μπαίνουν σε αυτές με τη σειρά: το πρώτο στην πρώτη, το δεύτερο στη δεύτερη.
Από τα ορίσματα στην τιμή που επιστρέφει Τα ορίσματα 50 και 10 μπαίνουν στη συνάρτηση discounted, όπου γίνονται price = 50 και percent = 10 και υπολογίζεται final = 45.0. Η συνάρτηση επιστρέφει την τιμή 45.0, που καταλήγει στη γραμμή της κλήσης ως shoes = 45.0. ΟΡΙΣΜΑΤΑ ΣΥΝΑΡΤΗΣΗ ΕΠΙΣΤΡΕΦΕΙ ΑΠΟΤΕΛΕΣΜΑ 50 10 discounted price = 50 percent = 10 final = 45.0 45.0 shoes = 45.0 Τα ορίσματα μπαίνουν στις παραμέτρους, το return στέλνει πίσω μία τιμή.
Πάρε ένα ζευγάρι παπούτσια 50 ευρώ και μια τσάντα 30 ευρώ, και τα δύο με 10% έκπτωση. Πρόσεξε τη σειρά: όταν καλείς τη συνάρτηση, η Python πηγαίνει στο σώμα της και μετά πηγαίνει ξανά στη γραμμή της κλήσης.
Βήμα προς βήμα
Βήμα 1 από 10
def discounted(price, percent):
final = price - price * percent / 100
return final
shoes = discounted(50, 10)
bag = discounted(30, 10)
print(shoes + bag)
Μεταβλητές

Καμία μεταβλητή ακόμα.

Το def μόνο αποθηκεύει τη συνάρτηση με το όνομα discounted. Το σώμα της δεν τρέχει ακόμα, οπότε η Python πηγαίνει κατευθείαν στη γραμμή 4.

Οι δύο κλήσεις, σαν ανταλλαγή ανάμεσα στο πρόγραμμα και στη συνάρτηση:
Δύο κλήσεις της discounted Διάγραμμα ακολουθίας με δύο συμμετέχοντες, το κύριο πρόγραμμα και τη συνάρτηση discounted. Το πρόγραμμα καλεί discounted(50, 10), η συνάρτηση υπολογίζει final = 45.0 και επιστρέφει 45.0, που γίνεται shoes. Μετά καλεί discounted(30, 10), η συνάρτηση υπολογίζει final = 27.0 και επιστρέφει 27.0, που γίνεται bag. Στο τέλος το print(shoes + bag) τυπώνει 72.0. discounted(50, 10) final = 45.0 return 45.0 shoes = 45.0 discounted(30, 10) final = 27.0 return 27.0 bag = 27.0 print(shoes + bag): 72.0 Κύριο πρόγραμμα discounted
Τα price, percent και final είναι τοπικές μεταβλητές: υπάρχουν μόνο όσο τρέχει η κλήση. Αν γράψεις print(final) μετά την κλήση, στο κύριο πρόγραμμα, παίρνεις NameError: name 'final' is not defined. Ό,τι θέλεις να βγει από τη συνάρτηση, το βγάζεις με το return.
Σε αυτό το καλάθι η συνάρτηση έχει print αντί για return. Τρέξε το:
python
Τυπώνει 45.0 και 27.0 και μετά κρασάρει με TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'. Και οι δύο κλήσεις επέστρεψαν None και η Python δεν μπορεί να προσθέσει δύο None. Άλλαξε το print(...) της συνάρτησης σε return ... και τρέξε ξανά. Πρέπει να δεις μόνο Σύνολο: 72.0.

Μια συνάρτηση για τον μέσο όρο

Μια συνάρτηση μπορεί να έχει ολόκληρο loop στο σώμα της. Με τον μέσο όρο σε συνάρτηση, τον υπολογίζεις για όποια λίστα βαθμών θέλεις με μία γραμμή:
python
Γράψε από κάτω μια δεύτερη συνάρτηση, passed(grades), που επιστρέφει True αν ο μέσος όρος είναι τουλάχιστον 10 και False αλλιώς. Στο σώμα της κάλεσε την average, δε χρειάζεται να ξαναγράψεις το loop. Δοκίμασέ τη με print(passed([17, 14])), που πρέπει να τυπώσει True, και με print(passed([9, 11, 8])), που πρέπει να τυπώσει False.

Το ίδιο σε ψευδοκώδικα

Στη ΓΛΩΣΣΑ η συνάρτηση είναι ένα από τα δύο είδη υποπρογράμματος. Το καλάθι με τα παπούτσια και την τσάντα:
ΓΛΩΣΣΑ
ΠΡΟΓΡΑΜΜΑ ΚΑΛΑΘΙ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ΠΑΠΟΥΤΣΙΑ, ΤΣΑΝΤΑ
ΑΡΧΗ
  ΠΑΠΟΥΤΣΙΑ ← ΜΕ_ΕΚΠΤΩΣΗ(50, 10)
  ΤΣΑΝΤΑ ← ΜΕ_ΕΚΠΤΩΣΗ(30, 10)
  ΓΡΑΨΕ ΠΑΠΟΥΤΣΙΑ + ΤΣΑΝΤΑ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΣΥΝΑΡΤΗΣΗ ΜΕ_ΕΚΠΤΩΣΗ(ΤΙΜΗ, ΠΟΣΟΣΤΟ): ΠΡΑΓΜΑΤΙΚΗ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ΤΙΜΗ, ΠΟΣΟΣΤΟ
ΑΡΧΗ
  ΜΕ_ΕΚΠΤΩΣΗ ← ΤΙΜΗ - ΤΙΜΗ * ΠΟΣΟΣΤΟ / 100
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ
Τη συνάρτηση τη γράφεις μετά το ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ και έχει δικό της τμήμα ΜΕΤΑΒΛΗΤΕΣ, ενώ στην Python το def πρέπει να έχει τρέξει πριν από την πρώτη κλήση. Δίπλα στο όνομα δηλώνεις τον τύπο της τιμής που επιστρέφει, εδώ ΠΡΑΓΜΑΤΙΚΗ. Δεν υπάρχει return: το αποτέλεσμα το εκχωρείς στο όνομα της συνάρτησης, ΜΕ_ΕΚΠΤΩΣΗ ← .... Στο σχολικό βιβλίο οι παράμετροι του ορισμού λέγονται τυπικές και οι τιμές της κλήσης πραγματικές παράμετροι. Το άλλο είδος, η ΔΙΑΔΙΚΑΣΙΑ, δεν επιστρέφει τιμή και την καλείς με την εντολή ΚΑΛΕΣΕ ΟΝΟΜΑ(...). Μοιάζει με συνάρτηση της Python χωρίς return, με τη διαφορά ότι μπορεί να αλλάζει τις τιμές των παραμέτρων της.

Σύνοψη

  • Μια συνάρτηση δίνει όνομα σε έναν υπολογισμό. Τον γράφεις μία φορά με def και τον χρησιμοποιείς όσες φορές θέλεις, οπότε μια αλλαγή γίνεται σε ένα σημείο.
  • Οι παράμετροι είναι μεταβλητές της συνάρτησης. Στην κλήση, τα ορίσματα μπαίνουν σε αυτές με τη σειρά.
  • Το def μόνο αποθηκεύει τη συνάρτηση. Το σώμα της τρέχει όταν την καλείς και μετά η Python συνεχίζει από τη γραμμή της κλήσης.
  • Το return δίνει μια τιμή πίσω στο πρόγραμμα. Το print μόνο τη δείχνει στην οθόνη. Μια συνάρτηση χωρίς return επιστρέφει None.
  • Οι μεταβλητές που φτιάχνει μια συνάρτηση είναι τοπικές και χάνονται όταν τελειώσει η κλήση.
  • Στη ΓΛΩΣΣΑ η ΣΥΝΑΡΤΗΣΗ δηλώνει τον τύπο που επιστρέφει και παίρνει το αποτέλεσμα με εκχώρηση στο όνομά της. Η ΔΙΑΔΙΚΑΣΙΑ δεν επιστρέφει τιμή και την καλείς με ΚΑΛΕΣΕ.

Θες να συνεχίσεις;

Το course είναι δωρεάν. Κάνε σύνδεση για να κρατάς την πρόοδο και τις σημειώσεις σου.