Λύσεις — Κεφάλαιο 7: Προηγμένα στοιχεία γλώσσας προγραμματισμού (σελ. 122-124)
Λύσεις της Δραστηριότητας 1 (τρία παραδείγματα εμβέλειας — έξοδοι και συζήτηση) και των 10 Ερωτήσεων του κεφαλαίου 7.
Δραστηριότητα 1 — Εκτέλεση και συζήτηση των τριών παραδειγμάτων εμβέλειας
Ερώτηση: Να εκτελεστούν και να συζητηθούν τα παρακάτω παραδείγματα: Παράδειγμα 1: name = "black" / def f(): name = "white"; print "Μέσα στη συνάρτηση", name / print "Έξω από τη συνάρτηση", name / f(). Παράδειγμα 2: name = "black" / def f(): print "Μέσα στη συνάρτηση", name / print "Έξω από τη συνάρτηση", name / f(). Παράδειγμα 3: name = "black" / def f(): global name; name = "white"; print "Μέσα στη συνάρτηση", name / print "Έξω από τη συνάρτηση", name / f() / print "Έξω από τη συνάρτηση", name.
Απάντηση:
- Παράδειγμα 1 — τοπική μεταβλητή που υπερκαλύπτει την καθολική. Έξοδος: «Έξω από τη συνάρτηση black» και μετά «Μέσα στη συνάρτηση white». Η εκχώρηση
name = 'white' μέσα στη συνάρτηση δημιουργεί μια νέα, τοπική μεταβλητή name, άσχετη με την καθολική· έχει ισχύ μόνο μέσα στο σώμα της f και χάνεται όταν η f τελειώσει. Αν τυπώναμε ξανά το name μετά την κλήση, θα ήταν ακόμη black.
- Παράδειγμα 2 — ανάγνωση καθολικής μεταβλητής μέσα σε συνάρτηση. Έξοδος: «Έξω από τη συνάρτηση black», «Μέσα στη συνάρτηση black». Η f δεν εκχωρεί τίποτα στο name, μόνο το διαβάζει· επειδή δεν υπάρχει τοπική name, η Python το αναζητά στην καθολική εμβέλεια και βρίσκει το black. Άρα μπορούμε να πάρουμε την τιμή μιας καθολικής μεταβλητής μέσα σε συνάρτηση χωρίς καμία δήλωση.
- Παράδειγμα 3 — αλλαγή καθολικής μεταβλητής με τη δήλωση global. Έξοδος: «Έξω από τη συνάρτηση black», «Μέσα στη συνάρτηση white», «Έξω από τη συνάρτηση white». Η δήλωση
global name λέει στην Python ότι το name δεν είναι τοπικό αλλά αναφέρεται στη μεταβλητή που ορίζεται έξω από τη συνάρτηση· επομένως η εκχώρηση name = 'white' αλλάζει την ίδια την καθολική μεταβλητή και η αλλαγή παραμένει μετά την κλήση.
- Συμπέρασμα (σελ. 117): αν μέσα σε συνάρτηση εκχωρηθεί τιμή σε ένα όνομα, η Python το θεωρεί τοπικό (εκτός αν δηλωθεί global)· αν απλώς διαβάζεται και δεν υπάρχει τοπικά, αναζητείται στην καθολική εμβέλεια. Η τοπική μεταβλητή «βγαίνει εκτός εμβέλειας» με το τέλος της συνάρτησης — η άλλη συνάρτηση ή το κύριο πρόγραμμα βλέπουν μόνο την καθολική.
-
# Παράδειγμα 1 # Παράδειγμα 3
name = "black" name = "black"
def f(): def f():
name = "white" global name
print "Μέσα", name name = "white"
print "Έξω", name print "Μέσα", name
f() print "Έξω", name # black
print "Έξω", name # black f() # Μέσα white
print "Έξω", name # white
Σύνοψη: Παρ. 1: η εκχώρηση μέσα στην f δημιουργεί τοπική name (white) χωρίς να αλλάζει την καθολική (black). Παρ. 2: η f διαβάζει την καθολική (black) χωρίς δήλωση. Παρ. 3: με global name η εκχώρηση αλλάζει την καθολική — μετά την κλήση είναι white.
Κριτήρια αξιολόγησης:
- Ακριβείς έξοδοι και για τα τρία + ο κανόνας «εκχώρηση → τοπική, ανάγνωση → καθολική, global → αλλαγή καθολικής».
Ερώτηση 1 — Διαφορά παραμέτρων και απλών μεταβλητών
Ερώτηση: Ποια είναι η διαφορά παραμέτρων και απλών μεταβλητών;
Απάντηση:
- Οι παράμετροι είναι μεταβλητές που χρησιμοποιούνται για τη μεταβίβαση τιμών μεταξύ υποπρογραμμάτων ή μεταξύ υποπρογράμματος και κύριου προγράμματος (σελ. 110). Καθορίζονται μέσα στις παρενθέσεις του ορισμού της συνάρτησης (χωρισμένες με κόμμα) και παίρνουν τιμή κατά την κλήση — τα ορίσματα της κλήσης εκχωρούνται σε αυτές. Γενικά διακρίνονται σε παραμέτρους εισόδου και εξόδου.
- Μια απλή μεταβλητή παίρνει τιμή με εντολή εκχώρησης μέσα στο τμήμα προγράμματος όπου χρησιμοποιείται (ή με είσοδο από το πληκτρολόγιο) και δεν χρησιμεύει στη μεταβίβαση δεδομένων προς/από τη συνάρτηση.
- Κοινό σημείο: «οι παράμετροι μοιάζουν με τις μεταβλητές» — μέσα στη συνάρτηση χρησιμοποιούνται ακριβώς όπως οι μεταβλητές και είναι τοπικές (σελ. 114: «και οι παράμετροι είναι τοπικές μεταβλητές»). Παράδειγμα: στην
def printMax(a, b) τα a, b είναι παράμετροι· στην κλήση printMax(x, y) τα x, y είναι απλές (καθολικές) μεταβλητές που δίνουν τα ορίσματα.
Σύνοψη: (ενδεικτική) Παράμετροι = μεταβλητές στις παρενθέσεις του ορισμού που μεταβιβάζουν τιμές στη συνάρτηση, παίρνοντας τιμή από τα ορίσματα της κλήσης (τοπικές)· απλές μεταβλητές παίρνουν τιμή με εκχώρηση/είσοδο και δεν μεταβιβάζουν δεδομένα.
Κριτήρια αξιολόγησης:
- Ρόλος μεταβίβασης + πού ορίζονται + πώς παίρνουν τιμή.
Ερώτηση 2 — Τι ονομάζεται εμβέλεια μεταβλητών
Ερώτηση: Τι ονομάζεται εμβέλεια μεταβλητών;
Απάντηση:
- Εμβέλεια (scope) μιας μεταβλητής ονομάζεται το τμήμα του προγράμματος στο οποίο η μεταβλητή είναι προσπελάσιμη — η περιοχή του κώδικα όπου μπορεί να χρησιμοποιηθεί (σελ. 113-114). Όλες οι μεταβλητές ενός προγράμματος δεν είναι προσπελάσιμες από όλα τα μέρη του.
- Οι γλώσσες προγραμματισμού επιτρέπουν χρήση μεταβλητών όχι μόνο στο τμήμα που δηλώνονται αλλά και σε άλλα υποπρογράμματα· διακρίνονται η απεριόριστη εμβέλεια (καθολικές μεταβλητές, ορατές παντού) και η περιορισμένη (τοπικές, μόνο στο υποπρόγραμμα δήλωσης). Κάθε μεταβλητή έχει την εμβέλεια του τμήματος κώδικα όπου δηλώθηκε, από το σημείο ορισμού του ονόματος και μετά. Στην Python: μέσα σε συνάρτηση → τοπική, έξω → καθολική.
Σύνοψη: (ενδεικτική) Το τμήμα (περιοχή) του προγράμματος μέσα στο οποίο μια μεταβλητή μπορεί να προσπελαστεί/χρησιμοποιηθεί· απεριόριστη (καθολικές) ή περιορισμένη (τοπικές).
Κριτήρια αξιολόγησης:
- Ορισμός + αναφορά στα δύο είδη.
Ερώτηση 3 — Τι χαρακτηρίζει τις καθολικές μεταβλητές
Ερώτηση: Τι χαρακτηρίζει τις καθολικές μεταβλητές;
Απάντηση:
- Οι καθολικές (global) μεταβλητές έχουν απεριόριστη εμβέλεια: είναι ορατές και μπορούν να χρησιμοποιηθούν σε οποιοδήποτε τμήμα του προγράμματος, ανεξάρτητα από το πού δηλώθηκαν (σελ. 113).
- Στην Python είναι οι μεταβλητές που δηλώνονται έξω από τις συναρτήσεις, στο κορυφαίο επίπεδο του προγράμματος, και είναι προσβάσιμες από όλες τις συναρτήσεις (σελ. 114-115). Μέσα σε μια συνάρτηση μπορούμε να διαβάσουμε την τιμή τους ελεύθερα, αλλά για να την αλλάξουμε χρειάζεται η δήλωση global — αλλιώς η εκχώρηση δημιουργεί ομώνυμη τοπική μεταβλητή.
- Μειονέκτημα: η χρήση τους περιορίζει την ανεξαρτησία των υποπρογραμμάτων (κάθε τμήμα μπορεί να επηρεάσει τις τιμές τους) — αντίθετα με την καλή πρακτική «κάθε υποπρόγραμμα όσο γίνεται πιο ανεξάρτητο» (σελ. 106).
Σύνοψη: (ενδεικτική) Ορίζονται έξω από τις συναρτήσεις (κορυφαίο επίπεδο), είναι ορατές/προσπελάσιμες από όλα τα τμήματα του προγράμματος (απεριόριστη εμβέλεια)· αλλαγή μέσα σε συνάρτηση μόνο με global· μειονέκτημα η μειωμένη ανεξαρτησία των υποπρογραμμάτων.
Κριτήρια αξιολόγησης:
- Πού δηλώνονται + ορατότητα + global + μειονέκτημα.
Ερώτηση 4 — Περιορισμένη vs απεριόριστη εμβέλεια
Ερώτηση: Ποια η διαφορά της περιορισμένης από την απεριόριστη εμβέλεια;
Απάντηση:
- Απεριόριστη εμβέλεια: όλες οι μεταβλητές είναι ορατές και μπορούν να χρησιμοποιούνται σε οποιοδήποτε τμήμα του προγράμματος, ανεξάρτητα από το πού δηλώθηκαν — οι μεταβλητές είναι καθολικές (global). Μειονέκτημα: περιορίζεται η ανεξαρτησία των υποπρογραμμάτων.
- Περιορισμένη εμβέλεια: οι μεταβλητές είναι τοπικές (local) — ισχύουν μόνο για το υποπρόγραμμα στο οποίο δηλώθηκαν. Απαιτεί όλες οι μεταβλητές που χρησιμοποιούνται σε ένα τμήμα προγράμματος να δηλώνονται σε αυτό το τμήμα· έτσι τα υποπρογράμματα είναι ανεξάρτητα, χωρίς παρενέργειες σε ομώνυμες μεταβλητές άλλων τμημάτων (σελ. 113).
- Η Python συνδυάζει και τα δύο: μεταβλητές που ορίζονται μέσα σε συνάρτηση έχουν περιορισμένη (τοπική) εμβέλεια, μεταβλητές που ορίζονται έξω απεριόριστη (καθολική).
Σύνοψη: (ενδεικτική) Απεριόριστη = οι μεταβλητές (καθολικές) ορατές σε όλο το πρόγραμμα, με μειωμένη ανεξαρτησία υποπρογραμμάτων· περιορισμένη = τοπικές μεταβλητές που ισχύουν μόνο στο υποπρόγραμμα δήλωσης, όλες οι μεταβλητές δηλώνονται εκεί.
Κριτήρια αξιολόγησης:
- Δύο ορισμοί + το πλεονέκτημα/μειονέκτημα.
Ερώτηση 5 — Η λειτουργία της εντολής global
Ερώτηση: Ποια είναι η λειτουργία της εντολής global;
Απάντηση:
- Η εντολή global δηλώνει μέσα σε μια συνάρτηση ότι μια μεταβλητή δεν είναι τοπική αλλά καθολική — ότι βρίσκεται σε εξωτερικό τμήμα εντολών (στο κορυφαίο επίπεδο του προγράμματος) (σελ. 115). Χρειάζεται όταν θέλουμε να αλλάξουμε την τιμή μιας καθολικής μεταβλητής μέσα στη συνάρτηση.
- Γιατί χρειάζεται: η Python θεωρεί ότι, αν μέσα σε συνάρτηση εκχωρηθεί τιμή σε ένα όνομα, το όνομα είναι τοπικό — δημιουργεί νέα τοπική μεταβλητή που υπερκαλύπτει την ομώνυμη καθολική και χάνεται στο τέλος της συνάρτησης. Με
global x η εκχώρηση x = 2 αναφέρεται στην καθολική x και η αλλαγή παραμένει μετά την κλήση.
- Παράδειγμα (σελ. 115-116):
x = 50 / def func(): global x; print 'Το x είναι', x; x = 2; print 'Το καθολικό x άλλαξε σε', x / func() / print 'Η τιμή του x είναι', x → 50, 2, 2. Χωρίς global η τελευταία γραμμή θα τύπωνε 50. Για απλή ανάγνωση της καθολικής μεταβλητής η global δεν χρειάζεται.
Σύνοψη: (ενδεικτική) Δηλώνει μέσα σε συνάρτηση ότι το όνομα αναφέρεται στην καθολική μεταβλητή (όχι σε νέα τοπική), ώστε η εκχώρηση να αλλάζει την καθολική μόνιμα· χωρίς αυτήν η εκχώρηση δημιουργεί τοπική που υπερκαλύπτει την καθολική.
Κριτήρια αξιολόγησης:
- Λειτουργία + ο λόγος (κανόνας εκχώρησης) + παράδειγμα.
Ερώτηση 6 — Τα αρθρώματα
Ερώτηση: Τι γνωρίζετε για τα αρθρώματα;
Απάντηση:
- Τι είναι: ένα άρθρωμα (module) είναι ένα αρχείο κώδικα Python (με επέκταση .py) που μπορεί να ορίζει συναρτήσεις, κλάσεις και μεταβλητές· είναι κι αυτό ένα αντικείμενο Python (σελ. 117). Στη σύνοψη: «συλλογή σχετικών συναρτήσεων που αποθηκεύεται σε αρχείο .py».
- Σε τι χρησιμεύουν: οι συναρτήσεις επιτρέπουν επαναχρησιμοποίηση κώδικα μέσα σε ένα πρόγραμμα· τα αρθρώματα επιτρέπουν την επαναχρησιμοποίηση ενός αριθμού συναρτήσεων σε άλλα προγράμματα — «όπως οι συναρτήσεις είναι επαναχρησιμοποιούμενα μέρη προγραμμάτων, τα αρθρώματα είναι επαναχρησιμοποιούμενα προγράμματα». Οργανώνουν λογικά τον κώδικα: η ομαδοποίηση σχετικού κώδικα κάνει τον κώδικα ευκολότερο στην κατανόηση και χρήση.
- Πώς δημιουργούνται/χρησιμοποιούνται: ο απλούστερος τρόπος είναι ένα αρχείο .py με συναρτήσεις και μεταβλητές (μπορούμε να γράψουμε δικά μας)· για να χρησιμοποιηθεί, το εισάγουμε με τη δήλωση import (ή from…import) και προσπελαύνουμε τα περιεχόμενα με συμβολισμό με τελεία (
math.sqrt). Η πρότυπη βιβλιοθήκη της Python είναι μια τεράστια συλλογή αρθρωμάτων (math, random, Tkinter, sqlite3…), και τα αρθρώματα οργανώνονται ιεραρχικά σε πακέτα.
Σύνοψη: (ενδεικτική) Άρθρωμα = αρχείο .py με συναρτήσεις/κλάσεις/μεταβλητές (αντικείμενο Python) για επαναχρησιμοποίηση κώδικα σε άλλα προγράμματα και λογική οργάνωση· εισάγεται με import, χρήση με dot notation· παραδείγματα η πρότυπη βιβλιοθήκη· οργανώνονται σε πακέτα.
Κριτήρια αξιολόγησης:
- Ορισμός, σκοπός, δημιουργία, χρήση (import/τελεία).
Ερώτηση 7 — Η χρησιμότητα της δήλωσης import
Ερώτηση: Ποια είναι η χρησιμότητα της δήλωσης import;
Απάντηση:
- Η δήλωση import εισάγει ένα άρθρωμα (ή βιβλιοθήκη) στο πρόγραμμά μας, ώστε να μπορούμε να χρησιμοποιήσουμε τις συναρτήσεις, τις μεταβλητές (σταθερές) και τις κλάσεις που ορίζει — χωρίς import ο κώδικας του αρθρώματος δεν είναι διαθέσιμος (σελ. 117-118).
- Μορφές:
import module1[, module2, …] — εισάγει ολόκληρα τα αρθρώματα· η πρόσβαση γίνεται με συμβολισμό με τελεία: import math → math.pi, math.sqrt(2). from modname import name1[, name2…] — εισάγει συγκεκριμένα χαρακτηριστικά χωρίς όλο το άρθρωμα, που χρησιμοποιούνται απευθείας: from math import pi → print pi. from modname import * — εισάγει όλα τα περιεχόμενα (π.χ. cos(pi) → −1.0), αλλά δεν ενδείκνυται η συχνή χρήση του (κίνδυνος συγκρούσεων ονομάτων).
- Έτσι διακρίνονται στο πρόγραμμα οι συναρτήσεις εξωτερικών αρθρωμάτων (χρειάζονται import) από τις ενσωματωμένες (abs — πάντα διαθέσιμες) και τις δικές μας (def).
Σύνοψη: (ενδεικτική) Εισάγει στο πρόγραμμα ένα άρθρωμα/βιβλιοθήκη για να χρησιμοποιηθούν οι συναρτήσεις και οι μεταβλητές του — import module (πρόσβαση με τελεία), from module import όνομα (απευθείας), from module import * (όλα, όχι συχνά).
Κριτήρια αξιολόγησης:
- Σκοπός + τρεις μορφές με παράδειγμα.
Ερώτηση 8 — Τα πακέτα της Python
Ερώτηση: Τι γνωρίζετε για τα πακέτα της Python;
Απάντηση:
- Τα πακέτα (packages) είναι εργαλείο για την ιεραρχική οργάνωση των αρθρωμάτων (σελ. 121). Στα προγράμματα υπάρχει ιεραρχία: οι μεταβλητές μπαίνουν μέσα στις συναρτήσεις, οι συναρτήσεις και οι καθολικές μεταβλητές μέσα σε αρθρώματα, και τα αρθρώματα οργανώνονται σε πακέτα.
- Η Python παρέχει ένα απλό σύστημα δημιουργίας πακέτων, ως επέκταση του μηχανισμού των αρθρωμάτων: κάθε κατάλογος (φάκελος) που περιέχει ένα αρχείο init.py αναφέρεται ως πακέτο Python. Τα αρθρώματα (αρχεία .py) μέσα στον κατάλογο είναι τα μέλη του πακέτου και εισάγονται με τον συμβολισμό με τελεία (π.χ.
import πακέτο.άρθρωμα).
- Η πρότυπη βιβλιοθήκη που συνοδεύει την Python είναι παράδειγμα τέτοιων πακέτων και αρθρωμάτων (σύνοψη, σελ. 124).
Σύνοψη: (ενδεικτική) Πακέτο = εργαλείο ιεραρχικής οργάνωσης αρθρωμάτων: κατάλογος που περιέχει αρχείο init.py, επέκταση του μηχανισμού των αρθρωμάτων (μεταβλητές → συναρτήσεις → αρθρώματα → πακέτα)· η πρότυπη βιβλιοθήκη αποτελείται από πακέτα και αρθρώματα.
Κριτήρια αξιολόγησης:
- Ορισμός με init.py + ιεραρχία.
Ερώτηση 9 — Η χρησιμότητα των βιβλιοθηκών
Ερώτηση: Ποια είναι η χρησιμότητα των βιβλιοθηκών;
Απάντηση:
- Μια βιβλιοθήκη (library) είναι μια συλλογή εργαλείων (έτοιμων συναρτήσεων/αρθρωμάτων), που μπορεί να έχουν γραφτεί και από άλλους προγραμματιστές, για την εκτέλεση συγκεκριμένων λειτουργιών (σελ. 119). Η χρησιμότητά τους:
- • Επαναχρησιμοποίηση κώδικα: δεν ξαναγράφουμε κώδικα που υπάρχει ήδη — «κερδίζουμε χρόνο και αποφεύγουμε λάθη» (σελ. 106), μειώνοντας την πολυπλοκότητα και την πιθανότητα σφαλμάτων (bugs) (σελ. 106).
- • Γρήγορη επίλυση προβλημάτων: πολλά προβλήματα λύνονται γρήγορα αν αξιοποιηθεί το εύρος δυνατοτήτων της πρότυπης βιβλιοθήκης (γραφικά Tkinter, αριθμητική επεξεργασία, web, βάσεις δεδομένων Sqlite3, βιοπληροφορική Biopython) και των εξωτερικών βιβλιοθηκών που προσφέρει η παγκόσμια κοινότητα — «πρόσθετες εργαλειοθήκες με έτοιμα εργαλεία», τα περισσότερα ελεύθερο λογισμικό (σελ. 124).
- • Δημιουργία ισχυρών, εντυπωσιακών και φιλικών εφαρμογών με λίγο κώδικα, και χρήση βιβλιοθηκών από άλλες γλώσσες μέσα στην Python. Οι βιβλιοθήκες εισάγονται με import και οι συναρτήσεις τους καλούνται με τον συμβολισμό με τελεία.
Σύνοψη: (ενδεικτική) Έτοιμα εργαλεία (συναρτήσεις/αρθρώματα) για συγκεκριμένες λειτουργίες: επαναχρησιμοποίηση χωρίς να ξαναγράφουμε κώδικα, λιγότερα λάθη και πολυπλοκότητα, γρήγορη επίλυση προβλημάτων (γραφικά, βάσεις, μαθηματικά…) και ισχυρές, φιλικές εφαρμογές· εισάγονται με import.
Κριτήρια αξιολόγησης:
- Ορισμός + τουλάχιστον τρία οφέλη + παραδείγματα βιβλιοθηκών.
Ερώτηση 10 — Τι ορίζει η εντολή def
Ερώτηση: Τι ορίζει η εντολή def;
Απάντηση:
- Η λέξη-κλειδί def ορίζει μια συνάρτηση (το μόνο είδος υποπρογράμματος της Python) που δημιουργεί ο προγραμματιστής (σελ. 107). Ο ορισμός περιλαμβάνει: τη λέξη def, το όνομα που ταυτοποιεί τη συνάρτηση, ένα ζεύγος παρενθέσεων με τις (προαιρετικές) παραμέτρους — ονόματα μεταβλητών χωρισμένα με κόμμα, χωρίς δήλωση τύπου — και διπλή τελεία (:)· από κάτω, σε εσοχή, οι εντολές που καθορίζουν τη λειτουργία της (σώμα), ενδεχομένως με return για επιστροφή τιμής.
- Παραδείγματα:
def fun_name(): print 'hello' (χωρίς παραμέτρους, κενή/void)· def find_sum(par1, par2): result = par1 + par2; return result (δύο παράμετροι, επιστρέφει τιμή). Η συνάρτηση πρέπει να έχει οριστεί πριν χρησιμοποιηθεί και οι εντολές της δεν εκτελούνται μέχρι να κληθεί — με το όνομά της και ορίσματα σε παρενθέσεις (find_sum(3, 4) → 7). Οι συναρτήσεις που ορίζονται με def είναι η τρίτη κατηγορία συναρτήσεων ενός προγράμματος, δίπλα στις ενσωματωμένες και σε αυτές των αρθρωμάτων (σελ. 118-119).
Σύνοψη: (ενδεικτική) Ορίζει μια συνάρτηση του προγραμματιστή: def όνομα(παράμετροι): + σώμα σε εσοχή (και return)· δεν εκτελείται μέχρι να κληθεί με ορίσματα, πρέπει να προηγείται της χρήσης.
Κριτήρια αξιολόγησης:
- Συντακτικά μέρη + κλήση/return.