Συναρτήσεις Κέρος Α. Ιωάννης Καθηγητής Πληροφορικής ΠΕ19 1 ο ΕΠΑΛ Κιλκίς
Συναρτήσεις - Εισαγωγή Τι είναι μία συνάρτηση; def numbers(): Επικεφαλίδα της συνάρτησης Μία συνάρτηση είναι: print 'One' ένα σύνολο εντολών, print 'Two' Σώμα της συνάρτησης οι οποίες αναφέρονται με ένα κοινό όνομα. print 'Three' Πως ορίζεται μία συνάρτηση; προσοχή στην στοίχιση def,(από την λέξη define=ορίζω) όνομα συνάρτησης,(που την κάνει να ταυτοποιείται μοναδικά) (), (μέσα στην οποία θα μπουν οι παράμετροι εισόδου, τα δεδομένα πάνω στα οποία θα ενεργήσει, αν τέτοια υπάρχουν και για τα οποία θα μιλήσουμε αργότερα σε αυτό το κεφάλαιο) : Εντολές return μεταβλητή / μεταβλητές, (η μεταβλητή/μεταβλητές μέσω των οποίων θα επιστραφεί το αποτέλεσμα, εφόσον θέλουμε η συνάρτηση να κάνει κάτι τέτοιο) Πως καλείται μία συνάρτηση; Απλά, αναφέροντας το όνομα της και χρησιμοποιώντας τον αντίστοιχο αριθμό παραμέτρων: numbers() One Two Three
Συναρτήσεις - Σπουδαιότητα Γιατί είναι σημαντικές; Γιατί μας επιτρέπουν να «βαπτίσουμε» ένα σύνολο εντολών με ένα όνομα και να το επαναχρησιμοποιούμε εύκολα και γρήγορα, απλά αναφέροντας το όνομα του. Η χρησιμοποίηση μιας συνάρτησης λέγεται κλήση της συνάρτησης. Ο ορισμός μίας νέας συνάρτησης κάνει το πρόγραμμα μικρότερο, απομακρύνοντας τμήματα κώδικα που επαναλαμβάνονται. Οι τυχόν αλλαγές διορθώσεις γίνονται σε ένα μόνο μέρος του προγράμματος. Γενικά διευκολύνουν στη συγγραφή, ανάγνωση, κατανόηση και διόρθωση του προγράμματος. Ειδικά στην Python: Οι συναρτήσεις μπορούν να αποθηκευτούν και σε ξεχωριστά αρχεία, εμπλουτίζοντας το ρεπερτόριο εντολών της γλώσσας. Υπάρχει άριστη υποστήριξη και ευελιξία. Υπάρχει μεγάλη γκάμα έτοιμων συναρτήσεων για ότι σχεδόν επιθυμείτε.
Συναρτήσεις - Σπουδαιότητα
Συναρτήσεις - Χρήσιμα Τι είναι οι παράμετροι μίας συνάρτησης; Οι συναρτήσεις τις περισσότερες φορές χρειάζονται δεδομένα πάνω στα οποία θα ενεργήσουν. Τα δεδομένα αυτά διοχετεύονται μέσα στην συνάρτηση μέσω μεταβλητών που τοποθετούνται μέσα στις παρενθέσεις της συνάρτησης και λέγονται παράμετροι. παράμετροι (είσοδος) ρίζα(χ) Που συνήθως γράφονται οι συναρτήσεις; Οι συναρτήσεις συνήθως γράφονται στην αρχή του προγράμματος και σε κάθε περίπτωση πριν από το σημείο που θα κληθούν (χρησιμοποιηθούν). Πόσες φορές μπορεί να κληθεί μία συνάρτηση; Δεν υπάρχει κανένας απολύτως περιορισμός. Κάθε φορά που καλώ μία συνάρτηση, πρέπει να χρησιμοποιώ τις ίδιες παραμέτρους; Όχι φυσικά. Το όνομα της συνάρτησης, πρέπει να υπακούει σε κάποιους κανόνες; Ακριβώς τους ίδιους με τα ονόματα των μεταβλητών και των σταθερών.
Συνάρτηση χωρίς παραμέτρους και επιστρεφόμενη τιμή Παράδειγμα Να γραφεί συνάρτηση με όνομα tragouda, η οποία να εμφανίζει το μήνυμα IRA OLE στην οθόνη. def tragouda(): print IRA OLE' tragouda() IRA OLE Παράδειγμα Να γραφεί συνάρτηση με όνομα epanalave_tragouda, η οποία να εμφανίζει το μήνυμα IRA OLE 2 φορές στην οθόνη χρησιμοποιώντας την συνάρτηση tragouda. def tragouda(): print IRA OLE' def epanalave_tragouda(): tragouda() tragouda() epanalave_tragouda() IRA OLE IRA OLE
Επιπλέον παραδείγματα 1. Τι κάνει η παρακάτω συνάρτηση printpython3(); def printpython3(): 2. Τι κάνει η παρακάτω συνάρτηση printpython9(); def printpython9(): 3. Πως μπορούμε να γράψουμε την συνάρτηση printpython9() με λιγότερες γραμμές; def printpython3(): def printpython9(): printpython3() printpython3() printpython3() 4. Να ορίσετε μια συνάρτηση η οποία να εμφανίζει 21 φορές τη λέξη Python, με αποκλειστική χρήση των συναρτήσεων printpython3() και printpython9().
Συνάρτηση - Εσοχές Παράδειγμα Σε τι διαφέρουν οι συναρτήσεις tragouda1() και tragouda2(); def tragouda1(): print '1o' print 'EPAL' def tragouda2(): print '1o' print 'EPAL' Είναι λοιπόν σημαντικές οι εσοχές;
Συνάρτηση Γενική μορφή def <όνομα συνάρτησης> ([λίστα παραμέτρων]): εντολές [return <αποτέλεσμα>] Παρατηρήσεις Ότι είναι τοποθετημένο μέσα σε αγκύλες [ ], δεν είναι υποχρεωτικό δηλαδή: μία συνάρτηση μπορεί να μην έχει παραμέτρους, δηλαδή δεν χρειάζεται να δεχθεί ως είσοδο δεδομένα και Μπορεί να μην επιστρέφει καμία τιμή πίσω στο σημείο από το οποίο κλήθηκε.
Συνάρτηση με παραμέτρους χωρίς επιστρεφόμενη τιμή def compare(a,b): if a>b: print a,'>',b elif a<b: print a,'<',b else: print a,'=',b compare(4,7) compare(5,5) x=8 y=2 compare(x,y) Παράμετροι ή Τυπικές Παράμετροι Parameters ή Formal Parameters Ορίσματα ή Πραγματικές Παράμετροι Arguments ή Actual Parameters def fun(x): print 'x=',x x=10 print 'x=',x y=0 fun(y) print 'y=',y SOS call by value (πέρασμα μέσω τιμής) ή pass by reference (πέρασμα μέσω αναφοράς) Οι μεταβλητές a, b δεν υφίστανται παρά μόνο όταν κληθεί η συνάρτηση compare. Τότε: Δημιουργούνται οι μεταβλητές a και b, Oι τιμές των μεταβλητών x και y αντιγράφονται στις αντίστοιχες a και b, Εκτελείται η συνάρτηση, Οι μεταβλητές a και b καταστρέφονται, ΧΩΡΙΣ να επιστρέψουν πίσω στις αντίστοιχες x και y τίποτα. x= 0 x= 10 y= 0
Παραδείγματα 1. Τι κάνει η παρακάτω συνάρτηση printpython(); def printpython(): for i in range(3): 2. Τι κάνει η παρακάτω συνάρτηση printpython(); def printpython(): for i in range(5): 3. Τι κάνει η παρακάτω συνάρτηση printpython(); def printpython(n): for i in range(n): Τι συμπεράσματα βγάζετε όσο αφορά το ρόλο των παραμέτρων; Γιατί υπάρχουν;
Συνάρτηση με παραμέτρους και επιστρεφόμενη τιμή 1. Ορίστε τις ακόλουθες συναρτήσεις add και times3. def add(arg1,arg2): result=arg1+arg2 return result def times3(arg): ginomeno=3*arg return ginomeno Η λέξη return είναι αυτή που στέλνει το αποτέλεσμα της συνάρτησης (μέσω της μεταβλητής στα δεξιά της) πίσω στο κύριο πρόγραμμα, στο σημείο από το οποίο κλήθηκε. 2. Εκτελέστε: x=add(10,18) print 'x=',x y=add('ab','ba') print 'y=',y z=times3(10) print 'z=',z q=times3('ira') print q=',q 3. Εκτελέστε: k=times3(2.5) print 'k=',k p=times3('python') print 'p=',p n=times3(times3(9)) print 'n=',n j=times3(add('ab','ab')) print 'j=',j
Επιπλέον παραδείγματα def sum1(a,b): a=a+1 b=b+1 return a+b z=1 w=2 print 'Πριν την κλήση' print 'z=',z print 'w=',w q=sum1(z,w) print 'Μετά την κλήση' print 'z=',z print 'w=',w print 'q=',q Πριν την κλήση z= 1 w= 2 Μετά την κλήση z= 1 w= 2 q= 5 Συζήτηση στην τάξη 1. Ομοιότητες διαφορές παραμέτρων ορισμάτων 2. Ομοιότητες διαφορές παραμέτρων μεταβλητών def sum1(a,b): a=a+1 b=b+1 return a+b z=1 w=2 print 'Πριν την κλήση' print 'z=',z print 'w=',w q=sum1(z,w) print 'Μετά την κλήση' print 'z=',z print 'w=',w print 'q=',q Πριν την κλήση z= 1 w= 2 Μετά την κλήση z= 1 w= 2 q= None None= Το απόλυτο ΤΙΠΟΤΑ Η λέξη None υποδεικνύει ότι η συνάρτηση sum δεν επιστρέφει τιμή. Η λέξη αυτή δεν είναι ούτε συμβολοσειρά, ούτε αριθμός και δεν μπορούμε να κάνουμε κανέναν υπολογισμό με αυτήν.
Συναρτήσεις δίχως return στο σώμα τους Εκτελέστε και σχολιάστε το παρακάτω πρόγραμμα. def func(): x=5+3 print func() None Συναρτήσεις χωρίς return επιστρέφουν το απόλυτο τίποτα (None)
Δραστηριότητα 1 Να γράψετε στην Python συνάρτηση με όνομα max η οποία θα δέχεται δύο ακεραίους αριθμούς και θα επιστρέφει στο πρόγραμμα τον μέγιστο από τους δύο. def max(a,b): if a>b: return a else: return b a=int(input('δώστε τον 1ο αριθμό:')) b=int(input('δώστε τον 2ο αριθμό:')) apot=max(a,b) print 'Ο μέγιστος είναι',apot def max(a,b): if a>b: return a else: return b a=int(input('δώστε τον 1ο αριθμό:')) b=int(input('δώστε τον 2ο αριθμό:')) c=int(input('δώστε τον 3ο αριθμό:')) apot=max(max(a,b),c) print 'Ο μέγιστος είναι',apot Η συνάρτηση max δουλεύει και για αλφαριθμητικά ή μόνο για αριθμούς; Δοκιμάστε το με ένα παράδειγμα. Τροποποιήστε το πρόγραμμα ώστε να βρίσκει τον μέγιστο από 3,4 και 6 αριθμούς.
Δραστηριότητα 2 Επισκεφτείτε την ηλεκτρονική διεύθυνση: http://blogs.sch.gr/gkeros και από το μενού Python Λογισμικό Διάφορα κατεβάστε το φύλλο εργασίας Rectangle και ακολουθείστε βήμα προς βήμα τις οδηγίες του.
Εμβέλεια μεταβλητών Καθολικές μεταβλητές (global variables) Δηλώνονται έξω από τις συναρτήσεις, Μπορούν να προσπελαστούν από οποιοδήποτε σημείο, δηλαδή και από το πρόγραμμα αλλά και μέσα σε κάθε συνάρτηση def add(x,y): s=x+y+k return s k=10 print add(7,3) print s 20 Traceback (most recent call last): File "C:\Users\gkeros\Desktop\sas.py", line 7, in <module> print s NameError: name 's' is not defined Η k είναι γνωστή στη συνάρτηση αφού έχει αναφερθεί στο πρόγραμμα Η s είναι άγνωστη στο πρόγραμμα
Εμβέλεια μεταβλητών συνέχεια Καθολικές μεταβλητές (global variables) def add(x,y): k=5 s=x+y+k print 'Μέσα στην συνάρτηση',k return s k=10 print add(7,3) print 'Έξω από την συνάρτηση',k def add(x,y): global k k=5 s=x+y+k print 'Μέσα στην συνάρτηση',k return s k=10 print add(7,3) print 'Έξω από την συνάρτηση',k Μέσα στην συνάρτηση 5 15 Έξω από την συνάρτηση 10 Αν υπάρχει τοπική και καθολική μεταβλητή με το ίδιο όνομα τότε μέσα στην συνάρτηση υπερισχύει η τοπική αλλά δεν επηρεάζει την τιμή της καθολικής εκτός αν. Μέσα στην συνάρτηση 5 15 Έξω από την συνάρτηση 5 Η δήλωση global μέσα στην συνάρτηση δηλώνει πως η μεταβλητή δεν είναι τοπική και γίνεται απευθείας αναφορά στην καθολική.
Συμβολοσειρές τεκμηρίωσης def sum1(x,y): '''Αθροίζει 2 αριθμούς ή συνενώνει 2 συμβολοσειρές''' return x+y a=sum1(2,3) print a b=sum1( IRA', OLE') print b print sum1. doc 5 IRAOLE Αθροίζει 2 αριθμούς ή συνενώνει 2 συμβολοσειρές Μέσα σε τριπλά εισαγωγικά βάζουμε μια γενική περιγραφή της συνάρτησης Με τον τρόπο αυτό (2 κάτω παύλες) εμφανίζεται η γενική περιγραφή που βάλαμε ενώ αν δεν βάλαμε εμφανίζεται η τιμή None
Προεπιλεγμένα ορίσματα def football(omada,sinthima=' ΟΛΕ'): print omada+sinthima football('ηρα',' ΟΜΑΔΑΡΑ') football('ηρα') ΗΡΑ ΟΜΑΔΑΡΑ ΗΡΑ ΟΛΕ Ο προγραμματιστής μπορεί να δίνει τιμές: είτε και στα δύο ορίσματα omada και sinthima (όπως κανονικά έχουμε μάθει έως σήμερα), είτε μόνο στο όρισμα omada (το δεύτερο όρισμα sinthima έχει την προεπιλεγμένη τιμή του ΟΛΕ. def printmessage(message1,message2,times=1): print (message1+message2)*times printmessage('hello',' boys',5) printmessage('hello','girls') Hello boyshello boyshello boyshello boyshello boys Hellogirls
Ορίσματα με λέξεις κλειδιά def func(a,b=1,c=2): print 'a=',a,'b=',b,'c=',c func(4,5,6) func(5,10) func(2,c=20) func(c=50,a=10) a= 4 b= 5 c= 6 a= 5 b= 10 c= 2 a= 2 b= 1 c= 20 a= 10 b= 1 c= 50 Τα βασικά πλεονεκτήματα είναι: Δημιουργία ευανάγνωστων συναρτήσεων, Η ελευθερία στη διάταξη (σειρά) των ορισμάτων def printmessage(message,separator,times=1): print (message+separator)*times printmessage(separator='!',times=10,message='beee') beee!beee!beee!beee!beee!beee!beee!beee!beee!beee!
Δραστηριότητα 3 - Επιστροφή πολλών αποτελεσμάτων def milestometersandfeet(miles): m=miles*1852 f=miles*5280 return m,f print 'Μετατροπή ναυτικών μιλίων σε μέτρα και πόδια' miles=float(input('πόσα είναι τα ναυτικά μίλια;')) meters,feet=milestometersandfeet(miles) print 'Μέτρα=',meters print 'Πόδια=',feet Μετατροπή ναυτικών μιλίων σε μέτρα και πόδια Πόσα είναι τα ναυτικά μίλια;100 Μέτρα= 185200.0 Πόδια= 528000.0