Συναρτήσεις
def, παράμετροι και return: κώδικας που γράφεται μία φορά.
40 λεπτά
Θα μάθεις να
- Να ορίζεις συναρτήσεις με def, παραμέτρους και return, και να τις καλείς με ορίσματα.
- Να ξεχωρίζεις το return από το print και να εξηγείς από πού βγαίνει το None.
- Να εξηγείς ότι οι μεταβλητές μιας συνάρτησης είναι τοπικές.
- Να χωρίζεις ένα πρόβλημα σε μικρές συναρτήσεις που γράφονται μία φορά και χρησιμοποιούνται πολλές.
Συναρτήσεις που ήδη ξέρεις
Από το πρώτο μάθημα χρησιμοποιείς συναρτήσεις χωρίς να το λες: print, input, int, len, round. Καθεμιά κάνει μια συγκεκριμένη δουλειά, και δεν χρειάζεται να ξέρεις πώς την κάνει. Γράφεις len(vathmoi) και παίρνεις το πλήθος.
Μια συνάρτηση (function) είναι ένα κομμάτι κώδικα με όνομα, που γράφεται μία φορά και καλείται όσες φορές θέλεις. Σε αυτό το μάθημα φτιάχνεις τις δικές σου. Στο Scratch υπήρχε κάτι παρόμοιο: τα δικά σου πλακίδια (My Blocks), που τα έφτιαχνες μία φορά και τα έβαζες όπου ήθελες.
Ορισμός με def
def chaireta(onoma):
print("Γεια σου,", onoma)
chaireta("Μαρία")
chaireta("Κώστα")
Γεια σου, Μαρία
Γεια σου, Κώστα
Η πρώτη γραμμή είναι η κεφαλίδα: η λέξη def (define, όρισε), το όνομα, και μέσα σε παρενθέσεις οι παράμετροι, εδώ μία, η onoma. Τελειώνει με :, και από κάτω, με εσοχή, το σώμα της συνάρτησης.
Ο ορισμός μόνος του δεν εκτελεί τίποτα. Απλώς λέει στην Python «όταν σου ζητήσω chaireta, κάνε αυτό». Ο κώδικας τρέχει όταν η συνάρτηση κληθεί: chaireta("Μαρία"). Η τιμή "Μαρία" που δίνεις στην κλήση λέγεται όρισμα και μπαίνει στην παράμετρο onoma.
Γι' αυτό ο ορισμός γράφεται πριν από την πρώτη κλήση. Αν καλέσεις μια συνάρτηση πιο πάνω από τον ορισμό της, η Python δεν την ξέρει ακόμη και σταματά με NameError.
Η συνάρτηση επιστρέφει τιμή: return
Η chaireta κάνει κάτι: τυπώνει. Οι πιο χρήσιμες συναρτήσεις όμως υπολογίζουν κάτι και το δίνουν πίσω σε όποιον τις κάλεσε, όπως η len. Αυτό γίνεται με το return.
def emvado(platos, mikos):
return platos * mikos
a = emvado(4, 5)
print(a)
print(emvado(3, 7) + emvado(2, 2))
20
25
Η κλήση emvado(4, 5) «αντικαθίσταται» από την τιμή που επιστρέφει, το 20. Γι' αυτό μπορείς να την αποθηκεύσεις σε μεταβλητή ή να τη χρησιμοποιήσεις μέσα σε μια πράξη, όπως στη δεύτερη print: .
Με δύο παραμέτρους, τα ορίσματα αντιστοιχίζονται με τη σειρά: το πρώτο όρισμα στην πρώτη παράμετρο, το δεύτερο στη δεύτερη.
Μόλις εκτελεστεί ένα return, η συνάρτηση τελειώνει αμέσως. Ό,τι γράφεται μετά από αυτό, μέσα στον ίδιο κλάδο, δεν εκτελείται ποτέ.
Συναρτήσεις που απαντούν ναι ή όχι
Μια συνάρτηση μπορεί να επιστρέψει True ή False. Τότε η κλήση της μπαίνει κατευθείαν σε ένα if:
def einai_artios(n):
return n % 2 == 0
print(einai_artios(10), einai_artios(7))
True False
Το n % 2 == 0 είναι ήδη True ή False, οπότε δεν χρειάζεται if μέσα στη συνάρτηση. Μετά γράφεις if einai_artios(x): και ο κώδικας διαβάζεται σχεδόν σαν ελληνικά.
Συναρτήσεις με λίστες
Ο αλγόριθμος για το μέγιστο από το προηγούμενο μάθημα γίνεται συνάρτηση που δουλεύει για οποιαδήποτε λίστα:
def megisto(lista):
m = lista[0]
for x in lista:
if x > m:
m = x
return m
print(megisto([14, 17, 21, 19, 23, 18]), megisto([-5, -2, -8]))
23 -2
Το return m είναι έξω από τον βρόχο, στην εσοχή του σώματος της συνάρτησης. Αν ήταν μέσα στον βρόχο, η συνάρτηση θα επέστρεφε ήδη στην πρώτη επανάληψη.
Τοπικές μεταβλητές
Οι παράμετροι και οι μεταβλητές που δημιουργούνται μέσα σε μια συνάρτηση είναι τοπικές (local): υπάρχουν μόνο όσο τρέχει η συνάρτηση και δεν φαίνονται απ' έξω.
def f(x):
y = x + 1
return y
print(f(3))
print(y)
Η πρώτη print τυπώνει 4. Η δεύτερη σταματά το πρόγραμμα με NameError: name 'y' is not defined: το y ζούσε μόνο μέσα στην f.
Αυτό είναι πλεονέκτημα, όχι περιορισμός. Μπορείς να γράψεις μια συνάρτηση με μια μεταβλητή m χωρίς να ανησυχείς αν κάποιο άλλο κομμάτι του προγράμματος χρησιμοποιεί κι αυτό ένα m.
Λυμένα παραδείγματα
Παράδειγμα 1
Γράψε συνάρτηση telikh_timh που παίρνει την τιμή ενός προϊόντος και το ποσοστό έκπτωσης και επιστρέφει την τιμή μετά την έκπτωση. Τι επιστρέφει για 80 ευρώ με έκπτωση 25%;
Δοκίμασέ το πρώτα. Μετά δες τη λύση.
Παράδειγμα 2
Δύο συναρτήσεις διπλασιάζουν έναν αριθμό: η diplasio_print τυπώνει x * 2, η diplasio επιστρέφει x * 2. Τι τυπώνει ο κώδικας apotelesma = diplasio_print(5) και μετά print(apotelesma); Και τι τυπώνει η print(diplasio(5) + 1);
Δοκίμασέ το πρώτα. Μετά δες τη λύση.
Ασκήσεις
Πρώτα ερωτήσεις με επιλογές: διαλέγεις, πατάς «Έλεγξε» και μαθαίνεις αμέσως αν το βρήκες και γιατί. Στο τέλος, λίγες ασκήσεις χωρίς επιλογές — εκεί κρύβεται μόνο η απάντηση.
Τα κατάφερες;
- Να ορίζεις συναρτήσεις με def, παραμέτρους και return, και να τις καλείς με ορίσματα.
- Να ξεχωρίζεις το return από το print και να εξηγείς από πού βγαίνει το None.
- Να εξηγείς ότι οι μεταβλητές μιας συνάρτησης είναι τοπικές.
- Να χωρίζεις ένα πρόβλημα σε μικρές συναρτήσεις που γράφονται μία φορά και χρησιμοποιούνται πολλές.
Λύσε τις ασκήσεις πιο πάνω και θα δεις εδώ πού στέκεσαι.