1.3 Προβλήματα και λύσεις στις συναρτήσεις Python

Ερώτηση 1:

Γιατί οι συναρτήσεις είναι χρήσιμες στα προγράμματα;

Απάντηση:

Οι συναρτήσεις είναι χρήσιμες στα προγράμματα για διάφορους λόγους:

  1. Επαναχρησιμότητα: Ορίζοντας μια συνάρτηση, μπορείτε να ξαναχρησιμοποιήσετε τον ίδιο κώδικα και την ίδια λειτουργία σε διάφορα σημεία του προγράμματος ή ακόμα και σε διάφορα προγράμματα. Αυτό μειώνει την αναπαραγωγή κώδικα και κάνει το πρόγραμμα πιο οργανωμένο και ευκολότερο στη συντήρηση.
  2. Δομή και οργάνωση: Ορίζοντας συναρτήσεις, μπορείτε να οργανώσετε τον κώδικα σας σε λογικές μονάδες, κάθε μία εκ των οποίων εκτελεί μια συγκεκριμένη λειτουργία. Αυτό καθιστά τον κώδικα πιο κατανοητό, ευανάγνωστο και ευκολότερο στην ανάπτυξη, τη συντήρηση και την επέκταση.
  3. Επίλυση προβλημάτων: Ο διαχωρισμός του κώδικα σε μικρότερες λειτουργικές μονάδες (συναρτήσεις) καθιστά την επίλυση προβλημάτων πιο ευκολη. Μπορείτε να επικεντρωθείτε στην υλοποίηση και τη λειτουργία κάθε συνάρτησης ξεχωριστά, ανεξάρτητα από τον υπόλοιπο κώδικα. Αυτό βοηθά στην αποσφαλμάτωση και την απομόνωση πιθανών σφαλμάτων.
  1. Αφαιρετικότητα: Ορίζοντας συναρτήσεις, μπορείτε να αποκρύψετε τις λεπτομέρειες υλοποίησης και να παρέχετε μια αφαιρετική διεπαφή για τη χρήση τους. Αυτό σας επιτρέπει να αλλάξετε τον τρόπο λειτουργίας μιας συνάρτησης χωρίς να επηρεάζεται ο υπόλοιπος κώδικας που την καλεί.

Οι παραπάνω λόγοι καθιστούν τις συναρτήσεις απαραίτητες για την οργάνωση και την αποτελεσματική ανάπτυξη των προγραμμάτων.

Ερώτηση 2:

Πότε εκτελείται ο κώδικας σε μια συνάρτηση; Όταν ορίζεται ή όταν καλείται η συνάρτηση;

Απάντηση:

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

[adinserter block=”2″]

Ερώτηση 3:

Ποια είναι η δήλωση που δημιουργεί μια συνάρτηση στη γλώσσα προγραμματισμού Python;

Απάντηση:

Η δήλωση που δημιουργεί μια συνάρτηση στη γλώσσα προγραμματισμού Python είναι η “def”. Με τη χρήση της δήλωσης “def”, μπορείτε να ορίσετε το όνομα της συνάρτησης και τα ορίσματά της, καθώς και τον κώδικα που θα εκτελεστεί όταν καλείται η συνάρτηση.

Παράδειγμα:

def my_function(argument1, argument2):
    # Κώδικας της συνάρτησης
    print(argument1 + argument2)

Στο παραπάνω παράδειγμα, ορίζουμε μια συνάρτηση με το όνομα “my_function” και δύο ορίσματα “argument1” και “argument2”. Ο κώδικας που ακολουθεί τη δήλωση “def” αποτελεί το σώμα της συνάρτησης και θα εκτελεστεί όταν η συνάρτηση καλείται. Στο παράδειγμα, ο κώδικας απλά εκτυπώνει το άθροισμα των δύο ορισμάτων.

Ερώτηση 4:

Ποια είναι η διαφορά μεταξύ μιας συνάρτησης και μιας κλήσης συνάρτησης;

Απάντηση:

Μια συνάρτηση είναι ένα κομμάτι κώδικα που εκτελεί μια συγκεκριμένη λειτουργία. Αυτή η λειτουργία ορίζεται μέσα στη συνάρτηση, και μπορεί να παραλαμβάνει είσοδο, να επιστρέφει έξοδο, ή να εκτελεί διάφορες ενέργειες.

Η κλήση μιας συνάρτησης, από την άλλη πλευρά, αναφέρεται στο σημείο όπου ζητείται η εκτέλεση της συνάρτησης. Κατά την κλήση μιας συνάρτησης, δίνονται τιμές στα ορίσματά της (εάν υπάρχουν) και η συνάρτηση εκτελείται, επιστρέφοντας αποτελέσματα ή εκτελώντας τις ενέργειες που έχει οριστεί να κάνει.

Συνοψίζοντας, η συνάρτηση είναι ο κώδικας που ορίζει μια λειτουργία, ενώ η κλήση της συνάρτησης είναι η ενέργεια που ζητεί την εκτέλεση αυτής της λειτουργίας.

Ερώτηση 5:

Πόσες καθολικές και πόσες τοπικές εμβέλειες υπάρχουν σε ένα πρόγραμμα Python;

Απάντηση:

Σε ένα πρόγραμμα Python, υπάρχει μόνο μία καθολική (global) εμβέλεια (scope). Η καθολική εμβέλεια αναφέρεται στον χώρο ονομάτων στον οποίο ορίζονται οι μεταβλητές ή οι συναρτήσεις εκτός οποιουδήποτε καθορισμένου εμβέλειας μέσα σε συναρτήσεις ή κλάσεις.

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

Συνολικά, υπάρχει μια καθολική εμβέλεια και για κάθε κλήση συνάρτησης υπάρχει τοπική εμβέλεια.

Ερώτηση 6:

Τι συμβαίνει όταν μια κλήση συνάρτησης ολοκληρώνεται και επιστρέφει τα αντικείμενα που έχουν οριστεί στην τοπική εμβέλεια της συνάρτησης;

Απάντηση:

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

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

[adinserter block=”3″]

Ερώτηση 7:

Τι είναι μια επιστρεφόμενη τιμή; Μπορεί μια επιστρεφόμενη τιμή να είναι μέρος μιας έκφρασης;

Απάντηση:

Η επιστρεφόμενη τιμή (return value) είναι η τιμή που επιστρέφεται από μια συνάρτηση με τη χρήση της δήλωσης return. Αποτελεί το αποτέλεσμα της εκτέλεσης της συνάρτησης και μπορεί να είναι οποιαδήποτε τιμή ή αντικείμενο στη γλώσσα προγραμματισμού Python.

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

Ερώτηση 8:

Εάν μια συνάρτηση δεν έχει εντολή επιστροφής, ποια είναι η τιμή επιστροφής μιας κλήσης σε αυτήν τη συνάρτηση;

Απάντηση:

Εάν μια συνάρτηση δεν έχει μια δήλωση return, τότε η κλήση σε αυτήν τη συνάρτηση δεν θα επιστρέψει κάποια συγκεκριμένη τιμή. Σε αυτήν την περίπτωση, η συνάρτηση θα έχει μια αποτυχία επιστροφής (return failure), και η τιμή που θα ληφθεί υπόψη θα είναι None.

Εδώ είναι ένα παράδειγμα σε Python:

def my_function():
    print("This function doesn't have a return statement.")

result = my_function()

print("Result:", result)

Στην περίπτωση αυτή, το αποτέλεσμα της κλήσης my_function() θα είναι:

This function doesn't have a return statement.
Result: None

Στο παράδειγμα αυτό, το None είναι η τιμή που επιστρέφεται επειδή η συνάρτηση δεν έχει δήλωση return.

Ερώτηση 9:

Πώς μπορείτε να αναγκάσετε μια μεταβλητή σε μια συνάρτηση να αναφέρεται στην καθολική μεταβλητή;

Απάντηση:

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

Εδώ είναι ένα παράδειγμα σε Python:

global_variable = 10

def modify_global():
    global global_variable  # Δηλώνουμε τη μεταβλητή ως καθολική
    global_variable += 5

modify_global()

print("Global variable after modification:", global_variable)

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

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

Ερώτηση 10:

Τι είναι ο τύπος δεδομένων του None;

Απάντηση:

Η τιμή None στην Python αντιστοιχεί στον τύπο δεδομένων NoneType. Είναι μια ειδική τιμή που χρησιμοποιείται για να υποδείξει την απουσία ή τη μη ύπαρξη ενός αντικειμένου ή μιας τιμής. Ο τύπος δεδομένων NoneType έχει μόνο μία τιμή, την None.

Εδώ είναι ένα παράδειγμα που δείχνει τον τύπο δεδομένων της None στην Python:

value = None

print("Type of value:", type(value))

Αυτός ο κώδικας θα εκτυπώσει:

Type of value: <class 'NoneType'>

Επομένως, ο τύπος δεδομένων της None είναι <class 'NoneType'>.

[adinserter block=”4″]

Ερώτηση 11:

Τι κάνει η δήλωση import areallyourpetsnamederic;

Απάντηση:

Η δήλωση import areallyourpetsnamederic δεν αντιστοιχεί σε κάποια γνωστή βιβλιοθήκη ή μονάδα στην Python. Αυτό σημαίνει ότι η δήλωση προσπαθεί να εισαγάγει ένα module με όνομα “areallyourpetsnamederic”, το οποίο, αν δεν υπάρχει, θα οδηγήσει σε σφάλμα.

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

import module_name

ή

import module_name as alias

Είναι πολύ σημαντικό να γνωρίζετε το όνομα του module που προσπαθείτε να εισαγάγετε, καθώς και τον τρόπο που πρέπει να το χρησιμοποιήσετε μετά τη φόρτωση του.

Ερώτηση 12:

Εάν είχατε μια συνάρτηση με το όνομα bacon() σε ένα module με όνομα spam, πώς θα την καλούσατε μετά την εισαγωγή του spam;

Απάντηση:

Εάν είχατε μια συνάρτηση με όνομα bacon() σε ένα module με όνομα spam, μπορείτε να την καλέσετε αφού εισάγετε το module spam στον κώδικά σας. Η σύνταξη για να καλέσετε τη συνάρτηση θα είναι:

import spam

spam.bacon()

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

Εάν θέλετε να χρησιμοποιήσετε έναν συντομευμένο όρο για το module spam, μπορείτε να τον χρησιμοποιήσετε κατά την εισαγωγή του, για παράδειγμα:

import spam as sp

sp.bacon()

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

Ερώτηση 13:

Πώς μπορεί κανείς να αποτρέψει το πρόγραμμά του από να καταρρεύσει όταν συμβεί ένα σφάλμα;

Απάντηση:

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

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

try:
    # Κομμάτι κώδικα που μπορεί να προκαλέσει σφάλμα
    result = 10 / 0  # Παράδειγμα διαίρεσης με το μηδέν
except ZeroDivisionError:
    # Κώδικας που εκτελείται αν προκληθεί σφάλμα ZeroDivisionError
    print("Προσπάθησες να διαιρέσεις με το μηδέν!")
except Exception as e:
    # Κώδικας που εκτελείται αν προκληθεί οποιοδήποτε άλλο σφάλμα
    print("Συνέβη ένα σφάλμα:", e)
else:
    # Κώδικας που εκτελείται αν δεν προκληθεί κανένα σφάλμα
    print("Ο κώδικας εκτελέστηκε χωρίς σφάλματα.")
finally:
    # Κώδικας που εκτελείται πάντα, ανεξάρτητα από το αν συμβαίνει σφάλμα
    print("Η δοκιμή ολοκληρώθηκε.")

Στο παράδειγμα αυτό, το πρόγραμμα προσπαθεί να διαιρέσει τον αριθμό 10 με το μηδέν, κάτι που προκαλεί ένα σφάλμα ZeroDivisionError. Χρησιμοποιούμε τη δομή try-except για να πιάσουμε το σφάλμα αυτό και να εμφανίσουμε ένα κατάλληλο μήνυμα.

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

Ερώτηση 14:

Τι τοποθετείται στην δήλωση “try” (προσπάθεια); Τι τοποθετείται στην δήλωση “except” (εξαίρεση);

Απάντηση:

Η δομή try-except χρησιμοποιείται για να προσπαθήσει να εκτελέσει κομμάτι κώδικα που μπορεί να προκαλέσει σφάλμα (το “try”) και να αντιμετωπίσει αυτά τα σφάλματα εάν συμβούν (το “except”).

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

Στην except δήλωση, καθορίζετε ποιο σφάλμα θέλετε να αντιμετωπίσετε. Μπορείτε να καθορίσετε ένα ή περισσότερα συγκεκριμένα είδη σφαλμάτων που θα “πιάνετε” και να αντιδράτε με τρόπος που να αντιμετωπίζει το σφάλμα. Μπορείτε επίσης να χρησιμοποιήσετε την except χωρίς να δηλώσετε συγκεκριμένο είδος σφάλματος για να αντιμετωπίσετε οποιοδήποτε σφάλμα που μπορεί να προκύψει.

Εδώ είναι ένα παράδειγμα:

try:
    x = 10 / 0  # Προκαλεί σφάλμα ZeroDivisionError
except ZeroDivisionError:
    print("Προσπάθησες να διαιρέσεις με το μηδέν!")
except Exception as e:
    print("Συνέβη ένα σφάλμα:", e)

Σε αυτό το παράδειγμα, ο κώδικας μέσα στο try θα προκαλέσει ένα ZeroDivisionError, το οποίο θα πιαστεί από την except ZeroDivisionError δήλωση, και θα εκτυπωθεί το αντίστοιχο μήνυμα. Εάν συμβεί κάποιο άλλο σφάλμα, θα πιαστεί από την except Exception as e δήλωση.

[adinserter block=”5″]

Practice Projects 1:

Η Ακολουθία Collatz
Γράψε μια συνάρτηση με όνομα “collatz()” που να έχει ένα παράμετρο με όνομα “number”. Εάν το “number” είναι ζυγός, τότε η συνάρτηση “collatz()” θα πρέπει να εκτυπώνει το “number // 2” και να επιστρέφει αυτή την τιμή. Εάν το “number” είναι μονός, τότε η συνάρτηση “collatz()” θα πρέπει να εκτυπώνει και να επιστρέφει το “3 * number + 1”.
Στη συνέχεια, γράψε ένα πρόγραμμα που επιτρέπει στον χρήστη να πληκτρολογήσει έναν ακέραιο αριθμό και καλεί επαναληπτικά τη συνάρτηση “collatz()” για αυτόν τον αριθμό μέχρι η συνάρτηση να επιστρέψει την τιμή 1.
(Καταπληκτικά, αυτή η ακολουθία λειτουργεί πραγματικά για οποιονδήποτε ακέραιο αριθμό – σε κάποιο σημείο, χρησιμοποιώντας αυτήν την ακολουθία, θα καταλήξεις στο 1! Ακόμη και οι μαθηματικοί δεν είναι σίγουροι γιατί. Το πρόγραμμά σας εξερευνεί αυτό που ονομάζεται η ακολουθία Collatz, μερικές φορές αναφερόμενη ως “το απλούστερο αδύνατο πρόβλημα των μαθηματικών”.)
Θυμηθείτε να μετατρέπετε την τιμή επιστροφής της “input()” σε ακέραιο με τη συνάρτηση “int()”; διαφορετικά, θα είναι μια τιμή συμβολοσειράς.
Υπόδειξη: Ένας ακέραιος αριθμός είναι ζυγός εάν “number % 2 == 0”, και είναι μονός εάν “number % 2 == 1”.
Η έξοδος αυτού του προγράμματος μπορεί να μοιάζει κάπως έτσι:
Εισαγωγή αριθμού:
3
10
5
16
8
4
2
1

Έλεγχος Εισόδου (Input Validation)

Πρόσθεσε δηλώσεις “try” και “except” στο προηγούμενο έργο για να εντοπίσετε εάν ο χρήστης πληκτρολογεί μια συμβολοσειρά που δεν είναι ακέραιος. Κανονικά, η συνάρτηση “int()” θα εγείρει ένα σφάλμα “ValueError” εάν της δοθεί μια συμβολοσειρά που δεν είναι ακέραιος, όπως int(‘puppy’). Στην δήλωση “except”, εκτύπωσε ένα μήνυμα προς τον χρήστη λέγοντας ότι πρέπει να εισάγει έναν ακέραιο αριθμό.

Απάντηση:

Εδώ είναι η υλοποίηση της συνάρτησης collatz() και του προγράμματος που καλεί αυτήν τη συνάρτηση:

def collatz(number):
    if number % 2 == 0:
        result = number // 2  # Υπολογίζουμε το αποτέλεσμα για άρτιο αριθμό
        print(result)  # Εκτυπώνουμε το αποτέλεσμα
        return result  # Επιστρέφουμε το αποτέλεσμα
    else:
        result = 3 * number + 1  # Υπολογίζουμε το αποτέλεσμα για περιττό αριθμό
        print(result)  # Εκτυπώνουμε το αποτέλεσμα
        return result  # Επιστρέφουμε το αποτέλεσμα

def main():
    try:
        user_input = int(input("Εισαγάγετε έναν ακέραιο αριθμό: "))
        while user_input != 1:
            user_input = collatz(user_input)  # Καλούμε τη συνάρτηση collatz() με την είσοδο του χρήστη
    except ValueError:
        print("Πρέπει να εισάγετε έναν ακέραιο αριθμό.")

if __name__ == "__main__":
    main()  # Καλούμε την main() συνάρτηση για την έναρξη του προγράμματος

Σε αυτό το πρόγραμμα, η συνάρτηση collatz() ελέγχει εάν ο αριθμός είναι άρτιος ή περιττός και εκτελεί τις απαιτούμενες πράξεις. Η main() συνάρτηση χειρίζεται την είσοδο του χρήστη, ελέγχει αν είναι ακέραιος και καλεί την collatz() συνάρτηση για τον εντοπισμό της ακολουθίας Collatz μέχρι ο αριθμός να γίνει 1.

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

21 Αυγούστου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων