Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ Εισαγωγή στην γλώσσα προγραμματισμού Ακαδημαϊκό έτος 2016-2017, Εαρινό εξάμηνο Οι σημειώσεις βασίζονται στα συγγράμματα: A byte of Python (ελληνική μετάφραση): e-book στην τοποθεσία http://dide.flo.sch.gr/plinet/meetings/meeting23/a_byte_of_python-el.pdf ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Σελίδα - 1 -
Συναρτήσεις στην Python 1. Γιατί χρησιμοποιούμε συναρτήσεις Φανταστείτε ότι πρέπει να δημιουργήσετε ένα μεγάλο πρόγραμμα στο οποίο σε διαφορετικά του σημεία γίνεται η ίδια λειτουργία (επαναλαμβάνεται ο ίδιος κώδικας) σε ίδια ή διαφορετικά δεδομένα. Ένα πρόγραμμα, για παράδειγμα, μπορεί να χρειάζεται να υπολογίσει σε διαφορετικά μέρη του το ολοκλήρωμα μιας τετραγωνικής ρίζας σε διαφορετικά διαστήματα. Σε πολλές περιπτώσεις, όμως, ο κώδικας αυτός μπορεί να είναι και ιδιαίτερα μεγάλος. Αυτό που πετυχαίνουμε με τις συναρτήσεις είναι να ορίσουμε (προγραμματίσουμε) αυτόν τον κώδικα που θέλουμε να χρησιμοποιήσουμε επαναλαμβανόμενα, ξεχωριστά και έξω από το βασικό μας πρόγραμμα. Με αυτόν τον τρόπο θα μπορούμε να τον καλούμε από εκεί που τον έχουμε τοποθετήσει όσες φορές χρειαστεί και σε όποιο σημείο του βασικού μας προγράμματος μας χρειάζεται. Αν, λοιπόν, για παράδειγμα, χρειαζόμαστε να τυπώνεται στην οθόνη, σε διαφορά σημεία του προγράμματος, το: ΤΕΙ Ιονίων Νήσων Τμήμα Διοίκησης & Οικονομίας θα μπορούσαμε να δημιουργήσουμε μία συνάρτηση εκτύπωσης της συγκεκριμένης φράσης και στην συνέχεια να την καλούμε από όποιο σημείο του προγράμματός μας επιθυμούμε. Κάποιες από τις υπάρχουσες γλώσσες προγραμματισμού, όπως π.χ. η Pascal, πραγματοποιεί ένα διαχωρισμό ανάμεσα σε συναρτήσεις και διαδικασίες. Διαδικασίες είναι οι συναρτήσεις που δεν επιστρέφουν κάποια τιμή. Οι συναρτήσεις, αντίθετα, επιστρέφουν κάποια τιμή μετά την κλήση τους. Στο παράδειγμα του ολοκληρώματος μιλάμε για μια συνάρτηση εφόσον επιστρέφει σαν αποτέλεσμα της κλήσης της έναν πραγματικό αριθμό. Από την άλλη η εκτύπωση του μηνύματος: ΤΕΙ Ιονίων Νήσων, Τμήμα Διοίκησης & Οικονομίας δεν επιστρέφει κάποια τιμή οπότε θεωρείτε διαδικασία. Στην Pyhton δεν γίνεται διάκριση ανάμεσα στις διαδικασίες και στις συναρτήσεις. 2. Πως ορίζουμε και πως καλούμε μια συνάρτηση στην Python; Ορισμός συνάρτησης Απαραίτητα στοιχεία για τον ορισμό μιας συνάρτησης: Σε κάθε συνάρτηση δίνουμε ένα όνομα. Το όνομα θα είναι αυτό που θα χρησιμοποιήσουμε αργότερα, μέσα στο κυρίως πρόγραμμα μας, για να καλέσουμε την συνάρτηση. Μια συνάρτηση ορίζεται με τη λέξη-κλειδί def, η οποία ακολουθείται από το όνομα της συνάρτησης. ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Σελίδα - 2 -
Το όνομα της συνάρτησης ακολουθούν, μέσα σε δύο παρενθέσεις οι παράμετροί της που μπορεί να είναι κανένας (χρησιμοποιούμε τις κενές παρενθέσεις), ένας ή παραπάνω. Οι παράμετροι ακολουθούνται από τον κυρίως κώδικα της συνάρτησης. Προσοχή!!!! Όπως και στις προηγούμενες δομές που είδαμε, πριν ξεκινήσουν κάποιες ομαδοποιημένες εντολές, βάζουμε μία άνω και κάτω τελεία. Ο κώδικας που ακολουθεί πρέπει και αυτός να είναι στοιχισμένος με εσοχή (χρησιμοποιείστε tab) προς τα μέσα Μέσα στον κώδικα μπορεί να υπάρχει (αλλά όχι απαραίτητα) η εντολή return, η οποία χρησιμοποιείται έτσι ώστε να επιστρέψει η συνάρτηση μια τιμή, δλδ. το αποτέλεσμά της. Παραδείγματα: 1. Συνάρτηση για την εκτύπωση μηνύματος # ορισμός συνάρτησης για εκτύπωση μηνύματος def tei(): # δεν χρειάζονται ορίσματα για την συνάρτηση με όνομα tei print('τει Ιονίων Νήσων') print('τμήμα Διοίκησης & Οικονομίας') # δεν χρειαζόμαστε την συνάρτηση # return εφόσον δεν επιστρέφουμε τιμή 2. Συνάρτηση για τον υπολογισμό αθροίσματος των αριθμών 1.. 10 # ορισμός συνάρτησης αθροίσματος def sum1_10(): # δεν χρειάζονται ορίσματα για την συνάρτηση εφόσον γνωρίζουμε τους αριθμούς που πρέπει να προσθέσουμε sum=0 for i in range(1,11): sum=sum + i return sum # η συνάρτηση return τώρα επιστρέφει την τελική τιμή της μεταβλητής sum Κλήση (χρήση) μιας συνάρτησης Ο τρόπος κλήσης διαφέρει ανάλογα με τον αν η συνάρτηση επιστρέφει ή όχι τιμή. Έτσι: ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Σελίδα - 3 -
Αν η συνάρτηση δεν επιστρέφει κάποια τιμή (δεν έχουμε χρησιμοποιήσει την συνάρτηση return στον ορισμό της) η κλήση της γίνεται απλά αναφέροντας το όνομα της συνάρτησης (στο παράδειγμα μας tei()) Αν η συνάρτηση επιστρέφει κάποια τιμή αυτή θα πρέπει να εκχωρηθεί σε κάποια μεταβλητή έτσι ώστε να αποθηκευτεί και να χρησιμοποιηθεί (στο παράδειγμα μας θα μπορούσαμε για παράδειγμα να κάνουμε εκχώρηση σε μια μεταβλητή x ως εξής x=sum1_10()). Μπορούμε επίσης να χρησιμοποιήσουμε την τιμή επιστροφής καλώντας όπως στην πρώτη περίπτωση. Ένα ολοκληρωμένο πρόγραμμα με την χρήση των δύο συναρτήσεων που ορίσαμε προηγουμένως θα μπορούσε να είναι το: # ορισμός συνάρτησης για εκτύπωση μηνύματος def tei(): # δεν χρειάζονται ορίσματα για την συνάρτηση με όνομα tei print('τει Ιονίων Νήσων') print('τμήμα Διοίκησης & Οικονομίας') # δεν χρειαζόμαστε την συνάρτηση # return εφόσον δεν επιστρέφουμε τιμή # ορισμός συνάρτησης αθροίσματος def sum1_10(): # δεν χρειάζονται ορίσματα για την συνάρτηση εφόσον γνωρίζουμε τους αριθμούς που πρέπει να προσθέσουμε sum=0 for i in range(1,11): sum=sum + i return sum # η συνάρτηση return τώρα επιστρέφει την τελική τιμή της μεταβλητής sum y=0 tei() x=sum1_10() print(x) y=3*x-5*(sum1_10()/2) Κυρίως πρόγραμμα με διαφορετικές κλήσεις στις συναρτήσεις print(y) Τι εκτυπώνει το παραπάνω πρόγραμμα; Προσέξτε ότι μπορούμε να χρησιμοποιήσουμε το x αλλά και την κλήση sum1_10() για τον υπολογισμό του y και το αποτέλεσμα είναι το ίδιο ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Σελίδα - 4 -
3. Παράμετροι Αλλά πότε σε μια συνάρτηση χρησιμοποιούμε παραμέτρους; Η απάντηση είναι όταν κάθε φορά που θέλουμε να κάνουμε κλήση στην συνάρτηση μας, μας χρειάζεται αυτή να μας δίνει αποτελέσματα σε διαφορετικά αποτελέσματα κάθε φορά. Για παράδειγμα αν θέλουμε η συνάρτηση sum1_10 σε κάποιο σημείο του προγράμματος να μας επιστρέφει το άθροισμα από 1 έως και 10 ενώ σε άλλο σημείο του προγράμματος να μας επιστρέφει το άθροισμα από 1 έως και 20. Σε αυτή τη περίπτωση θα μπορούσαμε να δημιουργήσουμε μια συνάρτηση αθροίσματος με μη φραγμένο (γνωστό εξ αρχής) άνω όριο, αλλά μια συνάρτηση που θα υπολογίζει γενικά το άθροισμα 1+2+...+Ν. Έτσι κάθε φορά που θα την καλούμε μπορούμε να ορίσουμε για ποιο Ν θέλουμε να υπολογιστεί. Αυτό το Ν είναι αυτό που ονομάζουμε παράμετρο. Ας δούμε λοιπόν πώς μπορούμε να γράψουμε την sum1_10 όταν, αντί για το άθροισμα 1+2+...+10, υπολογίζει το άθροισμα 1+2+...+Ν (ή γενικότερα, το a+(a+1)+(a+2)+...+(b-2)+(b-1)+b). Το άθροισμα, δηλαδή, όλων των αριθμών στο κλειστό διάστημα [a,b]. Σε αυτή την περίπτωση μέσα στην παρένθεση της συνάρτησης πρέπει να ορίσουμε δύο παραμέτρους: την αρχή και το τέλος του διαστήματος, τα a και b δηλαδή. Στον κώδικα οι επαναλήψεις του βρόχου θα ξεκινούν από το a και θα φτάνουν έως και το b, άρα το range θα έχει σαν πρώτο όρισμα μέσα στην παρένθεση το a και σαν δεύτερο το b+1 def suma_b(a,b): sum1=0 for i in range(a, b+1): sum1 = sum1+i return sum1 ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Σελίδα - 5 -
Παράδειγμα: Δημιουργήστε μια συνάρτηση σε Python η οποία δημιουργεί μία λίστα, η οποία θα περιέχει τους ακέραιους αριθμούς από το 1 μέχρι το 100 οι οποίοι διαιρούνται με το 2 και το 3 αλλά όχι με το 5 και θα επιστρέφει αυτή την λίστα. Στην συνέχεια κάντε μια κλήση στο κυρίως πρόγραμμα έτσι ώστε: να εκτυπώσετε αυτή τη λίστα να προσθέσετε σε κάθε στοιχείο της λίστας τον αριθμό 1 και να εκτυπώσετε την νέα λίστα Λύση def lista(): L=[] for x in range (1, 101): if x%2 ==0 and x%3==0 and x%5!=0: L.append(x) return L lista_klhshs=lista() print(lista_klhshs) z=len(lista_klhshs) L1=[] for i in range(0, z): lista_klhshs[i]=lista_klhshs[i]+1 L1.append(lista_klhshs[i]) print(l1) ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Σελίδα - 6 -
Ασκήσεις Άσκηση 1 Αρχικά δημιουργήστε μια συνάρτηση η οποία θα υπολογίζει και θα επιστρέφει το παραγοντικό ενός γενικού αριθμού n. Για την κλήση της συνάρτησης από το κυρίως πρόγραμμα χρησιμοποιήστε ένα αριθμό τον οποίο το πρόγραμμα θα διαβάζει από το πληκτρολόγιο. Σημείωση: το παραγοντικό ενός αριθμού n ορίζεται ως εξής: αν ο αριθμός είναι αρνητικός (n<0) τότε δεν υπάρχει το παραγοντικό του και επομένως θα πρέπει να εμφανίζεται κατάλληλο μήνυμα αν ο αριθμός είναι το n=0 τότε το παραγοντικό του είναι το 1 αν ο αριθμός είναι μεγαλύτερος ή ίσος από το 1 τότε το παραγοντικό του υπολογίζεται ως το γινόμενο του αριθμού n με το παραγοντικό του αριθμού n-1 Άσκηση 2 Αρχικά δημιουργήστε μία συνάρτηση η οποία θα δέχεται σαν είσοδο μία λίστα πραγματικών αριθμών και θα τη χωρίζει σε μία λίστα θετικών αριθμών και σε μία λίστα αρνητικών αριθμών, ενώ θα μετράει πόσες φορές εμφανίζεται στη δοθείσα λίστα το μηδέν. Στη συνέχεια στο πρόγραμμα σας εμφανίστε κάνοντας κλήση στην συνάρτηση την θετική και την αρνητική λίστα καθώς και το πλήθος των μηδενικών Άσκηση 3 Η μισθοδοσία για κάθε εργαζόμενο στην εταιρία Αρβίρογλου Α.Ε. προκύπτει από τον παρακάτω πίνακα: Έτη Προϋπηρεσίας Βασικός Μισθός( ) 0-2 3-8 9-15 16 και άνω 800 1250 1600 1900 Ποσοστό αύξησης επί του βασικού (%) 5 7 12 15 Οι αποδοχές κάθε εργαζομένου υπόκεινται σε κρατήσεις 11%. Να αναπτυχθεί πρόγραμμα σε Python το οποίο: Α. θα διαβάζει επαναληπτικά το όνομα του εργαζόμενου και τα έτη προϋπηρεσίας του. Η επανάληψη θα τερματίζεται με την εισαγωγή του χαρακτήρα @ ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Σελίδα - 7 -
Β. θα καλεί υποπρόγραμμα (συνάρτηση) για τον υπολογισμό του βασικού μισθού Γ. θα καλεί υποπρόγραμμα για τον υπολογισμό του ποσού της αύξησης Δ. θα υπολογίζει τις συνολικές μικτές αποδοχές ως το άθροισμα του βασικού μισθού και της αύξησης Ε. θα καλεί υποπρόγραμμα που θα δέχεται τις μικτές αποδοχές και θα επιστρέφει το καθαρό ποσό μετά τις παρακρατήσεις καθώς και το ποσό που κρατήθηκε και θα τα εμφανίζει στο κυρίως πρόγραμμα Στ. θα εμφανίζει το συνολικό ποσό των κρατήσεων καθώς και το συνολικό ποσό για τις μεικτές αποδοχές όλων των εργαζομένων. ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Σελίδα - 8 -