Συναρτήσεις (Functions)

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

Σε συντομία, για τις συναρτήσεις ισχύουν τα εξής:

  • Κάθε συνάρτηση πρέπει να φέρει ένα συγκεκριμένο και μοναδικό όνομα π.χ.:
    myFunction
  • Η λέξη def χρησιμοποιείται για να δηλωθεί μια συνάρηση πρέπει να προηγείται του ονόματος π.χ.:
    def myFunction
  • Κάθε όνομα συνάρτησης ακολουθείται από ένα ζεύγος παρενθέσεων π.χ.:
    def myFunction()
  • Για το μπλοκ εντολών κάθε συνάρτησης ισχύει ότι και για τα μπλοκ γενικότερα π.χ.:
    def myFunction():
        ... 
        ... 
    
  • Στις παρενθέσεις της συνάρτησης μπορεί να περιέχονται 0, 1 ή περισσότερες παράμετροι
  • Κάθε συνάρτηση καλείται με το όνομά της (π.χ.: myFunction()
  • Οι εντολές που περιέχει μια συνάρτηση εκτελούνται όταν η συνάρτηση κληθεί με το ονομά της
  • Κάθε συνάρτηση μπορεί να κληθεί άπειρες φορές
  • Σε ένα πρόγραμμα προφανώς θα υπάρχουν πολλές συναρτήσεις

Μορφή συνάρτησης

Η γενική μορφή μιας συνάρτησης είναι:

def FunctionName([param[, param[, ... param]]]):
    ... 
    ... 

Στο ακόλουθο απλό παράδειγμα έχει οριστεί μια συνάρτηση με το όνομα hello() η οποία καλείται και εκτελείται.

def hello():
    print("Hello python")

hello()

Όταν καλείτε τη συνάρτηση με το όνομά της θα πρέπει να μην ξεχνάτε και τις παρενθέσεις (hello() και όχι hello).

Συναρτήσεις με παραμέτρους

Κάθε συνάρτηση μπορεί να δεχτεί παραμέτρους. Αυτό προσφέρει στη συνάρτηση μεγαλύτερη λειτουργικότητα και περισσότερες δυνατότητες.

Γενικά:

  • Μια συνάρτηση μπορεί να έχει περισσότερες της μίας παραμέτρους
  • Περισσότερες της μίας παράμετροι, πρέπει να χωρίζονται με κόμμα
  • Κάθε παράμετρος πρέπει να έχει μοναδικό όνομα
  • Το όνομα κάθε παραμέτρου πρέπει να αποτελείται από αλφαριθμητικά στοιχεία (όπως στις μεταβλητές)
  • Όλες οι παράμετροι καταχωρούνται μέσα στις παρενθέσεις της συνάρτησης
  • Όταν καλείται μια συνάρτηση, πρέπει να ορίζονται και οι τιμές για τις αντίστοιχες παραμέτρους. Οι τιμές αυτές λέγονται ορίσματα.

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

def wellcome(txt):
    print(txt)

wellcome("Καλώς ορίσατε στην python")

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

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

def getDouble(x):
    print(2*x)

x = int(input("Please enter an integer: "))

getDouble(x)

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

Συναρτήσεις που επιστρέφουν τιμές (return)

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

Στο παρακάτω παράδειγμα η συνάρτηση getOpposite() επιστρέφει τον αρνητικό αριθμό που θα της ζητηθεί.

def getOpposite(x):
    temp = -x
    return temp

getOpposite(123)

Ή αν προτιμάτε πιο σύντομα

def getOpposite(x):
    return -x

getOpposite(123)

Η εντολή return μπορεί επίσης να χρησιμοποιηθεί για να διακοπεί η εκτέλεση της συνάρτησης σε κάποιο σημείο.

def f(x):
    if(x<0):
        print("negative")
        return
    print("positive")

f(-1)

Προκαθορισμένες τιμές παραμέτρων (Default parameters)

Μπορούμε να προκαθορίσουμε τιμές στις παραμέτρους μιας συνάρτησης. Έτσι, αν κληθεί η συνάρτηση χωρίς όρισμα η παράμετρος θα πάρει την προκαθορισμένη τιμή.

Θα πρέπει οι παράμετροι με προκαθορισμένες τιμές να ακολουθούν αυτές με μη προκαθορισμένες.

def f(w = 100):
    print(w)

f()

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

def f(username, password = '123456'):
    if(username == "admin" and password == "123456"):
        print("logedin")
    else:
        print("logedout")

f('admin')

ή

Η προκαθορισμένη τιμή γίνεται overriden.

def f(username, password = '123456'):
    if(username == "admin" and password == "123456"):
        print("logedin")
    else:
        print("logedout")

f('admin', '654321')

Για να προσπεράσουμε την πρώτη παράμετρο με προκαθορισμένη τιμή μπορούμε να καλέσουμε όπως παρακάτω:

Αυτά το ορίσματα λέγονται: keyword arguments ενώ τα απλά ορίσματα λέγονται positional arguments.

def f(username = 'admin', password):
    if(username == "admin" and password == "123456"):
        print("logedin")
    else:
        print("logedout")

f(username = 'admin', password = '123456')

Φωλιασμένες συναρτήσεις (nested functions)

Στην python μια συνάρτηση μπορεί να δηλωθεί μέσα σε μια άλλη συνάρτηση.

Μια φωλιασμένη συνάρτηση μπορεί να κληθεί μόνο από τη γονική (parent) συνάρτηση.

def fun():
    def f():
        print("nested function")
    f()

fun()
"nested function"

Κλειστότητα (Closure)

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

Ισχύει το παρακάτω παράδειγμα:

def fun():
    x = 123
    def f():
        print(x)
    f()

fun()
123

Αλλά όχι το παρακάτω παράδειγμα:

def fun():
    def f():
        a = 123
    print(a)

fun()
name 'a' is not defined

Αναδρομικές συναρτήσεις (recursive functions)

Η διαδικασία όπου μια συνάρτηση καλεί τον εαυτό της λέγεται αναδρομή και οι συναρτήσεις αυτές λέγονται αναδρομικές.

Παράδειγμα με αναδρομική συνάρτηση.

def countDown(n):
   if(n==0):
      print("Go!")
   else:
      print(n)
      countDown(n-1)

countDown(5)
5
4
3
2
1
Go!   

Ολοκληρωμένος ορισμός συνάρτησης παραγοντικού.

def factorial(n):
   if(n==0):
      return 1
   else:
      return n*factorial(n-1)

factorial(5)
120

Η μαθηματική συνάρτηση Fibonacci ορισμένη στη γλώσσα Python.

def fibonacci(n):
   if(n==0 or n==1):
      return 1
   else:
      return fibonacci(n-1) + fibonacci(n-2)
   print(n)

fibonacci(5)
8