Διάλεξη 31ης Οκτωβρίου 2016

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

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


def maxx(x, y):
    if x > y:
        return x
    else:
        return y

# Call the maxx function

z = 3 + 2**7
print(maxx(z, 129))

  1. Τα τυπικά ορίσματα x, y αποκτούν τις τιμές της μεταβλητής z και 129, αντίστοιχα.
  2. Η ροή εκτέλεσης του προγράμματος μεταφέρεται στην πρώτη εντολή στο σώμα της συνάρτησης maxx.
  3. Οι εντολές στο σώμα της συνάρτησης maxx εκτελούνται μέχρι την εμφάνιση της εντολής return expression, ή το τέλος των εντολών της συνάρτησης. Στην πρώτη περίπτωση η τιμή της έκφρασης expression γίνεται η τιμή της συνάρτησης. Αν η έκφραση expression είναι κενή ή δεν υπάρχει η εντολή return στο σώμα της συνάρτησης τότε η συνάρτηση επιστρέφει την τιμή None.
  4. Η κλήση της συνάρτησης αντικαθίσταται από την τιμή που επέστρεψε η συνάρτηση.
  5. Η ροή εκτέλεσης του προγράμματος συνεχίζεται με την πρώτη εντολή μετά την κλήση της συνάρτησης.

Ας δούμε ένα ακόμα παράδειγμα συνάρτησης:


def f(x):
    print('x =', x)
    x = 'abc'
    print('x =', x)
    x = 1
    x = x + 1
    y = x**2
    print('x =', x, 'y =', y)
    return x

x = 3
print('f =', f)
y = f(x)
print('x =', x, 'f(x) =', y)

Αν εκτελέσουμε το πρόγραμμα θα δούμε τα αποτελέσματα


x = 3
f = <function f at 0x1021da950>
x = abc
x = 2 y = 4
x = 3 f(x) = 4

Παρατηρούμε ότι το όνομα x εμφανίζεται τόσο ως τυπικό όρισμα της συνάρτησης f αλλά και στον κώδικα ο οποίος περιέχει την κλήση της συνάρτησης. Επίσης, το σώμα της συνάρτησης περιέχει την μεταβλητή y η οποία εμφανίζεται επίσης και εκτός του σώματος της συνάρτησης. Η Python, κατά τον ορισμό μιας συνάρτησης δημιουργεί τον λεγόμενο χώρο ονομάτων (namespace) ο οποίος περιέχει τόσο τα τυπικά ορίσματα της συνάρτησης αλλά και μεταβλητές τις οποίες χρησιμοποιεί, για τις ανάγκες της, η ίδια η συνάρτησης. Τα ονόματα αυτών των μεταβλητών είναι άγνωστα έξω από το χώρο ονομάτων. Αναφερόμαστε στις μεταβλητές που εμφανίζονται στο χώρο ονομάτων μιας συνάρτησης ως τοπικές μεταβλητές. Τα τυπικά ορίσματα συμπεριφέρονται κι αυτά ως τοπικές μεταβλητές μέσα στο σώμα της συνάρτησης όπως μαρτυρεί το παραπάνω παράδειγμα.

Προδιαγραφές. Είναι συνηθισμένο ο ορισμός μιας συνάρτησης να συνοδεύεται από κείμενο το οποίο αναφέρει το ρόλο της, εξηγεί τη σημασία των τυπικών ορισμάτων της και την τιμή που επιστρέφει η συνάρτηση. Τα δεδομένα αυτά ονομάζονται προδιαγραφές της συνάρτησης. Οι ενσωματωμένες συναρτήσεις της Python συνοδεύονται από προδιαγραφές τις οποίες μπορούμε να δούμε χρησιμοποιώντας την εντολή help:


>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

>>> help('math.exp')

Help on built-in function exp in math:

math.exp = exp(...)
    exp(x)
    
    Return e raised to the power of x.

Μπορούμε και εμείς να ορίσουμε τις προδιαγραφές μιας συνάρτησης χρησιμοποιώντας τριπλά εισαγωγικά αμέσως μετά την εντολή def:


def findRoot(x, power, epsilon):
    '''Assumes x and epsilon are int or float, power an int,
           epsilon > 0 & power >= 1
       Returns float y such that y**power is within epsilon of x.
           If such a float does not exist, it returns None'''

    if x < 0 and power%2 == 0:
        return None

    low = min(-1.0, x)
    high = max(1.0, x)
    ans = (high + low)/2.0

    while abs(ans**power - x) >= epsilon:
        if ans**power < x:
            low = ans
        else:
            high = ans
        ans = (high + low)/2.0

    return ans