Byte of Python - Ελληνική Έκδοση

Συναρτήσεις

Εισαγωγή

Οι συναρτήσεις είναι επαναχρησιμοποιήσιμα μέρη προγραμμάτων. Σας επιτρέπουν να δίνετε ένα όνομα σε ένα σύνολο εντολών και να τρέχετε εκείνο το σύνολο εντολών χρησιμοιώντας το όνομά τους, οπουδήποτε στο προγραμμά σας και όσες φορές θέλετε. Αυτό είναι γνωστό σαν κλήση (calling) της συνάρτησης. Έχουμε ήδη χρησιμοποιήσει πολλές ενσωματωμένες συναρτήσεις όπως τη len και τη range.

Η έννοια των συναρτήσεων είναι πιθανόν το πιο σπουδαίο δομικό στοιχείο οποιουδήποτε μη στοιχειώδους προγράμματος (σε όλες τις γλώσσες προγραμματισμού), γι' αυτό θα διερευνήσουμε διάφορες πτυχές των συναρτήσεων σε αυτό το κεφάλαιο.

Οι συναρτήσεις ορίζονται χρησιμοποιώντας τη λέξη κλειδί def, μετά την οποία ακολουθεί ένα όνομα που ταυτοποιεί την εκάστοτε συνάρτηση και κατόπιν ακολουθεί ένα ζευγάρι παρενθέσεων που μπορούν να περικλείουν μερικά ονόματα μεταβλητών, και η γραμμή τελειώνει με διπλή τελεία (:). Παρακάτω ακολουθεί ένα απλό παράδειγμα με ένα σύνολο εντολών που αποτελούν μέρος αυτής της συνάρτησης. Με αυτό το παράδειγμα θα δείτε ότι στην πραγματικότητα είναι πολύ απλό:

Παράδειγμα:

#!/usr/bin/python
# Filename: function1.py

def sayHello():
    print('Hello World!') # σύνολο εντολών που ανήκουν στη συνάρτηση
# Τέλος της συνάρτησης

sayHello() # κλήση της συνάρτησης
sayHello() # κλήση της συνάρτησης ξανά

Έξοδος:

$ python function1.py
Hello World!
Hello World!

Πώς δουλεύει:

Oρίζουμε μια συνάρτηση με το όνομα sayHello ακολουθώντας τη σύνταξη όπως εξηγήσαμε παραπάνω. Αυτή η συνάρτηση δεν έχει παραμέτρους γι' αυτό δε δηλώνονται καθόλου μεταβλητές ανάμεσα στις παρενθέσεις. Οι παράμετροι στις συναρτήσεις είναι απλά η είσοδος στη συνάρτηση ώστε να περνάμε διαφορετικές τιμές στη συνάρτηση και να παίρνουμε αντίστοιχα αποτελέσματα.

Σημειώστε ότι μπορούμε να καλούμε την ίδια συνάρτηση δύο φορές, δηλαδή δε χρειάζεται να γράφουμε τον ίδιο κώδικα δύο φορές.

Παράμετροι συναρτήσεων

Μια συνάρτηση μπορεί να δεχθεί παραμέτρους, οι οποίες είναι τιμές που δίνετε στη συνάρτηση, έτσι ώστε αυτή να μπορεί να κάνει κάτι αξιοποιώντας αυτές τις τιμές. Αυτές οι παράμετροι μοιάζουν με τις μεταβλητές, διαφέροντας ως προς το ότι οι τιμές αυτών των μεταβλητών ορίζονται όταν καλούμε τη συνάρτηση και τους έχουν ήδη εκχωρηθεί τιμές όταν τρέχει η συνάρτηση.

Οι παράμετροι καθορίζονται μέσα στο ζευγάρι των παρενθέσεων στον ορισμό της συνάρτησης και διαχωρίζονται με κόμμα. Όταν καλούμε τη συνάρτηση δίνουμε και τις τιμές με τον ίδιο τρόπο. Σημείωση για την ορολογία που χρησιμοποιείται: οι ονομασίες που δίνετε στον ορισμό της συνάρτησης ονομάζονται παράμετροι ενώ οι τιμές που δίνετε όταν καλείτε τη συνάρτηση ονομάζονται ορίσματα.

Παράδειγμα:

#!/usr/bin/python
# Filename: func_param.py

def printMax(a, b):
    if a > b:
        print(a, 'είναι το μέγιστο')
    elif a == b:
        print(a, 'είναι ίσο με το', b)
    else:
        print(b, 'είναι το μέγιστο')

printMax(3, 4) # δίνουμε απ' ευθείας κυριολεκτικές τιμές

x = 5
y = 7

printMax(x, y) # δίνουμε μεταβλητές σαν ορίσματα

Έξοδος:

$ python func_param.py
4 είναι το μέγιστο
7 είναι το μέγιστο

Πώς δουλεύει:

Εδώ ορίζουμε μια συνάρτηση που ονομάζεται printMax με δυο παραμέτρους τις a και b. Bρίσκουμε το μεγαλύτερο νούμερο χρησιμοποιώντας μια απλή εντολή if .. else και μετά τυπώνουμε το μεγαλύτερο νούμερο.

Στην πρώτη χρήση της printMax, απευθείας δίνουμε τους αριθμούς, δηλαδή τα ορίσματα. Στη δεύτερη χρήση της, καλούμε τη συνάρτηση χρησιμοποιώντας μεταβλητές. Η printMax(x, y) αποδίδει την τιμή του ορίσματος x στην παράμετρο a και την τιμή του ορίσματος y στην παράμετρο b. H συνάρτηση printMax λειτουργεί με τον ίδιο τρόπο και στις δυο περιπτώσεις.

Τοπικές μεταβλητές (Local variables)

Όταν δηλώνετε μεταβλητές μέσα σε ένα ορισμό συνάρτησης, αυτές δεν έχουν καμία σχέση με άλλες μεταβλητές που έχουν την ίδια ονομασία και χρησιμοποιούνται έξω απο αυτή τη συνάρτηση, δηλαδή τα ονόματα των μεταβλητών χρησιμοποιούνται μόνο τοπικά στη συνάρτηση. Αυτό ονομάζεται εμβέλεια (scope) των μεταβλητών. Όλες οι μεταβλητές έχουν την εμβέλεια του τμήματος όπου έχουν δηλωθεί, αρχίζοντας από το σημείο στο οποίο ορίζεται το όνομα.

Παράδειγμα:

#!/usr/bin/python
# Filename: func_local.py

x = 50

def func(x):
    print('Το x είναι', x)
    x = 2
    print('Άλλαξα το τοπικό x σε', x)

func(x)
print('Το x είναι ακόμα', x)

Έξοδος:

$ python func_local.py
Το x είναι 50
Άλλαξα το τοπικό x σε  2
Το x είναι ακόμα 50

Πώς δουλεύει:

Στη συνάρτηση ,την πρώτη φορά που χρησιμοποιούμε την τιμή με το όνομα x, η Python χρησιμοποιεί την τιμή της παραμέτρου που έχει δηλωθεί στη συνάρτηση.

Κατόπιν εκχωρούμε την τιμή 2 στο x. Η ονομασία x είναι τοπική στη συνάρτησή μας. Έτσι όταν αλλάζουμε την τιμή του x στη συνάρτηση, το x που ορίστηκε στο κύριο τμήμα δεν επηρεάζεται.

Στην τελευταία κλήση της συνάρτησης print, παρουσιάζουμε την τιμή x στο κύριο τμήμα και επιβεβαιώνουμε ότι δεν έχει επηρεαστεί.

Χρήση της εντολής global

Εάν θέλετε να εκχωρήσετε μια τιμή σε ένα όνομα που ορίζεται στο κορυφαίο επίπεδο του προγράμματος (δηλαδή όχι μέσα σε κάποιου είδους εμβέλεια όπως σε συναρτήσεις ή κλάσεις), τότε πρέπει να πείτε στην Python ότι το όνομα δεν είναι τοπικό αλλά καθολικό (global). Αυτό γίνεται με τη χρήση της εντολής global. Είναι αδύνατον να εκχωρήσετε μια τιμή σε μια μεταβλητή που ορίζεται εκτός μιας συνάρτησης χωρίς την εντολή global. Μπορείτε να χρησιμοποιήσετε τις τιμές τέτοιων μεταβλητών που ορίζονται έξω από τη συνάρτηση (υποθέτοντας ότι δεν υπάρχουν μεταβλητές με το ίδιο όνομα μέσα στη συνάρτηση). Ωστόσο, κάτι τέτοιο δεν προτείνεται και πρέπει να αποφεύγεται μιας και δεν είναι ξεκάθαρο για τον αναγνώστη του προγράμματος για το πού βρίσκεται ο ορισμός της μεταβλητής. Χρησιμοποιώντας την εντολή global γίνεται ξεκάθαρο ότι η μεταβλητή βρίσκεται σε ένα εξωτερικό τμήμα εντολών.

Παράδειγμα:

#!/usr/bin/python
# Filename: func_global.py

x = 50

def func():
    global x

    print('Το x είναι', x)
    x = 2
    print('Άλλαξα το καθολικό x σε', x)

func()
print('Η τιμή του x είναι', x)

Έξοδος:

$ python func_global.py
Το x είναι 50
Άλλαξα το καθολικό x σε 2
Η τιμή του x είναι 2

Πώς δουλεύει:

Η εντολή global χρησιμοποιείται για να δηλώσει ότι το x είναι μια καθολική μεταβλητή, γι' αυτό το λόγο όταν εκχωρούμε μια τιμή για το x μέσα στη συνάρτηση, αυτή η αλλαγή απεικονίζεται όταν χρησιμοποιούμε την τιμή του x στο κυρίως τμήμα.

Μπορείτε να καθορίσετε περισσότερες από μία καθολικές μεταβλητές χρησιμοποιώντας την ίδια εντολή global. Για παράδειγμα global x, y, z.

Χρήση της εντολής nonlocal

Έχουμε δει μέχρι τώρα πώς να έχουμε πρόσβαση σε μεταβλητές σε τοπική και καθολική εμβέλεια. Αλλά υπάρχει και ένα άλλο είδος εμβέλειας που ονομάζεται μη τοπική εμβέλεια (nonlocal scope) και είναι μεταξύ των δυο παραπάνω τύπων εμβέλειας. Οι μεταβλητές μη τοπικής εμβέλειας παρατηρούνται όταν ορίζετε συναρτήσεις μέσα στις συναρτήσεις.

Αφού όλα στη Python είναι εκτελέσιμος κώδικας, μπορείτε να ορίσετε συναρτήσεις οπουδήποτε.

Ας δούμε ένα παράδειγμα:

#!/usr/bin/python
# Filename: func_nonlocal.py

def func_outer():
    x = 2
    print('Το x είναι', x)

    def func_inner():
        nonlocal x
        x = 5

    func_inner()
    print('Το τοπικό x άλλαξε σε', x)

func_outer()

Έξοδος:

$ python func_nonlocal.py
Το x είναι 2
Το τοπικό x άλλαξε σε 5

Πώς δουλεύει:

Όταν είμαστε μέσα στην func_inner, το x που ορίζεται στην πρώτη γραμμή του func_outer, δεν έχει ούτε τοπική ούτε καθολική εμβέλεια. Δηλώνουμε ότι χρησιμοποιούμε αυτό το x με την εντολή nonlocal x και έτσι αποκτούμε πρόσβαση σε αυτή τη μεταβλητή.

Προσπαθήστε αρχικά αλλάζοντας το nonlocal x σε global x, και έπειτα αφαιρώντας εντελώς την εντολή, να παρατηρήσετε τη διαφορά μεταξύ αυτών των δύο περιπτώσεων.

Προεπιλεγμένες τιμές ορίσματος

Σε κάποιες συναρτήσεις ίσως να θέλουμε να κάνουμε μερικές παραμέτρους τους προαιρετικές και να χρησιμοποιήσουμε προεπιλεγμένες τιμές εάν ο χρήστης δε θέλει να δώσει τιμές σε τέτοιες παραμέτρους. Αυτό μπορεί να επιτευχθεί με τη βοήθεια των προεπιλεγμένων τιμών ορίσματος. Μπορείτε να καθορίσετε προεπιλεγμένες τιμές ορισμάτων για παραμέτρους, τοποθετώντας μετά το όνομα της παραμέτρου στον ορισμό της συνάρτησης τον τελεστή εκχώρησης (=) ακολουθούμενο απο την προεπιλεγμένη τιμή.

Σημειώστε ότι η προεπιλεγμένη τιμή ορίσματος πρέπει να είναι μια σταθερά. Για την ακρίβεια η προεπιλεγμένη τιμή ορίσματος πρέπει να είναι αμετάβλητη (immutable) -αυτό εξηγείται με λεπτομέρειες στα επόμενα κεφάλαια. Προς το παρόν, είναι αρκετό να το θυμάστε.

Παράδειγμα:

#!/usr/bin/python
# Filename: func_default.py

def say(message, times = 1):
    print(message * times)

say('Hello')
say('World', 5)

Έξοδος:

$ python func_default.py
Hello
WorldWorldWorldWorldWorld

Πώς δουλεύει:

Η συνάρτηση με το όνομα say χρησιμοποιείται για να τυπώσει μια συμβολοσειρά, τόσες φορές όσες έχει καθοριστεί. Εάν δεν έχει δοθεί τιμή ,τότε από προεπιλογή η συμβολοσειρά τυπώνεται μια φορά. Αυτό το πετυχαίνουμε καθορίζοντας μια προεπιλεγμένη τιμή ίση με 1 για τη παράμετρο times.

Στην πρώτη χρήση της συνάρτησης say παρέχουμε μόνο τη συμβολοσειρά και τυπώνει τη συμβολοσειρά μόνο μια φορά. Στη δεύτερη χρήση της say παρέχουμε και τη συμβολοσειρά και ένα όρισμα 5 δηλώνοντας έτσι ότι θέλουμε να πούμε (say) το μήνυμα της συμβολοσειράς 5 φορές.

Σημαντικό

Μόνο σε εκείνες τις παραμέτρους, οι οποίες βρίσκονται στο τέλος της λίστας παραμέτρων, μπορούν να δοθούν προεπιλεγμένες τιμές ορίσματος, δηλαδή δε μπορούμε να έχουμε μια παράμετρο με προεπιλεγμένη τιμή ορίσματος πριν από μια παράμετρο χωρίς προεπιλεγμένη τιμή ορίσματος, στη σειρά των παραμέτρων που έχουν δηλωθεί στη λίστα παραμέτρων της συνάρτησης. Αυτό συμβαίνει διότι οι τιμές εκχωρούνται στις παραμέτρους με τη θέση τους. Για παράδειγμα η def func(a, b=5) είναι έγκυρη αλλά η def func(a=5, b) δεν είναι.

Ορίσματα με λέξεις-κλειδιά (Keyword Arguments)

Εάν έχουμε κάποιες συναρτήσεις με πολλές παραμέτρους και θέλουμε να καθορίσουμε με ακρίβεια μόνο μερικές από αυτές ,τότε μπορούμε να δώσουμε τιμές μόνο σε αυτές χρησιμοποιώντας τα ονόματά τους, δηλ. χρησιμοποιούμε τα όνοματα των παραμέτρων αντί της θέσης τους (την οποία χρησιμοποιούσαμε μέχρι τώρα) για να καθορίσουμε τα ορίσματα της συνάρτησης.

Έτσι έχουμε δύο πλεονεκτήματα, πρώτον η χρήση της συνάρτησης γίνεται ευκολότερη επειδή δεν χρειάζεται να ανησυχούμε για τη διάταξη των ορισμάτων. Δεύτερον, μπορούμε να δώσουμε τιμές μόνο σε εκείνες τις παραμέτρους που θέλουμε, δεδομένου ότι οι άλλες παράμετροι έχουν προεπιλεγμένες τιμές ορίσματος.

Παράδειγμα:

#!/usr/bin/python
# Filename: func_key.py

def func(a, b=5, c=10):
    print('Το a είναι', a, 'και το b είναι', b, 'και το c είναι', c)

func(3, 7)
func(25, c=24)
func(c=50, a=100)

Έξοδος:

$ python func_key.py
Το a είναι 3 και το b είναι 7 και το c είναι 10
Το a είναι 25 και το b είναι 5 και το c είναι 24
Το a είναι 100 και το b είναι 5 και το c είναι 50

Πώς δουλεύει:

Η συνάρτηση με την ονομασία func έχει μια παράμετρο χωρίς προεπιλεγμένη τιμή ορίσματος και ακολουθείται από δύο παραμέτρους με προεπιλεγμένες τιμές ορίσματος. Στην πρώτη χρήση, func(3, 7) η παράμετρος a παίρνει την τιμή 3, η παράμετρος b παίρνει την τιμή 7 και η c παίρνει την προεπιλεγμένη του 10.

Στην δεύτερη χρήση func(25, c=24), η μεταβλητή a παίρνει την τιμή του 25 εξαιτίας της θέσης του ορίσματος. Κατόπιν η παράμετρος c παίρνει την τιμή του 24 εξαιτίας της ονομασίας δηλ. ορίσματα με λέξεις κλειδιά. Η μεταβλητή b παίρνει την προεπιλεγμένη τιμή του 5.

Στην τρίτη χρήση func(c=50, a=100) ,χρησιμοποιούμε μόνο ορίσματα με λέξεις κλειδιά για να καθορίσουμε τις τιμές. Σημειώστε ότι καθορίζουμε τιμή για την παράμετρο c πριν καθορίσουμε για την a ακόμα κι αν η a είναι ορισμένη πριν από τη c στον ορισμό της συνάρτησης.

Παράμετροι VarArgs

Σημείωση

Ίσως θα έπρεπε να γράψουμε για αυτό σε επόμενα κεφάλαια επειδή δεν έχουμε μιλήσει ακόμα για τις λίστες και τα λεξικά.

Μερικές φορές ίσως θέλουμε να ορίσουμε μια συνάρτηση η οποία μπορεί να λάβει οποιοδήποτε αριθμό παραμέτρων και αυτό μπορεί να επιτευχθεί χρησιμοποιώντας αστερίσκους *.

Παράδειγμα:

#!/usr/bin/python
# Filename: total.py

def total(initial=5, *numbers, **keywords):
    count = initial
    for number in numbers:
        count += number
    for key in keywords:
        count += keywords[key]
    return count

print(total(10, 1, 2, 3, vegetables=50, fruits=100))

Έξοδος:

$ python total.py
166

Πώς δουλεύει:

Όταν δηλώνουμε μία παράμετρο με αστερίσκο, όπως το *param, τότε όλα τα ορίσματα των οποίων η θέση βρίσκεται από αυτό το σημείο μέχρι το τέλος, συγκεντρώνονται ως μία λίστα με το όνομα param. Παρομοίως, όταν δηλώνουμε μία παράμετρο με διπλό αστερίσκο όπως το **param, τότε όλα τα ορίσματα με λέξη-κλειδί (όνομα), από αυτό το σημείο μέχρι το τέλος συγκεντρώνονται ως ένα λεξικό με το όνομα param.

Θα εξερευνήσουμε τις λίστες και τα λεξικά σε επόμενο κεφάλαιο.

Παράμετροι μόνο με λέξεις-κλειδιά

Αν θέλουμε να καθορίσουμε παραμέτρους με λέξεις-κλειδιά έτσι ώστε να είναι διαθέσιμες μόνον σαν λέξεις κλειδιά και όχι σαν ορίσματα σε συγκεκριμένες θέσεις, τότε αυτές πρέπει να δηλωθούν μετά από μια παράμετρο με αστερίσκο.

Παράδειγμα:

#!/usr/bin/python
# Filename: keyword_only.py

def total(initial=5, *numbers, vegetables):
    count = initial
    for number in numbers:
        count += number
    count += vegetables
    return count

print(total(10, 1, 2, 3, vegetables=50))
print(total(10, 1, 2, 3))
# Προκαλεί σφάλμα καθώς δεν έχουμε ορίσει προεπιλεγμένη τιμή για τη μεταβλητή 'vegetables'

Έξοδος:

$ python keyword_only.py
66
Traceback (most recent call last):
 File "keyword_only.py", line 12, in <module>
total(10, 1, 2, 3)
TypeError: total() needs keyword-only argument vegetables

Πώς δουλεύει

Η δήλωση παραμέτρων μετά από μια παράμετρο με αστερίσκο, έχει ως αποτέλεσμα ορίσματα με λέξεις κλειδιά μόνο. Εάν σε αυτά τα ορίσματα δε δίνεται μια προεπιλεγμένη τιμή, τότε οι κλήσεις στη συνάρτηση θα δώσουν σφάλμα εάν το όρισμα με λέξη-κλειδι δεν δίνεται, όπως φαίνεται και παραπάνω.

Εάν θέλετε να έχετε ορίσματα με λέξεις-κλειδιά μόνον αλλά δεν χρειάζεστε μια παράμετρο με αστερίσκο, τότε χρησιμοποιείτε μόνο του τον αστερίσκο χωρις καμία ονομασία, όπως το def total(initial=5, *, vegetables).

Η εντολή return

Η εντολή return χρησιμοποιείται για να έχουμε επιστροφή από μια συνάρτηση, δηλαδή να βγούμε από τη συνάρτηση. Μπορούμε επίσης, προαιρετικά, να επιστρέψουμε μια τιμή από την συνάρτηση.

Παράδειγμα:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Filename: func_return.py

def maximum(x, y):
    if x > y:
        return x
    elif x == y:
        return 'Οι αριθμοί είναι ίσοι'
    else:
        return y

print(maximum(2, 3))

Έξοδος:

$ python func_return.py
3

Πώς δουλεύει:

Η συνάρτηση maximum επιστρέφει το μέγιστο (maximum) των παραμέτρων, και σε αυτή την περίπτωση των αριθμών που παρέχονται στη συνάρτηση. Χρησιμοποιεί μια απλή εντολή if .. else για να βρει τη μεγαλύτερη τιμή και μετά επιστρέφει αυτή την τιμή.

Σημειώνουμε ότι η εντολή return χωρίς μια τιμή είναι ισοδύναμη με την return None. Το None είναι ένας ειδικός τύπος στην Python που αντιπροσωπεύει τη μηδαμινότητα. Για παράδειγμα, χρησιμοποιείται για να δείξει ότι μια μεταβλητή δεν έχει καμία τιμή αν έχει την τιμή None.

Kάθε συνάρτηση σιωπηρά περιέχει μια εντολή return None στο τέλος της εκτός κι αν έχουμε γράψει τη δική μας εντολή επιστροφής. Αυτό μπορείτε να το δείτε τρέχοντας την print(someFunction()) όπου η συνάρτηση someFunction δε χρησιμοποιεί την εντολή return:

def someFunction():
    pass

Η εντολή pass χρησιμοποιείται στην Python για να δείξει ένα άδειο τμήμα εντολών.

Σημείωση

Υπάρχει μία ενσωματωμένη συνάρτηση που ονομάζεται max η οποία ήδη εφαρμόζει την λειτουργία εύρεσης του μέγιστου, οπότε χρησιμοποιείστε αυτή την ενσωματωμένη λειτουργία όποτε είναι δυνατόν.

Συμβολοσειρές τεκμηρίωσης (DocStrings)

Η Python έχει ένα θαυμάσιο χαρακτηριστικό που ονομάζεται συμβολοσειρές τεκμηρίωσης (documentation strings) και συνήθως αναφέρεται με τη συντομογραφία DocStrings. Οι συμβολοσειρές τεκμηρίωσης είναι ένα σπουδαίο εργαλείο που πρέπει να χρησιμοποιείτε διότι βοηθάει να τεκμηριώσετε το πρόγραμμα καλύτερα και έτσι γίνεται πιο εύκολα κατανοητό. Το εντυπωσιακό είναι ότι μπορούμε για παράδειγμα να επιστρέψουμε τη συμβολοσειρά τεκμηρίωσης από μια συνάρτηση , ενώ το πρόγραμμα τρέχει!

Παράδειγμα:

#!/usr/bin/python
# Filename: func_doc.py

def printMax(x, y):
    '''Τυπώνει το μέγιστο μεταξύ δύο αριθμών.

    Οι δύο τιμές πρέπει να είναι ακέραιου τύπου.'''
    x = int(x) # μετατροπή σε ακεραίους, αν είναι δυνατόν
    y = int(y)

    if x > y:
        print('Το', x, 'είναι το μέγιστο')
    else:
        print('Το', y, 'είναι το μέγιστο')

printMax(3, 5)
print(printMax.__doc__)

Έξοδος:

$ python func_doc.py
Το 5 είναι το μέγιστο
Τυπώνει το μέγιστο μεταξύ δύο αριθμών.

    Οι δύο τιμές πρέπει να είναι ακέραιου τύπου.

Πώς δουλεύει:

Mία συμβολοσειρά στην πρώτη λογική γραμμή της συνάρτησης είναι η συμβολοσειρά τεκμηρίωσης για αυτή τη συνάρτηση. Σημειώστε ότι οι συμβολοσειρές τεκμηρίωσης εφαρμόζονται και στα αρθρώματα (modules) και στις κλάσεις (classes), όπως θα μάθουμε στα αντίστοιχα κεφάλαια.

Η σύμβαση που ακολουθείται για μια συμβολοσειρά τεκμηρίωσης είναι μια συμβολοσειρά πολλών γραμμών, όπου η πρώτη γραμμή αρχίζει με ένα κεφαλαίο γράμμα και τελειώνει με μια τελεία. Κατόπιν η δεύτερη γραμμή είναι κενή και ακολουθεί η τρίτη γραμμή που έχει κάθε λεπτομερή εξήγηση. Προτείνεται να ακολουθείτε ακριβώς αυτή τη σύμβαση για όλες τις συμβολοσειρές τεκμηρίωσης που αφορούν όλες τις μη τετριμμένες συναρτήσεις (non-trivial functions).

Μπορούμε να έχουμε πρόσβαση στη συμβολοσειρά τεκμηρίωσης της συνάρτησης printMax χρησιμοποιώντας το χαρακτηριστικό (attribute) __doc__ (σημειώστε τις διπλές κάτω παύλες) της συνάρτησης. Θυμηθείτε όμως ότι η Python αντιμετωπίζει τα πάντα σαν αντικείμενα, και αυτό συμπεριλαμβάνει και τις συναρτήσεις. Θα μάθουμε περισσότερα για τα αντικείμενα στο κεφάλαιο για τις κλάσεις.

Εάν έχετε χρησιμοποιήσει την help() στην Python, τότε έχετε δει ήδη την χρήση των συμβολοσειρών τεκμηρίωσης. Αυτό που κάνει η help() είναι να παίρνει το χαρακτηριστικό __doc__ της συνάρτησης και να το εμφανίζει με ωραίο τρόπο. Mπορείτε να το δοκιμάσετε στην παραπάνω συνάρτηση αρκεί να συμπεριλάβετε την εντολή help(printMax) στο πρόγραμμά σας. Θυμηθείτε να πατήσετε το q για κλείσετε τη help.

Μερικά αυτοματοποιημένα εργαλεία μπορούν να ανακτήσουν την τεκμηρίωση από το πρόγραμμά σας με αυτόν τον τρόπο. Συνεπώς συνιστάται να χρησιμοποιείτε συμβολοσειρές τεκμηρίωσης σε κάθε μη τετριμμενη συνάρτηση που γράφετε. Η εντολή pydoc που συνοδεύει την Python λειτουργεί παρόμοια με τη help() χρησιμοποιώντας τα docstrings.

Σχολιασμοί (Annotations)

Οι συναρτήσεις έχουν ακόμα ένα προχωρημένο χαρακτηριστικό με το όνομα «σχολιασμοί», το οποίο είναι ένας γρήγορος τρόπος να επισυνάψουμε επιπρόσθετες πληροφορίες για κάθε μια από τις παραμέτρους καθώς και την τιμή επιστροφής. Η Python δεν διερμηνεύει απο μόνη της αυτές τις πληροφορίες με οποιοδήποτε τρόπο (αυτή η λειτουργία έχει αφεθεί στις βιβλιοθήκες τρίτων να τα διερμηνεύουν με όποιο τρόπο θέλουν), γι' αυτό θα παραλείψουμε αυτό το χαρακτηριστικό από τη συζήτησή μας. Αν παρόλα αυτά ενδιαφέρεστε να μάθετε για τους σχολιασμούς, μπορείτε να δείτε τις σχετικές αναφορές στο Python Enhancement Proposal No. 3107.

Σύνοψη

Έχουμε ήδη δει πολλα χαρακτηριστικά των συναρτήσεων αλλα δεν έχουμε καλύψει όλες τις πλευρές τους. Πάντως έχουμε ήδη καλύψει τα περισσότερα από αυτά που θα χρησιμοποιήσουμε με την Python σε καθημερινή βάση. Στο επόμενο κεφάλαιο θα δούμε πως δημιουργούμε και χρησιμοποιούμε αρθρώματα (modules) στην Python.