Ενότητα 4 - Τμήμα 1 - Επανάληψη "While" και Συναρτήσεις

Ιστότοπος: ΕΛ/ΛΑΚ Moodle
Μάθημα: Εργαστήριο Python
Βιβλίο: Ενότητα 4 - Τμήμα 1 - Επανάληψη "While" και Συναρτήσεις
Εκτυπώθηκε από: Guest user
Ημερομηνία: Δευτέρα, 25 Νοεμβρίου 2024, 2:01 AM

Περιγραφή

Μετά την ολοκλήρωση αυτής της ενότητας οι φοιτητές θα μπορούν να:

  • προσδιορίζουν πότε να χρησιμοποιούν το βρόχο while
  • εξηγούν τη χρήση του break μέσα σε ένα βρόχο while
  • δημιουργούν συναρτήσεις χρήστη
  • διακρίνουν τη χρήση της return μέσα σε μια συνάρτηση από την print


4.1.1 - Επανάληψη While


Ο Βρόγχος επανάληψης με while χρησιμοποιείται όταν ένα ένα τμήμα κώδικα πρέπει να επαναλαμβάνεται μέχρι να συμβεί-ικανοποιηθεί μία συγκεκριμένη συνθήκη.

Παραδόξως, μία επανάληψη με while μπορεί να χρησιμοποιηθεί στη θέση οποιασδήποτε επανάληψης με for. Μπορεί να χρησιμοποιηθεί για επανάληψη στην οποία μία τιμή που ανεβαίνει φτάνει μία συγκεκριμένη τιμή. Τότε γιατί χρειαζόμαστε την επανάληψη με for αν μία επανάληψη με while μπορεί να κάνει τα πάντα; Η επανάληψη με for είναι απλούστερη στη χρήση στον προγραμματισμό. Μία επανάληψη με for που μοιάζει με:

for i in range(10): print(i)

...μπορεί να γίνει με while και θα είναι σαν αυτό:

i = 0 while i < 10: print(i) i = i + 1


Για να επιτύχουμε το ίδιο με τη χρήση μίας while πρέπει να:

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

Μία καλύτερη χρήση της επανάληψης με while είναι το να ζητάμε μία απάντηση από το χρήστη.

Αντιγράψτε τον παρακάτω κώδικα στο Thonny και αποθηκεύστε το σαν  test_while (ή ότι άλλο όνομα σας αρέσει) :

quit = "n" while quit == "n": quit = input("Do you want to quit? ")


Ποιό είναι το αποτέλεσμα εκτέλεσης του κώδικα; Αν απαντήσετε n τότε ο κώδικας παραμένει στην επανάληψη και συνεχίζει να ρωτάει. Αλλά αν απαντήσετε οτιδήποτε άλλο βγαίνει από την επανάληψη. Δεν είναι τέλειο αλλά είναι μια αρχή και μπορείτε να δοκιμάσετε να το κάνετε καλύτερο.

4.1.2 - Διακοπή

Ένας άλλος τρόπος να βγεις από μία επανάληψη είναι με τη χρήση της εντολής break. Αν θέλουμε μία συγκεκριμένη απάντηση από το χρήστη μπορούμε να ρωτήσουμε και αν λάβουμε λάθος απάντηση τότε ενημερώνουμε και ρωτάμε πάλι.

Αντιγράψτε τον παρακάτω κώδικα στο Thonny και αποθηκεύστε το σαν  test_while2 (ή όποιο άλλο όνομα σας αρέσει):

# Check for yes or no and reply accordingly quit = "n" while quit == "n": quit = input("Do you want to quit? (y/n) ") if quit == "y": break # get out if the answer is y elif quit != "n": print("Please write y or n.") quit = "n"

Σαν άσκηση, δημιουργήστε ένα τμήμα κώδικα που ζητάει από το χρήστη να εισάγει το όνομα του και το αγαπημένο του χρώμα και μετά εμφανίζει το  μήνυμα "Hi name! Your favorite color is color!". Μετά ρωτήστε το χρήστη αν επιθυμεί να δοκιμάσει ξανά και αν απαντήσει ναι (yes) τότε ρωτήστε ξανά όνομα και χρώμα, αν απαντήσει όχι (no) τερματίστε το πρόγραμμα, σε οποιαδήποτε άλλη απάντηση ρωτήστε πάλι.

Βήματα

  1. δημιουργήστε μία μεταβλητή με όνομα game και δώστε της την τιμή True (όταν γίνει False το παιχνίδι σταματάει)
  2. δημιουργήστε μία επανάληψη με while που θα ελέγχει την τιμή της μεταβλητής game
  3. διαβάστε τις τιμές για το όνομα και το χρώμα σε δύο μεταβλητές (name, color)
  4. δημιουργήστε μία νέα μεταβλητή (cont) που θα αποθηκεύει την απάντηση του χρήστη για το αν επιθυμεί να συνεχίσει
  5. με μία επανάληψη while ρωτήστε το χρήστη αν επιθυμεί να συνεχίσει 

μπορείτε να δείτε μία πιθανή λύση εδώ.

4.1.4 - Συναρτήσεις

Μην επαναλαμβάνεστε!

Οι συναρτήσεις (Functions) χρησιμοποιούνται για δύο λόγους. Πρώτον, κάνουν τον κώδικα πιο εύκολο να αναγνωσθεί και να κατανοηθεί. Δεύτερον, επιτρέπουν σε ένα τμήμα κώδικα να μπορεί να χρησιμοποιηθεί περισσότερες από μία φορές. Είστε ήδη εξοικειωμένοι με τις συναρτήσεις print() και input(). Η Python μας παρέχει αρκετές ενσωματωμένες συναρτήσεις όπως οι print() και input(), αλλά μπορούμε επίσης να γράψουμε τις δικές μας. Μία συνάρτηση είναι ένα μικρό πρόγραμμα μέσα σε ένα πρόγραμμα. Για να καταλάβουμε καλύτερα το πως δουλεύει μία συνάρτηση ας δημιουργήσουμε μία. Πληκτρολογήστε το παρακάτω στο Thonny και αποθηκεύστε το ως hello_func.

def hello(): print("Hi!") print("Hi!!!") print("Hello World.")

Πατήστε το πλήκτρο run και μετά γράψτε στην περιοχή εντολών 

>>> hello()
>>> hello()
>>> hello()

Με τον καθορισμό μίας συνάρτησης μπορούμε να κάνουμε το πρόγραμμα μας ευκολότερο στην ανάγνωση. Για να καθορίσουμε μία συνάρτηση αρχίζουμε με την εντολή def. Μετά το def ακολουθεί το όνομα της συνάρτησης. Σε αυτό το παράδειγμα την ονομάσαμε hello. Για τα ονόματα των συναρτήσεων χρησιμοποιούμε τους ίδιους κανόνες με αυτούς που αναφέραμε για τα ονόματα μεταβλητών.

Μετά το όνομα της συνάρτησης ακολουθεί υπάρχει ένα σετ από παρενθέσεις και μία άνω και κάτω τελεία. Όλες οι εντολές που υπάρχουν μέσα στην συνάρτηση πρέπει να είναι στοιχισμένες σωστά. Το τμήμα κώδικα που ακολουθεί τη δήλωση def ονομάζεται κυρίως σώμα της συνάρτησης. Αυτός ο κώδικας εκτελείτε όταν κληθεί η συνάρτηση και όχι όταν την ορίζουμε.

Η Εντολή hello() είναι μία κλήση της συνάρτησης. Στον κώδικα, μία κλήση συνάρτησης αποτελείται από το όνομα της ακολουθούμενο από παρενθέσεις και πιθανόν κάποιες παραμέτρους ανάμεσα στις παρενθέσεις. Όταν κατά τη διάρκεια της εκτέλεσης το πρόγραμμα φτάσει την κλήση της συνάρτησης, θα μεταβεί στην πρώτη γραμμή της συνάρτησης και θα αρχίσει να εκτελεί τον κώδικα που θα βρει εκεί. Όταν φτάσει στο τέλος του κώδικα που βρίσκεται μέσα στη συνάρτηση, θα επιστρέψει στη γραμμή του κυρίως προγράμματος από την οποία έγινε η κλήση της συνάρτησης και θα συνεχίσει από εκεί.

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

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

4.1.5 - Παράμετροι συναρτήσεων

Οι συναρτήσεις μπορούν να δεχθούν παραμέτρους (ή ορίσματα). Οι παράμετροι χρησιμοποιούνται για να αυξήσουν τη λειτουργικότητα μίας συνάρτησης αλλάζοντας το τι θα κάνει ανάλογα με τις τιμές των παραμέτρων που δέχθηκε. Για παράδειγμα, αντιγράψτε την συνάρτηση που ακολουθεί στο Thonny και αποθηκεύστε την ως printMyName.

def hello(name): print("Hello " + name)

μετά την εκτέλεση του κώδικα (πατήστε το κουμπί play) και στην περιοχή εντολών γράψτε:

>>> hello("Bob")
>>> hello("Alice")

Στον ορισμό της η συνάρτηση hello() περιλαμβάνει μία παράμετρο με όνομα name.   Η παράμετρος είναι μία μεταβλητή που μέσα της τοποθετείται μία τιμή κατά την κλήση της συνάρτησης. Την πρώτη φορά που καλέσαμε τη συνάρτηση hello() είχε τιμή παραμέτρου την τιμή 'Bob'. Η εκτέλεση του προγράμματος φτάνει στη συνάρτηση και η μεταβλητή name παίρνει την τιμή 'Bob', και αυτό είναι που εμφανίζεται με την εντολή print().

Κάτι σημαντικό που πρέπει να επισημάνουμε σχετικά με τις παραμέτρους είναι ότι οι τιμές που πήραν χάνονται μετά το τέλος εκτέλεσης της συνάρτησης. Για παράδειγμα, αν προσθέσουμε την εντολή print(name) μετά το hello('Alice') στο προηγούμενο πρόγραμμα, το πρόγραμμα θα βγάλει ένα μήνυμα λάθους γιατί δεν υπάρχει σε αυτό μεταβλητή με όνομα name. Αυτή η μεταβλητή διαγράφηκε με το που τελείωσε η κλήση και εκτέλεση της συνάρτησης με την εντολή hello('Alice'), έτσι η print(name) αναφέρεται σε μία μεταβλητή που δεν υπάρχει. 

Είναι το παρόμοιο με το ότι οι μεταβλητές ενός προγράμματος διαγράφονται μόλις το πρόγραμμα τερματίσει τη λειτουργία του. 

4.1.6 - Επιστροφή από μία συνάρτηση

Επιστροφή αντί Εμφάνισης

Πολλές συναρτήσεις, όπως οι int ή η str, επιστρέφουν μία τιμή που μπορεί να χρησιμοποιηθεί αργότερα. Όταν μία συνάρτηση επιστρέφει μία τιμή, η τιμή αυτή δεν εμφανίζεται στην οθόνη.
Για να επιστρέψει μία τιμή μία συνάρτηση πρέπει να χρησιμοποιηθεί η δήλωση return. Η δήλωση return δεν μπορεί να χρησιμοποιηθεί έξω από μία συνάρτηση.

Γράψτε τον ακόλουθο κώδικα στο Thonny και αποθηκεύστε τον με όνομα  maxOfTwo:

def max(x, y): if x >=y: return x else: return y

Η συνάρτηση δέχεται δύο παραμέτρους-τιμές και επιστρέφει τη μεγαλύτερη τιμή από τις δύο, χωρίς να εμφανίσει τίποτα.

Εκτελέστε τον κώδικα, μετά, στην περιοχή εκτέλεσης εντολών πληκτρολογήστε τις παρακάτω εντολές και παρατηρήστε την περιοχή μεταβλητών:

>>> print(max(3,9))

>>> z = max(11,2)

>>> print(z)

4.1.7 - Περισσότερα για τις συναρτήσεις

  • Αμέσως μόλις επιστρέψει μία τιμή η συνάρτηση, σταματάει την εκτέλεση της. Οποιοδήποτε τμήμα κώδικα που είναι μέσα στη συνάρτηση μετά την δήλωση return δε θα εκτελεστεί ποτέ.

Αντιγράψτε τον παρακάτω κώδικα στο Thonny και αποθηκεύστε τον με όνομα add3Numbers:

def addNumbers(x, y, z): total = x + y + z return total print("This won't be printed")

Στη περιοχή γραμμής εντολών γράψτε:

>>> print(addNumbers(4, 5, 19))

Όπως μπορείτε να δείτε η συνάρτηση επιστρέφει μία τιμή και η εντολή print που βρίσκεται μετά την return δεν εκτελείται.

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

Η επόμενη συνάρτηση επιστρέφει το πηλίκο και το υπόλοιπο της Ευκλείδιας διαίρεσης. Αντιγράψτε το παρακάτω σύνολο εντολών στο τμήμα προγράμματος του Thonny και αποθηκεύστε το σαν euclidianDivision.

def division(x, y): ''' This function takes two INTEGERS and returns the quotient and the remainder Args: x (int) : The first number z (int) : The second number ''' quotient = x//y remainder = x%y return quotient, remainder

Μεταξύ της 2ης και της 7ης γραμμής της συνάρτησης υπάρχει η τεκμηρίωση της. Όπως είπαμε η Python δεν αγνοεί την τεκμηρίωση. Μετά την εκτέλεση του προγράμματος, μπορούμε να το δοκιμάσουμε.

>>> print(division(8,3))

>>> print(division(47,4))

Το αποτέλεσμα είναι κάτι σαν λίστα (που ονομάζεται πλειάδα - tuple) και μπορούμε να εμφανίσουμε χωριστά τις τιμές της, όπως κάναμε και με τα στοιχεία μίας λίστας:

>>> print(division(47,4))[0] # Το 1ο στοιχείο είναι το πηλίκο

>>> print(division(47,4))[1] # Το 2ο στοιχείο είναι το υπόλοιπο

Επίσης μπορούμε να εμφανίσουμε την τεκμηρίωση της συνάρτησης.

>>> print(division.__doc__)

Αυτό είναι κάτι πολύ χρήσιμο όταν χρησιμοποιούμε τον κώδικα κάποιου άλλου ή όταν έχουμε ξεχάσει τι κάνει ο κώδικας που χρησιμοποιούμε!!

4.1.8 - Μάντης

Αντιγράψτε την παρακάτω συνάρτηση στο Thonny και αποθηκεύστε την με όνομα  fortuneTeller :

import random def getAnswer(answerNumber): if answerNumber == 1: return 'It is certain' elif answerNumber == 2: return 'It is decidedly so' elif answerNumber == 3: return 'Yes' elif answerNumber == 4: return 'Reply hazy try again' elif answerNumber == 5: return 'Ask again later' elif answerNumber == 6: return 'Concentrate and ask again' elif answerNumber == 7: return 'My reply is no' elif answerNumber == 8: return 'Outlook not so good' elif answerNumber == 9: return 'Very doubtful' def adviseMe(question): r = random.randint(1,9) fortune = getAnswer(r) print ("You asked : " + question) print ("My answer is : ", end ="") print (fortune)

Εκτελέστε τον κώδικα και μετά στη γραμμή εντολών πληκτρολογήστε:

>>> adviseMe ("Meet my friends tonight?")

Ο κώδικας περιέχει δύο συναρτήσεις. Η πρώτη, getAnswer, επιστρέφει μία τιμή, χαρακτήρες σε αυτό το παράδειγμα, που μπορούν να χρησιμοποιηθούν κάπου αλλού. Η δεύτερη, adviseMe, δημιουργεί ένα τυχαίο αριθμό μεταξύ του 1 και του 9, δίνουμε αυτόν τον αριθμό στην πρώτη συνάρτηση και τυπώνουμε την τιμή που επιστρέφει.

έτσι η αλληλουχία είναι:

  • καλούμε τη συνάρτηση adviseMe 
  • η adviseMe παράγει ένα τυχαίο αριθμό 
  • η adviseMe μεταβιβάζει τον τυχαίο αριθμό σαν παράμετρο στη συνάρτηση getAnswer
  • η getAnswer επιστρέφει μία τιμή
  • η adviseMe εμφανίζει την τιμή που επιστράφηκε από την getAnswer

Μπορείτε να δείτε την αλληλουχία βήμα-βήμα με τη χρήση του κουμπιού Debug.

Ως άσκηση, κάντε λήψη του κώδικα του προγράμματο fortuneTeller από εδώ και εμφανίστε την τεκμηρίωση (Docstrings) των δύο συναρτήσεων.