Python

ΕΝΟΤΗΤΑ 15 - Functions (Part 1)

image description

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

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

App.py

hours = int(input('Hours worked: '))
hourly_rate = float(input('Hourly rate: '))

salary = hours * hourly_rate

print('Your salary is ', salary)

Output

Hours worked: 35
Hourly rate: 25
Your salary is  875.0	

Τώρα σε αυτό το πρόγραμμα θέλουμε να προσθέσουμε επίσης τον υπολογισμό του φόρου που υποχρεούται να πληρώσει ο εργαζόμενος.

App.py

hours = int(input('Hours worked: '))
hourly_rate = float(input('Hourly rate: '))

salary = hours * hourly_rate

taxes = (salary * 30) /100 

print('Your salary is ', salary)
print('Your taxes is ', taxes)		

Output

Hours worked: 40
Hourly rate: 25
Your salary is  1000.0
Your taxes is  300.0		

Τι παρατηρούμε σε αυτό το απλό πρόγραμμα? Ότι κάθε φορά που υπάρχει ανάγκη να προσθέσουμε μια καινούργια λειτουργία ο κώδικας μας μεγαλώνει χωρίς όμως μια συγκεκριμένη δομή. Απλά προσθέτουμε έξτρα γραμμές κώδικα για να υλοποιήσουμε την εκάστοτε ανάγκη. Σε μια πραγματική εφαρμογή ο υπολογισμός του μισθού ενός εργαζόμενου δεν είναι τόσο απλός. Θα πρέπει να περιέχει κώδικα για τον υπολογισμό, τουλάχιστον, των παρακάτω ενεργειών:

  • Να λαμβάνει από τον χρήστη την πληρωμή ανά ώρα
  • Να λαμβάνει από τον χρήστη τις ώρες που δούλεψε
  • Να υπολογίζει το μεικτό και το καθαρό μισθό
  • Να υπολογίζει τυχόν υπερωρίες που υπάρχουν
  • Να εκτυπώνει αντίγραφο της πληρωμής

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

Για λύσουμε αυτό το πρόβλημα χρησιμοποιούμε functions. Βασικά αυτό που στην πραγματικότητα κάνουμε είναι να οργανώσουμε τον κώδικα μας σε blocks όπου κάθε block εκτελεί μόνο μια ενέργεια. Τι είναι λοιπόν ένα function? Είναι η ομαδοποίηση γραμμών κώδικα που υπάρχουν στον κώδικα μας έτσι ώστε να προσφέρουν μια συγκεκριμένη υπηρεσία. Οπότε, αντί να γράφουμε ένα αρχείο με πολλές γραμμές κώδικα, θα μπορούσαμε να είχαμε γράψει πολλαπλά functions με κάθε function να εκτελεί ένα συγκεκριμένο task.

Αν τώρα θέλουμε να γυρίσουμε πίσω στο παράδειγμα μας, νομίζω θα ήταν απολύτως λογικό να λέγαμε ότι κάθε ένα από τα bullet points της παραπάνω λίστας θα μπορούσε να αντιπροσωπευτεί από ένα function.

Σκεφτείτε πόσο πιο εύκολο θα είναι να προσθέσετε ή να διορθώσετε τον κώδικα σας αν αντί για αυτό:

Δωρεάν Μαθήματα και Σεμινάρια PYTHON

Έχετε οργανώσει τον κώδικα σας με functions κάπως έτσι:

Δωρεάν Μαθήματα και Σεμινάρια PYTHON

Με αυτό τον τρόπο ο κώδικας θα είναι οργανωμένος, και θα μπορείτε πολύ εύκολα να βρείτε τα σημεία στα οποία θέλετε να προσθέσετε καινούργια tasks. Το πιο σημαντικό πλεονέκτημα όμως είναι ότι θα αποφύγετε να επαναλαμβάνετε τον ίδιο κώδικα ξανά και ξανά. Γράφοντας είναι function μια φορά, μπορείτε μετά να το καλέσετε όσες φορές θέλετε σε οποιοδήποτε σημείο του προγράμματος σας. Με αυτό το πλεονέκτημα θα μπορείτε να αναπτύξετε κώδικα πολύ γρήγορα αλλά και να τεστάρετε εύκολα την λειτουργία του κώδικα σας.

Για να δημιουργήσουμε ένα function, θα πρέπει να του δώσουμε ένα όνομα. Οι κανόνες για να ονομάσουμε ένα function είναι οι ίδιοι με εκείνους που χρησιμοποιούμε για να ονομάσουμε τις μεταβλητές μας. Με άλλα λόγια, δεν μπορούμε να ονομάσουμε ένα function με κάποιο όνομα που ήδη χρησιμοποιεί η ίδια η Python, το όνομα του function δεν μπορεί να περιέχει κενά, και ο πρώτος χαρακτήρας πρέπει να είναι γράμμα ή το underscore ( _ ).

Η γενική δομή για να δημιουργήσουμε ένα function είναι ο εξής:

def function_name():

statement

statement

etc...

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

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

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

App.py

def favorite_team():
	print('Everyone has a favorite soccer team')
	print('mine is Barcelona')

favorite_team()

Output

Everyone has a favorite soccer team
mine is Barcelona			

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

App.py

def favorite_team():
	print('Everyone has a favorite soccer team')
	print('mine is Barcelona')

favorite_team()
favorite_team()
favorite_team()

Output

Everyone has a favorite soccer team
mine is Barcelona
Everyone has a favorite soccer team
mine is Barcelona
Everyone has a favorite soccer team
mine is Barcelona				

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

App.py

def main():
	message()
	favorite_team()

def message():
	print('Everyone has a favorite team')

def favorite_team():
	print('mine is Barcelona')


main()

Output

Everyone has a favorite team
mine is Barcelona

Με τα functions πρέπει να προσέχουμε το indentation. Οι γραμμές κώδικα που ανήκουν σε κάθε function πρέπει να έχουν ένα κενό διάστημα στην αρχή για να αναγνωρίζει η Python ότι ανήκουν σε function και όχι στο κύριο πρόγραμμα. Την ίδια λογική είχαμε συναντήσει και στα if else statements όπως και στα loops.

Μέσα στα functions μπορούμε να δημιουργήσουμε μεταβλητές. Το εύρος αυτών των μεταβλητών είναι local δηλαδή μόνο κώδικας ή statements μέσα από την ίδια τη function μπορούν να έχουν πρόσβαση σε αυτές και να τις χρησιμοποιήσουν. Άλλα functions ή κώδικας από το κύριο μέρος της εφαρμογής δεν μπορούν να «δουν» τις τοπικές μεταβλητές που έχουν οριστεί μέσα στα functions και κατά συνέπεια δεν μπορούν να τις χρησιμοποιήσουν.

App.py

def main():
    message()
    favorite_team()

def message():
    print('Everyone has a favorite team')

def favorite_team():
    team = 'Barcelona'
    print('mine is', team)


main()
         

Output

Everyone has a favorite team
mine is Barcelona

Η χρησιμότητα του Function δεν ορίζεται μόνο από το γεγονός ότι αποφεύγουμε να επαναλαμβάνουμε τον ίδιο κώδικα πολλαπλές φορές μέσα στο πρόγραμμα μας αλλά ορίζεται και από την δυνατότητα να περνάμε τιμές στην function μέσω παραμέτρων.

Για μπορέσει ένα function να δεχτεί τιμές θα πρέπει να ορίσουμε μια ή και περισσότερες parameter variables. Ο ορισμός των parameter variables γίνεται μέσα στην παρένθεση του function. Όταν καλούμε το function απλά περνάμε μέσα στην παρένθεση τόσες τιμές όσες είναι και οι parameter variables.

App.py

def main():
    message()
    favorite_team('Barcelona')

def message():
    print('Everyone has a favorite team')

def favorite_team(team):
    print('mine is', team)


main()

         

Output

Everyone has a favorite team
mine is Barcelona

Μπορούμε να προκαθορίσουμε την τιμή που θα έχουν οι parameter variables σε περίπτωση που δεν δώσουμε εμείς κάποια τιμή όταν καλούμε την function. Με άλλα λόγια μπορούμε να ορίσουμε μια default τιμή. Εάν περάσουμε εμείς κάποια τιμή στην function τότε η default τιμή δεν υπολογίζεται. Στο παρακάτω παράδειγμα καλούμε την function favorite_team( ) μια φορά με τιμή και μια δεύτερη χωρίς να περάσουμε καμία τιμή μέσα στην παρένθεση.

App.py

def main():
    message()
    favorite_team('Barcelona')
    favorite_team()

def message():
    print('Everyone has a favorite team')

def favorite_team(team='Liverpool'):
    print('mine is', team)


main()

         

Output

Everyone has a favorite team
mine is Barcelona
mine is Liverpool

Τέλος, μπορούμε να ορίσουμε μεταβλητές που η χρήση τους είναι προαιρετική. Αν δώσουμε κάποια τιμή θα χρησιμοποιηθούν, αν όχι τότε θα αγνοηθούν. Για να δηλώσουμε μια προαιρετική μεταβλητή στο παράδειγμα μας, απλά δηλώνουμε την μεταβλητή να είναι ίση με ένα κενό string.

App.py

def main():
    message()
    favorite_team('Barcelona')
    favorite_team()
    favorite_team('Barcelona', 'Spain')

def message():
    print('Everyone has a favorite team')

def favorite_team(team='Liverpool', country=""):
    if country:
        print('Your favorite team is {} from {}'.format(team, country))
    else:
        print('Your favorite team is {}'.format(team))

main()

         

Output

Everyone has a favorite team
Your favorite team is Barcelona
Your favorite team is Liverpool
Your favorite team is Barcelona from Spain

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

App.py

def main():
    message()
    favorite_team('Barcelona')
    favorite_team()
    favorite_team('Barcelona', 'Spain')
    favorite_team(country='Germany', team='Bayern')


def message():
    print('Everyone has a favorite team')

def favorite_team(team='Liverpool', country=""):
    if country:
        print('Your favorite team is {} from {}'.format(team, country))
    else:
        print('Your favorite team is {}'.format(team))

main()

         

Output

Everyone has a favorite team
Your favorite team is Barcelona
Your favorite team is Liverpool
Your favorite team is Barcelona from Spain
Your favorite team is Bayern from Germany

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

Μιχάλης Κασάπογλου

Ο Μιχάλης Κασάπογλου, είναι ένας από τους πιο έμπειρους τεχνικούς εκπαιδευτές στον χώρο του προγραμματισμού με πάνω από 20 χρόνια εμπειρία. Έχει εργαστεί σαν IT Operations Manager, Senior Programmer, και Training Team Leader ενώ κατέχει και αρκετές πιστοποιήσεις που καλύπτουν ένα μεγάλο φάσμα τεχνολογιών στο προγραμματισμό, σε βάσεις δεδομένων και cloud. Στον ελεύθερο του χρόνο διατηρεί ένα τεχνολογικό blog στο οποίο θα βρείτε αρκετά δωρεάν μαθήματα προγραμματισμού για αρχάριους.

loader