Εισαγωγή
Python είναι μία από τις πιο δημοφιλείς γλώσσες προγραμματισμού παγκοσμίως. Στην Python, οι παράμετροι αποτελούν μέρος των ορισμών συναρτήσεων. Σας επιτρέπουν να καθορίσετε ορισμένα ορίσματα για μια συνάρτηση. Το όρισμα μπορεί να γίνει αποδεκτό και να εφαρμοστεί από τη συνάρτηση.
Ωστόσο, δεν είναι δυνατόν να γνωρίζετε κατά τη στιγμή της συγγραφής του κώδικα ποιες ακριβώς περιπτώσεις χρήσης ενδέχεται να υλοποιηθούν με τον κώδικά σας. Ως εκ τούτου, για χάρη των μελλοντικών προγραμματιστών και χρηστών του προγράμματός σας, συνιστάται να μεταβιβάζετε έναν μεταβλητό αριθμό ορισμάτων σε μια συνάρτηση. Για να το κάνετε αυτό, πρέπει να χρησιμοποιήσετε ειδικές παραμέτρους. Αυτές είναι *args και **kwargs. Σε αυτόν τον οδηγό, θα μάθουμε τα πάντα για τις παραμέτρους *args και **kwargs στην Python. Θα μάθουμε επίσης πώς να ταξινομούμε τα ορίσματα και πώς να τα εφαρμόζουμε σε κλήσεις συναρτήσεων.
Προαπαιτούμενα
Για να μπορέσετε να ακολουθήσετε τα βήματα του οδηγού, υπάρχουν ορισμένα προαπαιτούμενα που πρέπει να προετοιμάσετε. Αρχικά, πρέπει να έχετε εγκατεστημένη την Python 3 στον διακομιστή σας με ένα περιβάλλον προγραμματισμού σε λειτουργία. Πρέπει επίσης να έχετε εγκατεστημένο το πρόγραμμα για το συγκεκριμένο λειτουργικό σας σύστημα (Ubuntu, CentOS, Debian, κ.λπ.).
Τι είναι το *args και πώς λειτουργεί;
Ας ξεκινήσουμε κατανοώντας πώς λειτουργεί το *args λειτουργεί. Η έκδοση της παραμέτρου με ένα μόνο αστερίσκο χρησιμοποιείται για την αποστολή λιστών ορισμάτων μεταβλητού μήκους χωρίς λέξεις-κλειδιά σε συναρτήσεις. Έχετε υπόψη σας ότι ο αστερίσκος είναι το πιο κρίσιμο στοιχείο σε αυτήν την παράμετρο.
Για να κατανοήσετε καλύτερα, ας δούμε ένα παράδειγμα. Ακολουθεί μια τυπική συνάρτηση που μπορεί να βρείτε στον κώδικά σας, η οποία χρησιμοποιεί δύο ορίσματα:
|
1 2 |
def multiply(x, y): print (x * y) |
Όπως μπορείτε να δείτε, τα ορίσματά μας στην παραπάνω συνάρτηση είναι x και y. Κατά την κλήση της συνάρτησης, θα χρησιμοποιήσετε αριθμούς που αντιστοιχούν στα x και y. Ας υποθέσουμε ότι μεταβιβάζουμε τους ακέραιους αριθμούς 5 και 4 για τα x και y αντίστοιχα:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
Τώρα μπορούμε να εκτελέσουμε τον κώδικα:
|
1 |
python lets_multiply.py |
Το αποτέλεσμα που θα λάβουμε θα είναι το εξής:
|
1 2 3 |
Έξοδος: 20 |
Το αποτέλεσμα δείχνει ότι οι ακέραιοι 5 και 4 έχουν πολλαπλασιαστεί. Αυτό σημαίνει ότι η συνάρτηση multiply(x, y) λειτούργησε.
Τώρα, ας υποθέσουμε ότι θέλουμε τελικά να πολλαπλασιάσουμε τρεις αριθμούς αντί για δύο. Δυστυχώς, η προσθήκη ενός επιπλέον αριθμού στην παραπάνω συνάρτηση θα σας δώσει ένα σφάλμα όπως αυτό:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Έξοδος: TypeError: multiply() takes 2 positional arguments but 3 were given |
Επομένως, εάν έχετε κάποια ιδέα ότι μπορεί να χρειαστεί να προσθέσετε περισσότερα ορίσματα αργότερα, τότε εφαρμόστε την παράμετρο *args για δική σας διευκόλυνση. Μπορείτε να τη χρησιμοποιήσετε έτσι:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
Απλώς αντικαταστήσαμε τις παραμέτρους της συνάρτησης x και y με το *args. Η εκτέλεση αυτού του κώδικα θα σας δώσει το γινόμενο για κάθε κλήση συνάρτησης, ως εξής:
|
1 2 3 4 5 6 |
Έξοδος: 20 90 24 900 |
Έτσι, το *args είναι ιδανικό για χρήση όταν θέλετε να στείλετε λίστες ορισμάτων μεταβλητού μήκους στη συνάρτησή σας. Λόγω της δυνατότητάς του, μπορείτε να μεταβιβάσετε όσα ορίσματα θέλετε στις κλήσεις συναρτήσεων. Ως εκ τούτου, αυτή η παράμετρος σας επιτρέπει να δημιουργήσετε πιο ευέλικτο κώδικα που μπορεί να δεχτεί έναν ικανοποιητικό αριθμό μεταβλητών ορισμάτων χωρίς λέξεις-κλειδιά στη συνάρτηση.
Τι είναι το **kwargs και πώς λειτουργεί;
Στη συνέχεια, έχουμε την έκδοση των παραμέτρων με διπλό αστερίσκο, η οποία είναι το **kwargs. Σε αντίθεση με την προηγούμενη μορφή, αυτή η παράμετρος σας επιτρέπει να μεταβιβάζετε λεξικά ορισμάτων μεταβλητού μήκους με λέξεις-κλειδιά στη συνάρτηση. Παρόμοια με το *args, οι διπλοί αστερίσκοι είναι το πιο κρίσιμο στοιχείο της παραμέτρου.
Όπως κάναμε στην προηγούμενη ενότητα, μπορείτε να προσθέσετε όσα ορίσματα θέλετε. Η διαφορά είναι ότι πρέπει να αντιστοιχίσετε λέξεις-κλειδιά. Για να κατανοήσετε καλύτερα, δείτε το ακόλουθο παράδειγμα. Εδώ, θα ξεκινήσουμε εκτυπώνοντας τα **kwargs ορίσματα που θέλουμε να μεταβιβάσουμε στη συνάρτηση:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
Τώρα, ας καλέσουμε τη συνάρτηση. Όπως μπορείτε να δείτε, προσθέσαμε ορίσματα λέξεων-κλειδιών:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
Η εκτέλεση του προγράμματος σε αυτό το σημείο θα σας εμφανίσει αυτό το αποτέλεσμα:
|
1 |
python print_kwargs.py |
|
1 2 3 |
Έξοδος: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
Ωστόσο, υπάρχει η πιθανότητα ο τύπος δεδομένων του λεξικού σας να μην είναι ταξινομημένος. Αυτό εξαρτάται σε μεγάλο βαθμό από την έκδοση της Python 3 που χρησιμοποιείτε. Για παράδειγμα, οποιαδήποτε έκδοση μετά την Python 3.6 σας δίνει τα ζεύγη κλειδιού-τιμής με τη σειρά. Οποιαδήποτε έκδοση προηγείται αυτής θα εμφανίσει το αποτέλεσμα με τυχαία σειρά. Το λεξικό που δημιουργείτε θα ονομάζεται kwargs. Σημειώστε ότι μπορείτε να το χρησιμοποιήσετε και να το χειριστείτε όπως οποιοδήποτε άλλο λεξικό στο σύστημα. Ας δούμε πώς μπορείτε να αξιοποιήσετε περισσότερο την παράμετρο **kwargs για μεγαλύτερη χρήση και εφαρμογή.
Στο ακόλουθο παράδειγμα, θα προσπαθήσουμε να φτιάξουμε μια νέα συνάρτηση που θα χαιρετά ένα λεξικό με ονόματα. Το δείγμα λεξικού μας θα έχει δύο ονόματα:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
Η εκτέλεση του προγράμματος θα σας δώσει αυτό το αποτέλεσμα:
|
1 |
python print_values.py |
|
1 2 3 4 |
Έξοδος: Η τιμή του your_name είναι Casey Η τιμή του my_name είναι Sammy |
Παρόμοια με το προηγούμενο παράδειγμα, τα λεξικά μπορεί να εμφανίζονται μη ταξινομημένα. Ως εκ τούτου, η σειρά των ονομάτων Casey και Sammy μπορεί να αντιστραφεί σε ορισμένες περιπτώσεις.
Στη συνέχεια, θα μεταβιβάσουμε πρόσθετα ορίσματα στη συνάρτηση. Αυτό θα αποδείξει ότι μπορείτε να κάνετε το **kwargs να δέχεται οποιονδήποτε αριθμό ορισμάτων θέλετε:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
Η εκτέλεση του προγράμματος θα σας εμφανίσει αυτό το αποτέλεσμα:
|
1 2 3 4 5 6 7 8 |
Έξοδος: Η τιμή του name_2 είναι Gray Η τιμή του name_6 είναι Val Η τιμή του name_4 είναι Phoenix Η τιμή του name_5 είναι Remy Η τιμή του name_3 είναι Harper Η τιμή του name_1 είναι Alex |
Αυτό το αποτέλεσμα μπορεί επίσης να μην είναι ταξινομημένο. Ανεξάρτητα από αυτό, αυτά τα παραδείγματα δείχνουν ότι το **kwargs δίνει στο πρόγραμμά σας την ευελιξία να χρησιμοποιεί έναν αριθμό ορισμάτων λέξεων-κλειδιών.
Πώς να ταξινομήσετε τα ορίσματα
Είναι σημαντικό να έχετε κατά νου την καθορισμένη σειρά κατά την ταξινόμηση ενός ορίσματος σε μια συνάρτηση ή κλήση συνάρτησης. Έχει ως εξής:
-
Τυπικά ορίσματα θέσης
-
*args
-
Ορίσματα λέξεων-κλειδιών
-
**kwargs
Ας υποθέσουμε ότι χρησιμοποιείτε *args και **kwargs με ρητές παραμέτρους θέσης. Αυτό σημαίνει ότι η συνάρτησή σας θα μοιάζει κάπως έτσι:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
Από την άλλη πλευρά, η χρήση αυτών των παραμέτρων με ονομαστικές παραμέτρους (keyword parameters) θα δώσει στη συνάρτησή σας την ακόλουθη γενική δομή:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
Η μη συμμόρφωση με την καθορισμένη σειρά θα σας προκαλέσει σφάλμα σύνταξης (syntax error) κατά την εκτέλεση του κώδικά σας. Επομένως, είναι καλύτερο να αποφύγετε να κάνετε αυτό το λάθος εξαρχής.
Πώς να χρησιμοποιήσετε τα *args και **kwargs σε κλήσεις συναρτήσεων
Τέλος, θα σας δείξουμε πώς να χρησιμοποιήσετε και τις δύο παραμέτρους για να περάσετε ορίσματα σε συναρτήσεις. Θα ξεκινήσουμε με ένα παράδειγμα που δείχνει *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
Υπάρχουν τρεις παράμετροι σε αυτή τη συνάρτηση: arg_1, arg_2, και arg_3. Πρέπει να δημιουργήσετε μια μεταβλητή και να την ορίσετε σε ένα επαναλήψιμο αντικείμενο (iterable). Σε αυτή την περίπτωση, θα είναι ένα tuple. Στη συνέχεια, μπορείτε να περάσετε τη μεταβλητή στη συνάρτηση χρησιμοποιώντας τη σύνταξη με τον αστερίσκο.
Παρατηρήστε το αποτέλεσμα όταν εκτελείτε το πρόγραμμα χρησιμοποιώντας την python some_args.py εντολή:
|
1 2 3 4 5 |
Έξοδος: arg_1: Sammy arg_2: Casey arg_3: Alex |
Είναι επίσης δυνατό να αλλάξετε το πρόγραμμα ώστε να χρησιμοποιεί έναν επαναλήψιμο τύπο δεδομένων λίστας (iterable list) data type με ένα διαφορετικό όνομα μεταβλητής. Ο ακόλουθος κώδικας συνδυάζει *args με μια ονομαστική παράμετρο:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
Το αποτέλεσμα θα είναι το ακόλουθο κατά την εκτέλεση του προγράμματος:
|
1 2 3 4 5 |
Έξοδος: arg_1: 1 arg_2: 2 arg_3: 3 |
Από την άλλη πλευρά, μπορείτε να εφαρμόσετε ορίσματα με λέξεις-κλειδιά (keyworded arguments) με **kwargs. Βεβαιωθείτε ότι έχετε δημιουργήσει μια μεταβλητή που είναι ίση με ένα λεξικό (dictionary). Θα πρέπει να έχει 2 ζεύγη κλειδιού-τιμής. Δείτε πώς θα περάσουμε τη μεταβλητή σε μια συνάρτηση με 3 ορίσματα:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
Χρησιμοποιήστε την python some_kwargs.py εντολή για άλλη μια φορά για να εκτελέσετε το πρόγραμμα:
|
1 2 3 4 5 |
Έξοδος: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
Συμπέρασμα
Μέχρι το τέλος αυτού του οδηγού, θα πρέπει να είστε καλά εξοικειωμένοι με το τι είναι τα *args και **kwargs και πώς λειτουργούν. Μπορείτε τώρα να εφαρμόσετε αυτές τις παραμέτρους στον δικό σας κώδικα για να κάνετε το πρόγραμμά σας ευέλικτο για μελλοντικούς χρήστες. Αυτές είναι ιδανικές για περιπτώσεις όπου δεν γνωρίζετε πόσα ορίσματα μπορεί να χρησιμοποιηθούν. Απλώς βεβαιωθείτε ότι είστε προσεκτικοί με τα κρίσιμα στοιχεία των συναρτήσεων και των παραμέτρων.
Τέλος, ακολουθούν περισσότεροι πόροι από το ιστολόγιό μας που θα σας βοηθήσουν να εργαστείτε με επιτυχία με την Python:
- Η μορφή αρχείου txt: Εργασία με αρχεία απλού κειμένου στην Python 3
- Βρόχοι στην Python 3: Χρήση των εντολών Break, Continue και Pass
- Εισαγωγή ενοτήτων (Modules) στην Python 3: Ένας ολοκληρωμένος οδηγός
- Χρήση μορφοποιητών συμβολοσειρών (String Formatters) στην Python 3
- Προγραμματισμός με Python 3: Πώς να κατασκευάσετε κλάσεις και να ορίσετε αντικείμενα;
Καλή επιτυχία στον προγραμματισμό!
Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.