ΕΙΣΑΓΩΓΗ
Στο σημερινό μάθημα θα συνεχίσουμε την ενασχόλησή μας με τις συναρτήσεις (functions), εμβαθύνοντας σε πιο προχωρημένες έννοιες. Συγκεκριμένα, θα αναλύσουμε:
- Τη δήλωση
return: Πώς επιστρέφουμε δεδομένα και αποτελέσματα από μια συνάρτηση. - Τις παραμέτρους
*argsκαι**kwargs: Πώς διαχειριζόμαστε δυναμικά έναν μεταβλητό αριθμό ορισμάτων. - Συναρτήσεις ως ορίσματα (Callbacks): Το πώς περνάμε μια συνάρτηση σαν παράμετρο μέσα σε μια άλλη συνάρτηση.
Πώς Επιστρέφουμε Τιμές (How to Return Values)
Μέχρι τώρα, όλες οι συναρτήσεις (functions) που έχουμε γράψει χρησιμοποιούν απλώς την ενσωματωμένη συνάρτηση print() για να εμφανίσουν κάποιο αποτέλεσμα στο τερματικό (terminal).
Για παράδειγμα, αν θέλαμε να δούμε το αποτέλεσμα της πρόσθεσης δύο αριθμών, θα γράφαμε τον εξής κώδικα:
app.pyOutput
Πολλές φορές, όμως, επιθυμούμε η συνάρτηση (function), αφού εκτελέσει μια διεργασία, να μας επιστρέψει το τελικό αποτέλεσμα, ώστε να μπορέσουμε να το αποθηκεύσουμε σε κάποια μεταβλητή (variable).
Με τον τρόπο που γράφαμε τις συναρτήσεις μέχρι τώρα, αυτό δεν ήταν εφικτό. Η print() απλώς εμφανίζει κάτι στην οθόνη, δεν επιστρέφει δεδομένα πίσω στο πρόγραμμα. Για να μπορέσουμε να το πετύχουμε αυτό, πρέπει να χρησιμοποιήσουμε την εντολή return μέσα στο σώμα της συνάρτησης.
Δείτε πώς διαμορφώνεται το προηγούμενο παράδειγμά μας:
App.py
Output
Ας δούμε ένα ακόμα παράδειγμα το οποίο προσομοιώνει το στρίψιμο ενός νομίσματος (κορώνα ή γράμματα). Σε αυτό το παράδειγμα, θα εισαγάγουμε μια απλή λογική ελέγχου χρησιμοποιώντας if-else statements, ώστε να δείτε πώς μπορούμε να συνδυάσουμε τις δομές ελέγχου ροής (flow control statements) με την εντολή return.
App.py
Output
Χρήση Λίστας και Συνάρτησης ως Παραμέτρους (Using Lists and Functions as Parameters)
Στο προηγούμενο δωρεάν μάθημα Python (parameters) σε μια συνάρτηση (function).
Εκτός από κείμενο (strings) και αριθμούς, μπορούμε να περάσουμε και άλλους τύπους δεδομένων ως παραμέτρους, όπως λίστες (lists), λεξικά (dictionaries), ακόμα και άλλες συναρτήσεις!
Ας δούμε ένα παράδειγμα για το πώς περνάμε μια λίστα (list) ως παράμετρο σε μια συνάρτηση:
App.py
Output
Τώρα, ας δούμε ένα πολύ απλό παράδειγμα για το πώς μπορούμε να περάσουμε μια συνάρτηση (function) ως παράμετρο (parameter) μέσα σε μια άλλη συνάρτηση.
App.py
Output
Προβλήματα με την Εμβέλεια Μεταβλητών (Problems with Variable Scope)
Μέσα από μια συνάρτηση (function) δεν μπορούμε να τροποποιήσουμε απευθείας την τιμή μιας καθολικής μεταβλητής (global variable).
Μπορούμε, φυσικά, να τη χρησιμοποιήσουμε (για παράδειγμα, να δείξουμε την τιμή της μέσα από μια print()), αλλά δεν μπορούμε να της αναθέσουμε μια καινούργια τιμή με απλό τρόπο. Αν το προσπαθήσουμε, η Python είτε θα δημιουργήσει μια νέα, δική της τοπική μεταβλητή (local variable), είτε θα "πετάξει" σφάλμα.
Το παρακάτω παράδειγμα αναδεικνύει ακριβώς αυτό το πρόβλημα:
App.py
Output
Όπως καταλαβαίνετε και από το μήνυμα σφάλματος που εμφανίζεται, η Python προσπαθεί να βρει μια μεταβλητή με το όνομα sum μέσα στη συνάρτηση (function). Επειδή δεν γνωρίζει ότι η πρόθεσή μας είναι να αναφερθούμε στην καθολική (global) μεταβλητή, σταματάει την εκτέλεση του προγράμματος και μας εμφανίζει το λάθος που μόλις είδαμε.
Αν τώρα θέλουμε πραγματικά να μη δηλώσουμε μια νέα τοπική (local) μεταβλητή μέσα στη συνάρτηση, αλλά να τροποποιήσουμε την global μεταβλητή που έχει ήδη οριστεί απ' έξω, τότε πρέπει να ενημερώσουμε τη συνάρτηση για αυτή μας την πρόθεση. Αυτό το πετυχαίνουμε χρησιμοποιώντας τη λέξη-κλειδί global.
Ας δούμε πώς λύνεται το πρόβλημα:
App.py
Output
Προσθήκη Docstrings στις Συναρτήσεις μας (Adding Docstrings to Our Functions)
Όταν μιλούσαμε στα πρώτα μας δωρεάν μαθήματα Python για το πώς ορίζουμε αλφαριθμητικά (strings), είχαμε αναφερθεί στα μονά εισαγωγικά (' '), στα διπλά εισαγωγικά (" ") και στα τριπλά εισαγωγικά (""" """).
Τα τριπλά εισαγωγικά, αν χρησιμοποιηθούν αμέσως μετά την πρώτη γραμμή μιας συνάρτησης (function), χρησιμεύουν στο να δημιουργήσουμε τεκμηρίωση (documentation) για τη λειτουργία της.
Αυτό είναι εξαιρετικά χρήσιμο! Είτε την ώρα που καλείτε τη συνάρτηση σε κάποιο άλλο σημείο του κώδικα, είτε αν απλώς αφήσετε τον κέρσορα (cursor) του ποντικιού σας πάνω από το όνομά της, το πρόγραμμά σας θα εμφανίσει ένα αναδυόμενο παράθυρο με το κείμενο του docstring που έχετε γράψει.
Ας δούμε ένα παράδειγμα:
Η Παράμετρος *args (The *args Parameter)
Μέχρι τώρα έχουμε δει παραδείγματα με συναρτήσεις (functions) που δέχονται έναν συγκεκριμένο αριθμό παραμέτρων. Αν όμως θέλαμε να περάσουμε σε μια συνάρτηση έναν μεταβλητό (άγνωστο εκ των προτέρων) αριθμό παραμέτρων, τότε θα πρέπει να χρησιμοποιήσουμε το *args.
Αυτό που στην ουσία μάς δίνει τη δυνατότητα να περάσουμε πολλαπλά ορίσματα δεν είναι η λέξη "args", αλλά το σύμβολο του αστερίσκου (*). Αντί για args θα μπορούσαμε να χρησιμοποιήσουμε οποιαδήποτε άλλη λέξη θέλουμε (π.χ. *numbers). Απλώς, έχει καθιερωθεί παγκοσμίως ανάμεσα στους προγραμματιστές να γράφουν *args (από τη λέξη arguments).
Ας δούμε πώς μπορούμε να χρησιμοποιήσουμε το *args στην πράξη, καθώς υπάρχουν κάποιες ακόμα μικρές λεπτομέρειες στις οποίες πρέπει να αναφερθούμε:
App.py
Output
Παρατηρώντας το αποτέλεσμα, μπορούμε να βγάλουμε τα εξής πολύ σημαντικά συμπεράσματα:
- Σειρά παραμέτρων: Όταν χρησιμοποιούμε το
*argsσε συνδυασμό με άλλες, κανονικές παραμέτρους, το*argsθα πρέπει να μπαίνει τελευταίο στη λίστα των παραμέτρων κατά τον ορισμό της συνάρτησης (function). - Τύπος δεδομένων: Αν ελέγξετε τον τύπο (
type) τουargs, θα διαπιστώσετε ότι η Python το μετατρέπει αυτόματα σε πλειάδα (tuple). Ο λόγος που δεν βλέπουμε την "Barcelona" σε αυτό τοtupleκατά την εκτύπωση στο αποτέλεσμα (output), είναι επειδή η συγκεκριμένη λέξη περάστηκε ως τιμή στην κανονική παράμετροname, και όχι στοargs. - Χρήση χωρίς αστερίσκο: Η τρίτη και τελευταία παρατήρηση είναι ότι, όταν καλούμε το
argsμέσα στο σώμα της συνάρτησης (όπως για παράδειγμα σε μια λούπαfor), χρησιμοποιούμε μόνο το όνομα της μεταβλητής χωρίς τον αστερίσκο (γράφουμεargsκαι όχι*args).
Ίσως το παρακάτω παράδειγμα με αριθμούς σας δώσει μια ακόμα καλύτερη εικόνα για τις δυνατότητες του *args:
App.py
Output
Η Παράμετρος kwargs (The kwargs Parameter)
Εκτός από το *args, πολλές φορές θα συναντήσετε και το kwargs (από τις λέξεις keyword arguments) να χρησιμοποιείται στον κώδικα της Python.
Το kwargs λειτουργεί ακριβώς με την ίδια λογική όπως το *args, με τη διαφορά ότι αντί να περνάμε μόνο τις τιμές, περνάμε μαζί και τα ονόματα των παραμέτρων.
Η Python αποθηκεύει αυτά τα δεδομένα ως λεξικό (dictionary). Πρόκειται, δηλαδή, για έναν συνδυασμό από ζεύγη κλειδιού (key) και τιμής (value). Στη συνέχεια, μέσα στη συνάρτηση, μπορούμε να χρησιμοποιήσουμε το όνομα του κλειδιού για να αποκτήσουμε πρόσβαση στην αντίστοιχη τιμή του.
Ας δούμε ένα παράδειγμα για να γίνει απόλυτα κατανοητό:
App.py
Output
Αν βρήκατε αυτό το μάθημα χρήσιμο, μην ξεχάσετε να κάνετε μια μικρή δωρεά (donation). Η υποστήριξή σας είναι εξαιρετικά πολύτιμη, καθώς βοηθά αυτόν τον ιστότοπο (site) να μεγαλώσει ακόμα περισσότερο και μας δίνει τη δυνατότητα να αναπτύξουμε νέες υποδομές για την online παράδοση δωρεάν μαθημάτων!
full-width


0 Comments
What do you think about Ground of Code?