Η function είναι ένα μπλοκ οργανωμένου, επαναχρησιμοποιήσιμου κώδικα που χρησιμοποιείται για την εκτέλεση μιας συγκεκριμένης εργασίας. Οι Functions προσφέρουν καλύτερη αρθρωτότητα στην εφαρμογή σου και υψηλό βαθμό επαναχρησιμοποίησης κώδικα. Η Python, όπως και άλλες γλώσσες προγραμματισμού, έχει ενσωματωμένες συναρτήσεις (print, map και ούτω καθεξής) που είναι άμεσα διαθέσιμες. Μπορείς επίσης να ορίσεις τις δικές σου συναρτήσεις. Αυτές ονομάζονται user-defined functions. Οι συναρτήσεις μπορούν να εκτελέσουν κάτι τόσο απλό όσο η εκτύπωση ενός μηνύματος στην κονσόλα ή μπορεί να είναι αρκετά περίπλοκες.
Για να εκτελέσεις τον κώδικα μέσα σε μια συνάρτηση, πρέπει να καλέσεις τη συνάρτηση, κάτι που γίνεται χρησιμοποιώντας το όνομα της συνάρτησης ακολουθούμενο από παρενθέσεις [()]. Δεδομένα, γνωστά ως arguments, μπορούν να περαστούν στη συνάρτηση τοποθετώντας τα μέσα στις παρενθέσεις. Ένας ορισμός συνάρτησης μπορεί να περιλαμβάνει μηδέν ή περισσότερες parameters. Οι παράμετροι καθορίζουν ποια ορίσματα δέχεται η συνάρτηση. Μια παράμετρος καθορίζει τον τύπο του ορίσματος που θα περαστεί. Το όρισμα είναι η πραγματική τιμή που περνιέται όταν καλείται η συνάρτηση. Οι συναρτήσεις μπορούν να εκτελέσουν διαφορετικές εργασίες ανάλογα με τα ορίσματα που περνιούνται στις παραμέτρους.
Μια συνάρτηση μπορεί επίσης να επιστρέψει μια τιμή χρησιμοποιώντας τη λέξη-κλειδί return. Η τιμή που επιστρέφει η συνάρτηση είναι γνωστή ως return value. Η τιμή επιστροφής επιστρέφεται σε όποιον κάλεσε τη συνάρτηση.
Στην Python, οι συναρτήσεις δημιουργούνται χρησιμοποιώντας τη λέξη-κλειδί def. Ο ορισμός της συνάρτησης ακολουθείται από το όνομα της συνάρτησης και παρενθέσεις [()]. Μέσα στις παρενθέσεις καθορίζονται οι παράμετροι, χωρισμένες με κόμματα. Μετά την παρένθεση κλεισίματος, η άνω και κάτω τελεία (:) χρησιμοποιείται για να διαχωρίσει την υπογραφή της συνάρτησης από το σώμα της.
Το σώμα της συνάρτησης είναι ένα μπλοκ κώδικα που εκτελείται όταν καλείται η συνάρτηση. Το σώμα της συνάρτησης είναι με εσοχή. Η εσοχή είναι σημαντική, γιατί η Python βασίζεται σε αυτήν για να ξέρει πού τελειώνει αυτό το μπλοκ κώδικα. Μια τιμή μπορεί να επιστραφεί από τη συνάρτηση χρησιμοποιώντας τη λέξη-κλειδί return, την οποία μπορεί στη συνέχεια να χρησιμοποιήσει όποιος κάλεσε τη συνάρτηση.
def function_name(parameter1, parameter2, ...):
# function body
return parameter1 + parameter2
Μπορούμε επίσης να ορίσουμε μια συνάρτηση χωρίς παραμέτρους ή τιμή επιστροφής.
def function_name():
# function body
pass
Σημείωσε ότι η συνάρτηση χρειάζεται οπωσδήποτε σώμα, ακόμα κι αν το σώμα δεν κάνει τίποτα, αλλιώς η προσπάθεια εκτέλεσης του προγράμματος θα προκαλέσει σφάλμα εσοχής:
>>> def my_bodyless_func():
...
File ~/temp.py:1
^
IndentationError: expected an indented block
Για να καλέσεις μια συνάρτηση, χρησιμοποίησε το όνομα της συνάρτησης ακολουθούμενο από παρενθέσεις [()]. Οι παράμετροι που περνιούνται στη συνάρτηση τοποθετούνται μέσα στις παρενθέσεις, χωρισμένες με κόμματα.
Ας δούμε την παρακάτω συνάρτηση:
def greet():
print("Hello")
Η παραπάνω συνάρτηση μπορεί να κληθεί χρησιμοποιώντας την εξής σύνταξη:
>>> greet()
Hello
Τα ορίσματα είναι τιμές που περνιούνται στη συνάρτηση όταν καλείται. Μπορούν να είναι οποιουδήποτε τύπου δεδομένων, ακόμα και άλλες συναρτήσεις ή κλάσεις.
Ας ορίσουμε μια συνάρτηση add που προσθέτει δύο αριθμούς:
def add(first, second):
print(first + second)
Οι παράμετροι first και second καθορίζουν ποια ορίσματα θα δεχτεί η συνάρτηση add. (Αξίζει να σημειωθεί ότι οι λέξεις parameter και argument χρησιμοποιούνται συχνά εναλλάξιμα, αν και ανακριβώς.) Όταν καλείται η συνάρτηση, τα ορίσματα περνιούνται σε αυτήν. Πρέπει να περάσουμε ορίσματα και για τις δύο παραμέτρους, αλλιώς θα πεταχτεί ένα TypeError.
>>> add(2, 3)
5
# Function can be called multiple times, with different parameters
>>> add(4, 3)
7
>>> add(5, 6)
11
# Passing an incorrect number of parameters will raise a `TypeError`
>>> add(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() missing 1 required positional argument: 'second'
>>> add(2, 3, 4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() takes 2 positional arguments but 3 were given
Η τιμή επιστροφής είναι μια τιμή που επιστρέφεται σε όποιον κάλεσε τη συνάρτηση. Μια return value μπορεί να είναι οποιουδήποτε τύπου δεδομένων, συμπεριλαμβανομένων άλλων συναρτήσεων ή κλάσεων. Μπορεί να χρησιμοποιηθεί από όποιον κάλεσε τη συνάρτηση για να εκτελέσει περαιτέρω πράξεις. Αν μια συνάρτηση δεν ορίζει ρητά μια return value, η τιμή None θα επιστραφεί από τον διερμηνευτή της Python.
Ας ορίσουμε μια συνάρτηση add:
def add(first, second):
return first + second
Μπορούμε να αποθηκεύσουμε την τιμή επιστροφής σε μια μεταβλητή και μετά να την εκτυπώσουμε:
>>> result = add(2, 3)
>>> print(result)
5
# Type of result is `int`
>>> type(result)
<class 'int'>
# We can also perform operations on the return value
>>> result * 2
10
# A function without an explicit return value will return `None`
>>> def log(message):
print(message)
# Hello is printed because of print(message), but return value is `None`
>>> return_value = log("Hello")
Hello
>>> return_value
None
Η χρήση του return τερματίζει αμέσως τη συνάρτηση και επιστρέφει την τιμή σε όποιον την κάλεσε.
>>> def show(first, second):
print(first)
return first
print(second)
# second never gets printed, because the function exits after the return statement
>>> show(1, 2)
1
Τα σύνθετα προγράμματα μπορούν να χωριστούν σε μικρότερα μέρη. Διαφορετικές συναρτήσεις μπορούν να χρησιμοποιηθούν για την εκτέλεση διαφορετικών συγκεκριμένων εργασιών.
Υπόθεσε ότι ένα πρόγραμμα πρέπει να εκτελέσει τις παρακάτω εργασίες:
Μπορούμε να χωρίσουμε το πρόγραμμα σε μικρότερα μέρη.
def circle_area(radius):
return 3.14 * radius * radius
def rectangle_area(length, breadth):
return length * breadth
def triangle_area(base, height):
return 0.5 * base * height
Τώρα, μπορούμε να καλέσουμε τις συναρτήσεις με όποια σειρά θέλουμε.
>>> circle_area(2)
12.56
>>> triangle_area(2, 3)
3.0
>>> rectangle_area(2, 3)
6
>>> rectangle_area(1, 2) + circle_area(2) + triangle_area(1, 2)
15.56
Αν μια μεταβλητή (ή όνομα) οριστεί μέσα σε μια συνάρτηση, θα είναι προσβάσιμη μόνο μέσα στην εμβέλεια της συνάρτησης (ή στο τοπικό πεδίο ονομάτων), ακόμα κι αν υπάρχει μια μεταβλητή με το ίδιο όνομα έξω από την εμβέλεια της συνάρτησης.
Οι μεταβλητές που ορίζονται έξω από μια συνάρτηση στο επίπεδο του module θεωρούνται ότι ανήκουν στο καθολικό πεδίο ονομάτων. Οι μεταβλητές που ορίζονται έξω από μια συνάρτηση αλλά μέσα σε μια συνάρτηση ή κλάση που τις περικλείει ανήκουν στο μη τοπικό πεδίο ονομάτων.
Η Python χρησιμοποιεί τον Κανόνα LEGB (Local, Enclosing, Global, Built-in) για να επιλύει τα ονόματα των μεταβλητών όταν εκτελείται ένα πρόγραμμα:
Αν το όνομα παραμείνει άλυτο, η Python θα πετάξει ένα NameError exception.
# Global namespace.
general_favorite = "apples"
def alices_favorite():
# Local namespace.
favorite = "cherries"
# This works because Python will eventually find general_favorite in the global namespace.
# Python will find 'print' in the built-in namespace.
print(f'Alice has always liked {favorite}, but most people like {general_favorite}.')
def our_favorite_fruits():
# Enclosing or nonlocal namespace.
yours = "peaches"
def my_favorite():
# Local namespace.
mine = "pears"
# This works because Python will eventually find 'yours' in the enclosing/nonlocal namespace.
print(f'My favorite is {mine}, but you like {yours} instead.')
# This works because Python will eventually find 'general_favorite' in the global namespace.
print(f'Everyone seems to like {general_favorite}')
# This function is in the local namespace of the 'our_favorite_fruits' function.
my_favorite()
# This will raise NameError: name 'favorite' is not defined, because the variable favorite is local to alices_favorite.
print(favorite)
Αν θέλουμε να κάνουμε ένα όνομα μεταβλητής προσβάσιμο έξω από την τοπική εμβέλεια της συνάρτησης (ή να τροποποιήσουμε μια μεταβλητή που έχει οριστεί έξω από την εμβέλεια της συνάρτησης), πρέπει να χρησιμοποιήσουμε τις λέξεις-κλειδιά global ή nonlocal.
Η χρήση της λέξης-κλειδί global δίνει σήμα στην Python να ξεκινήσει την αναζήτηση στο καθολικό πεδίο ονομάτων.
Οι αναθέσεις τιμών στη μεταβλητή θα τροποποιούν τότε την καθολική μεταβλητή, αντί να δημιουργούν μια τοπική εκδοχή της.
Όταν το global χρησιμοποιείται για να δηλώσει μια μεταβλητή, η μεταβλητή θα προστεθεί στο καθολικό πεδίο ονομάτων.
Κατά συνέπεια, το global πρέπει να χρησιμοποιείται με προσοχή, καθώς η προσθήκη ή η τροποποίηση μιας καθολικής μεταβλητής θα μπορούσε να έχει επιπτώσεις σε όλον τον άλλο κώδικα που χρησιμοποιεί την τιμή της.
Η λέξη-κλειδί nonlocal δίνει σήμα στην Python να αναζητήσει/δημιουργήσει τη μεταβλητή στο μη τοπικό ή περικλείον πεδίο ονομάτων.
Χρησιμοποιείται όταν μια συνάρτηση είναι εμφωλευμένη μέσα σε μια άλλη συνάρτηση ή κλάση και χρειάζεται πρόσβαση στις μεταβλητές και στην εμβέλεια της εξωτερικής συνάρτησης.
Στην Python, οι συναρτήσεις μπορούν να ανατεθούν σε μεταβλητές και να περαστούν ως ορίσματα σε άλλες συναρτήσεις.
Μπορούν να χρησιμοποιηθούν ως τιμές επιστροφής.
Οι συναρτήσεις μπορούν επίσης να τοποθετηθούν σε μια ακολουθία (list, tuple κ.λπ.) ή ως τιμή σε ένα dict.
Οι συναρτήσεις μπορούν να χρησιμοποιηθούν οπουδήποτε μπορεί να χρησιμοποιηθεί οποιοδήποτε άλλο αντικείμενο.
Αυτό συμβαίνει επειδή οι συναρτήσεις είναι αντικείμενα πρώτης τάξης.
Ως τέτοιες, φέρουν ειδικά χαρακτηριστικά και μπορούν ακόμη και να ορίζουν τη λήψη και τον καθορισμό δικών τους προσαρμοσμένων χαρακτηριστικών.
# print is a function
# A function can be assigned to a variable.
>>> function_as_variable = print
>>> function_as_variable("Hello")
Hello
>>> type(fake_print)
<class 'builtin_function_or_method'>
# Functions can be passed as an argument to another function.
>>> def check_print(func):
func("Hello")
>>> check_print(print)
Hello
# Function can be used as an item in a sequence.
>>> my_list = [print, "Hello"]
>>> my_list[0]("Hello")
Hello
# Functions can be used as a value in a dictionary.
>>> my_dict = {"key": print}
>>> my_dict["key"]("Hello")
Hello
# Functions can be returned from a function.
>>> def return_func():
return print
>>> return_func()("Hello")
Hello
Οι συναρτήσεις μπορούν επίσης να είναι εμφωλευμένες μέσα σε άλλες συναρτήσεις.
def outer():
num = 10
# This is a nested, or "inner" function.
def inner():
print(num)
# Outer function calling inner function
inner()
Η εσωτερική συνάρτηση μπορεί να έχει πρόσβαση στη μεταβλητή num που ορίζεται στην εξωτερική συνάρτηση.
>>> outer()
10
Οι συναρτήσεις στην Python έχουν ειδικά χαρακτηριστικά. Μερικά από αυτά είναι:
__name__: Το όνομα της συνάρτησης__doc__: Η συμβολοσειρά τεκμηρίωσης της συνάρτησης__module__: Το module στο οποίο ορίζεται η συνάρτηση__globals__: Το λεξικό των καθολικών μεταβλητών της συνάρτησης__code__: Το αντικείμενο κώδικα που περιέχει τις εντολές της συνάρτησης>>> def add(first, second):
return first + second
# Function name
>>> print.__name__
'print'
>>> len.__name__
'len'
>>> add.__name__
'add'
# Function documentation
>>> abs.__doc__
'Return the absolute value of the argument.'
# Module
>>> len.__module__
'builtins'
>>> add.__module__
'__main__'
Ο πλήρης κατάλογος των χαρακτηριστικών των συναρτήσεων βρίσκεται στο Python DataModel.