PYTHON ΜΑΘΗΜΑ 20 – Functions (Part 2)

 

Δωρεάν Μαθήματα Python

ΕΙΣΑΓΩΓΗ

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

  • Τη δήλωση return: Πώς επιστρέφουμε δεδομένα και αποτελέσματα από μια συνάρτηση.
  • Τις παραμέτρους *args και **kwargs: Πώς διαχειριζόμαστε δυναμικά έναν μεταβλητό αριθμό ορισμάτων.
  • Συναρτήσεις ως ορίσματα (Callbacks): Το πώς περνάμε μια συνάρτηση σαν παράμετρο μέσα σε μια άλλη συνάρτηση.

Πώς Επιστρέφουμε Τιμές (How to Return Values)

Μέχρι τώρα, όλες οι συναρτήσεις (functions) που έχουμε γράψει χρησιμοποιούν απλώς την ενσωματωμένη συνάρτηση print() για να εμφανίσουν κάποιο αποτέλεσμα στο τερματικό (terminal).

Για παράδειγμα, αν θέλαμε να δούμε το αποτέλεσμα της πρόσθεσης δύο αριθμών, θα γράφαμε τον εξής κώδικα:

app.py

def add_two_numbers(numOne, numTwo):
    print(f"The sum of the two numbers is {numOne + numTwo}")


add_two_numbers(5, 6)

Output

Δωρεάν Μαθήματα Python

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

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

Δείτε πώς διαμορφώνεται το προηγούμενο παράδειγμά μας:

App.py

def add_two_numbers(numOne, numTwo):
    return numOne + numTwo


sum = add_two_numbers(5, 6)
print(f"The sum of the two numbers is {sum}")

 

Output

Δωρεάν Μαθήματα Python

Ας δούμε ένα ακόμα παράδειγμα το οποίο προσομοιώνει το στρίψιμο ενός νομίσματος (κορώνα ή γράμματα). Σε αυτό το παράδειγμα, θα εισαγάγουμε μια απλή λογική ελέγχου χρησιμοποιώντας if-else statements, ώστε να δείτε πώς μπορούμε να συνδυάσουμε τις δομές ελέγχου ροής (flow control statements) με την εντολή return.

App.py

from random import random


def flip_coin():
    if random() > 0.5:
        return "HEADS"
    else:
        return "TAILS"


result = flip_coin()
print(f"The result is {result}")

 

Output

Δωρεάν Μαθήματα Python

Χρήση Λίστας και Συνάρτησης ως Παραμέτρους (Using Lists and Functions as Parameters)

Στο προηγούμενο δωρεάν μάθημα Python (Functions Part 1) είχαμε δει πώς να περνάμε παραμέτρους (parameters) σε μια συνάρτηση (function).

Εκτός από κείμενο (strings) και αριθμούς, μπορούμε να περάσουμε και άλλους τύπους δεδομένων ως παραμέτρους, όπως λίστες (lists), λεξικά (dictionaries), ακόμα και άλλες συναρτήσεις!

Ας δούμε ένα παράδειγμα για το πώς περνάμε μια λίστα (list) ως παράμετρο σε μια συνάρτηση:

App.py

 

teams = ['Arsenal', 'Chelsea', 'Aston Villa',
         'Newcastle', 'Everton', 'Liverpool', 'Watford']


def teams_league(teams):
    for team in teams:
        print(team)


teams_league(teams)

 

Output

Δωρεάν Μαθήματα Python

 

Τώρα, ας δούμε ένα πολύ απλό παράδειγμα για το πώς μπορούμε να περάσουμε μια συνάρτηση (function) ως παράμετρο (parameter) μέσα σε μια άλλη συνάρτηση.

App.py

 

def add(a, b):
    return a+b


def subtract(a, b):
    return a-b


def math(a, b, fn):
    return fn(a, b)


print(math(10, 5, add))

print(math(10, 5, subtract))

 

Output

Δωρεάν Μαθήματα Python

Προβλήματα με την Εμβέλεια Μεταβλητών (Problems with Variable Scope)

Μέσα από μια συνάρτηση (function) δεν μπορούμε να τροποποιήσουμε απευθείας την τιμή μιας καθολικής μεταβλητής (global variable).

Μπορούμε, φυσικά, να τη χρησιμοποιήσουμε (για παράδειγμα, να δείξουμε την τιμή της μέσα από μια print()), αλλά δεν μπορούμε να της αναθέσουμε μια καινούργια τιμή με απλό τρόπο. Αν το προσπαθήσουμε, η Python είτε θα δημιουργήσει μια νέα, δική της τοπική μεταβλητή (local variable), είτε θα "πετάξει" σφάλμα.

Το παρακάτω παράδειγμα αναδεικνύει ακριβώς αυτό το πρόβλημα:

App.py

sum = 0


def adding_one():
    sum += 1
    return sum


print(adding_one())

 

Output

Δωρεάν Μαθήματα Python

Όπως καταλαβαίνετε και από το μήνυμα σφάλματος που εμφανίζεται, η Python προσπαθεί να βρει μια μεταβλητή με το όνομα sum μέσα στη συνάρτηση (function). Επειδή δεν γνωρίζει ότι η πρόθεσή μας είναι να αναφερθούμε στην καθολική (global) μεταβλητή, σταματάει την εκτέλεση του προγράμματος και μας εμφανίζει το λάθος που μόλις είδαμε.

Αν τώρα θέλουμε πραγματικά να μη δηλώσουμε μια νέα τοπική (local) μεταβλητή μέσα στη συνάρτηση, αλλά να τροποποιήσουμε την global μεταβλητή που έχει ήδη οριστεί απ' έξω, τότε πρέπει να ενημερώσουμε τη συνάρτηση για αυτή μας την πρόθεση. Αυτό το πετυχαίνουμε χρησιμοποιώντας τη λέξη-κλειδί global.

Ας δούμε πώς λύνεται το πρόβλημα:

App.py

sum = 0


def adding_one():
    global sum
    sum += 1
    return sum


print(adding_one())
print(sum)

 

Output

Δωρεάν Μαθήματα Python

Προσθήκη Docstrings στις Συναρτήσεις μας (Adding Docstrings to Our Functions)

Όταν μιλούσαμε στα πρώτα μας δωρεάν μαθήματα Python για το πώς ορίζουμε αλφαριθμητικά (strings), είχαμε αναφερθεί στα μονά εισαγωγικά (' '), στα διπλά εισαγωγικά (" ") και στα τριπλά εισαγωγικά (""" """).

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

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

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

 Δωρεάν Μαθήματα Python


Η Παράμετρος *args (The *args Parameter)

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

Αυτό που στην ουσία μάς δίνει τη δυνατότητα να περάσουμε πολλαπλά ορίσματα δεν είναι η λέξη "args", αλλά το σύμβολο του αστερίσκου (*). Αντί για args θα μπορούσαμε να χρησιμοποιήσουμε οποιαδήποτε άλλη λέξη θέλουμε (π.χ. *numbers). Απλώς, έχει καθιερωθεί παγκοσμίως ανάμεσα στους προγραμματιστές να γράφουν *args (από τη λέξη arguments).

Ας δούμε πώς μπορούμε να χρησιμοποιήσουμε το *args στην πράξη, καθώς υπάρχουν κάποιες ακόμα μικρές λεπτομέρειες στις οποίες πρέπει να αναφερθούμε:

App.py

def outputData(name, *args):
    print(type(args))
    for arg in args:
        print(arg)


outputData("Barcelona", "Read Madrid", True, "Liverpool", 2)

 

Output

Δωρεάν Μαθήματα Python

Παρατηρώντας το αποτέλεσμα, μπορούμε να βγάλουμε τα εξής πολύ σημαντικά συμπεράσματα:

  1. Σειρά παραμέτρων: Όταν χρησιμοποιούμε το *args σε συνδυασμό με άλλες, κανονικές παραμέτρους, το *args θα πρέπει να μπαίνει τελευταίο στη λίστα των παραμέτρων κατά τον ορισμό της συνάρτησης (function).
  2. Τύπος δεδομένων: Αν ελέγξετε τον τύπο (type) του args, θα διαπιστώσετε ότι η Python το μετατρέπει αυτόματα σε πλειάδα (tuple). Ο λόγος που δεν βλέπουμε την "Barcelona" σε αυτό το tuple κατά την εκτύπωση στο αποτέλεσμα (output), είναι επειδή η συγκεκριμένη λέξη περάστηκε ως τιμή στην κανονική παράμετρο name, και όχι στο args.
  3. Χρήση χωρίς αστερίσκο: Η τρίτη και τελευταία παρατήρηση είναι ότι, όταν καλούμε το args μέσα στο σώμα της συνάρτησης (όπως για παράδειγμα σε μια λούπα for), χρησιμοποιούμε μόνο το όνομα της μεταβλητής χωρίς τον αστερίσκο (γράφουμε args και όχι *args).

Ίσως το παρακάτω παράδειγμα με αριθμούς σας δώσει μια ακόμα καλύτερη εικόνα για τις δυνατότητες του *args:

App.py

def sum(*nums):
    total = 0
    for num in nums:
        total += num
    return total


print(sum(2, 4, 6,))
print(sum(2, 4, 6, 8, 10))

 

Output

Δωρεάν Μαθήματα Python

Η Παράμετρος kwargs (The kwargs Parameter)

Εκτός από το *args, πολλές φορές θα συναντήσετε και το kwargs (από τις λέξεις keyword arguments) να χρησιμοποιείται στον κώδικα της Python.

Το kwargs λειτουργεί ακριβώς με την ίδια λογική όπως το *args, με τη διαφορά ότι αντί να περνάμε μόνο τις τιμές, περνάμε μαζί και τα ονόματα των παραμέτρων.

Η Python αποθηκεύει αυτά τα δεδομένα ως λεξικό (dictionary). Πρόκειται, δηλαδή, για έναν συνδυασμό από ζεύγη κλειδιού (key) και τιμής (value). Στη συνέχεια, μέσα στη συνάρτηση, μπορούμε να χρησιμοποιήσουμε το όνομα του κλειδιού για να αποκτήσουμε πρόσβαση στην αντίστοιχη τιμή του.

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

App.py

def def output_data(**kwargs):
    print(type(kwargs))
    for key, value in kwargs.items():
        print("{} is {}".format(key, value))


output_data(firstTeam="Barcelona", secondTeam="Real Madrid", score="2-2")

 

Output

Δωρεάν Μαθήματα Python

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

 full-width

Post a Comment

0 Comments