1. Εισαγωγή στην Python#
Η φιλοσοφία της Python δίνει έμφαση στην εκφραστικότητα του κώδικα. Αυτό δίνει την δυνατότητα στον αρχάριο χρήστη της να παράγει γρήγορα αποτελέσματα. Παρακάτω παρουσιάζονται τα θεμελιώδη στοιχεία της γλώσσας που καλύπτουν τον αναγνώστη όσον αφορά τα παραδείγματα και τις ασκήσεις του συγγράμματος. Για τις πιο προχωρημένες δυνατότητες τις γλώσσας υπάρχει πληθώρα εξειδικευμένων συγγραμμάτων, καθώς κι η τεκμηρίωση (documentation) της καθιερωμένης (standard) Python.
1.1. Περιβάλλον εκτέλεσης της Python#
Για την εκτέλεση των παραδειγμάτων και την επίλυση των ασκήσεων που συνοδεύουν το σύγγραμμα, θα χρειαστεί πρόσβαση σε ένα περιβάλλον εκτέλεσης της Python (runtime). Προτείνονται οι παρακάτω επιλογές:
Εγκατάσταση στον υπολογιστή σας των παρακάτω πακέτων λογισμικού:
Python: Η επίσημη διανομή του Python Software Foundation.
Important
Κατά την εγκατάσταση στα windows ενεργοποιήστε την επιλογή “Add python.exe to PATH”.
-
Important
Κατά το πρώτο άνοιγμα ενός σημειωματάριου jupyter, το Visual Studio Code θα σας προτείνει την εγκατάσταση ορισμένων plugin, τα οποία θα πρέπει να αποδεχτείτε.
Χρήση ενός διαδικτυακού περιβάλλοντος εκτέλεσης σημειωματάριων jupyter, όπως:
1.2. Βασικοί τύποι δεδομένων#
Η Python υποστηρίζει τους βασικούς τύπους δεδομένων που συναντώνται στις περισσότερες γλώσσες προγραμματισμού.
Κατηγορία |
Τύπος |
Περιγραφή |
Παραδείγματα |
---|---|---|---|
Δεδομένα αληθείας |
bool |
Λογικές μεταβλητές |
True, False |
Αριθμοί |
int |
Ακέραιοι αριθμοί |
-1,0,10 |
float |
Πραγματικοί αριθμοί |
-1.0,0.0,1e1 |
|
complex |
Μιγαδικοί αριθμοί |
complex(1.,-2.) |
|
Κείμενο |
str |
Συμβολοσειρές |
“abc”,’d123’ |
Η καθιερωμένη Python δεν περιλαμβάνει τύπο ενός χαρακτήρα. Στην θέση του χρησιμοποιείται η συμβολοσειρά με μήκος ένα.
Στην Python η απόδοση τύπων στις μεταβλητές είναι δυναμική, δηλαδή μπορεί να αλλάξει κατά την διάρκεια της εκτέλεσης. Συνήθως δεν χρειάζεται να ορίσουμε τον τύπο της μεταβλητής, αλλά συνάγεται από την αποδιδόμενη τιμή. Αυτό το χαρακτηριστικό της Python παρέχει ευελιξία, αλλά μπορεί να οδηγήσει και σε σφάλματα χωρίς την δέουσα προσοχή. Ο τύπος μία μεταβλητής επιστρέφεται με την συνάρτηση type.
a = 3 # int
c = 1.5 # float
d = complex(3, -2) # complex 3-2j
e = True # bool
e = "ab ac" # Variable e is now type str
print(type(e)) #
<class 'str'>
Οι τύποι δεδομένων χρησιμεύουν και ως συναρτήσεις μετατροπής.
a = int(3.5) # int to float
b = float(0) # float to int
Η πλήρης λίστα των εγγενών τύπων (built-in types) είναι διαθέσιμη στην τεκμηρίωση.
1.3. Συμβολοσειρές#
Οι συμβολοσειρές μιας γραμμής ορίζονται με εισαγωγικά μονής ή διπλής αποστρόφου.
line = "line 1"
print(line)
line 1
Μπορούμε να ορίσουμε μια συμβολοσειρά μεγάλου μήκους με πολλές γραμμές κώδικα χρησιμοποιώντας συμβολοσειρές σε παρένθεση.
bigstring = (
"This string spreads over several "
"lines, that is why we prefer to "
"use implicit string concatenation."
)
print(bigstring)
This string spreads over several lines, that is why we prefer to use implicit string concatenation.
Τέλος για τον ορισμό συμβολοσειρών πολλαπλών γραμμών μπορούμε να χρησιμοποιήσουμε τρεις χαρακτήρες εισαγωγικών.
lines = """
line 1
line 2
line 3
"""
print(lines)
line 1
line 2
line 3
1.4. Μορφοποίηση αριθμών σε συμβολοσειρές#
Από την έκδοση 3.6 έχουν εισαχθεί στην Python οι συμβολοσειρές τύπου f (f-strings), οι οποίες διευκολύνουν την μορφοποίηση μεταβλητών άλλου τύπου σε κείμενο. Οι συμβολοσειρές αυτού του τύπου ξεκινάνε με το γράμμα f πριν τα πρώτα εισαγωγικά και περιλαμβάνουν πεδία για την εξαγωγή των μεταβλητών, τα οποία σημειώνονται με άγκιστρα. Τα πεδία αυτά περιλαμβάνουν και τις παραμέτρους μορφοποίησης της μεταβλητής. Η σύνταξη για αριθμητικές μεταβλητές δίνεται παρακάτω:
f"...{value:[minimumwidth].[decimals][type]}..."
όπου:
minimumwidth, το ελάχιστο πλήθος χαρακτήρων συμπεριλαμβανομένων αριθμητικών ψηφίων, προσήμων και άλλων συμβόλων.
decimals, το πλήθος δεκαδικών
type, ο τύπος μορφοποίησης
Τύπος μορφοποίησης |
Τύπος μεταβλητής |
Περιγραφή |
|
---|---|---|---|
d |
decimal |
integer |
Ακέραιοι αριθμοί |
f |
fixed |
float |
Δεκαδικοί αριθμοί |
e |
exponent |
Επιστημονική σημειογραφία |
|
g |
general |
Γενική μορφή |
|
% |
percentage |
Ποσοστό τοις εκατό |
Περισσότερες λεπτομέρειες για τους διαθέσιμους τύπους μορφοποίησης δίνονται στην βελτιωτική πρόταση PEP 3101.
pi = 3.1415927
# Integer with at least 4 characters
print(f"{10:4d}")
10
# float with a minimum length of 10 characters and 2 decimals
print(f"Ο αριθμός π είναι {pi:10.2f}")
Ο αριθμός π είναι 3.14
# scientific notation with 2 decimals
print(f"Ο αριθμός π είναι {pi:.2e}")
Ο αριθμός π είναι 3.14e+00
# Percentage notation with 1 decimal
print(f"1/4 = {0.25:.1%}")
1/4 = 25.0%
Important
Κατά την εξαγωγή αριθμών τύπου float γίνεται συχνά μορφοποίηση σε λιγότερα ψηφία από αυτά που είναι αποθηκευμένα στην μνήμη. Στους σύγχρονους υπολογιστές εφαρμόζεται o κανόνας Round to nearest, ties to even, δηλαδή το μισό στρογγυλοποιείται προς τον κοντινότερο άρτιο αριθμό ανεξάρτητα αν είναι προς τα πάνω ή κάτω. Η συμπεριφορά αυτή είναι στατιστικά πιο ακριβής από την μονομερή στρογγυλοποίηση προς τα πάνω ή κάτω.
a = 2.015
b = 2.025
c = 2.035
print(f"Initial Rounded")
print(f"{a:7.3f} {a:7.2f}")
print(f"{b:7.3f} {b:7.2f}")
print(f"{c:7.3f} {c:7.2f}")
Initial Rounded
2.015 2.02
2.025 2.02
2.035 2.04
1.5. Περιέκτες#
Για να διαχειριζόμαστε δεδομένα που σχετίζονται μεταξύ τους είναι καλύτερα να τα οργανώνουμε σε δομές αντί για μεμονωμένες μεταβλητές. Η καθιερωμένη Python παρέχει μια ποικιλία από έτοιμες δομές δεδομένων, οι οποίες έχουν την δυνατότητα να συγκεντρώσουν πολλαπλά στοιχεία και για αυτό ονομάζονται περιέκτες (containers). Για να καλύψουν ένα μεγάλο εύρος προβλημάτων, διατίθεται περιέκτες με διαφορετικές ιδιότητες. Οι ιδιότητες αυτές είναι σημαντικές γιατί μας δείχνουν ποιες μεθόδους μπορούμε να χρησιμοποιήσουμε σε κάθε περιέκτη. Συγκεκριμένα ένα περιέκτης μπορεί να χαρακτηριστεί:
διατρέξιμος
ομογενής/ετερογενής
διατεταγμένος
μεταβλητός/αμετάβλητος
δεικτοδοτούμενος
Το κοινό χαρακτηριστικό όλων των περιεκτών είναι ότι είναι διατρέξιμοι.
Ορισμός
Διατρέξιμος (iterable) ονομάζεται ο περιέκτης που μπορεί να μας επιστρέψει ένα ένα τα στοιχεία του. Αυτό είναι ένα χρήσιμο χαρακτηριστικό που συνδυάζεται με τους βρόχους επανάληψης for.
Παρακάτω δίνεται έμφαση στους περιέκτες με την πιο ευρεία εφαρμογή που είναι όλοι ετερογενείς.
Ορισμός
Ετερογενής (heterogeneous) χαρακτηρίζεται ο περιέκτης που δύναται να συμπεριλάβει στοιχεία διαφορετικού τύπου. Τα στοιχεία μπορεί να είναι μεταβλητές βασικού τύπου, αλλά κι άλλοι περιέκτες. Το τελευταίο μας δίνει την δυνατότητα να οργανώσουμε τα δεδομένα μας σε δομές με επίπεδα ιεράρχησης.
Οι υπόλοιπες ιδιότητες των περιεκτών διαφοροποιούνται για να μας προσφέρουν λύσεις σε ένα μεγάλο εύρος προβλημάτων, όπως φαίνεται στον Πίνακα 1.3.
Τύπος |
Περιγραφή |
Κύριο χαρακτηριστικό |
Σύνταξη |
---|---|---|---|
list |
Λίστες |
Μεταβλητή διάταξη |
[1,2,4,1] |
tuple |
Πλειάδες |
Αμετάβλητη διάταξη |
(1,2,4) |
set |
Σύνολα |
Μη διατεταγμένος περιέκτης |
{1,2,4} |
dict |
Λεξικά |
Δεικτοδοτούμενος περιέκτης |
{“a”:1,”b”:2,”c”:4} |
Στην συνέχεια περιγράφονται οι ευρέως χρησιμοποιούμενοι περιέκτες παράλληλα με τις ιδιότητες που τους διαφοροποιούν για καλύτερη κατανόηση.
1.5.1. Λίστες#
Η λίστα (list) αποτελεί την πιο συνηθισμένη δομή της Python, καθώς έχει τους λιγότερους περιορισμούς και τις περισσότερες μεθόδους. Η ανάθεση συντάσσεται με αγκύλες μέσα στις οποίες τα στοιχεία διαχωρίζονται με κόμμα.
mylist = [1, 2, 3, 4]
heterogeneous_list = [3.0, "a", "Ab", mylist]
Το κύριο χαρακτηριστικό της λίστας είναι ότι αποτελεί διάταξη.
Ορισμός
Διάταξη (sequence) ονομάζεται ο περιέκτης στον οποίο η σειρά των στοιχείων είναι σημαντική. Αυτό μας δίνει την δυνατότητα να αναφερθούμε σε ένα στοιχείο του με έναν δείκτη θέσης. Θα χρησιμοποιήσουμε και το επίθετο διατεταγμένος με την ίδια έννοια.
Η αρίθμηση σε μια λίστα \(n\) στοιχείων ξεκινάει από το 0 και τερματίζει στο \(n-1\). Ο δείκτης θέσης χρησιμοποιείται εντός αγκυλών και μπορεί να είναι ακέραιος αριθμός, θετικός ή αρνητικός.
print(mylist[0], mylist[1], mylist[2], mylist[3])
1 2 3 4
Αρνητικοί δείκτες θέσης χρησιμοποιούνται για να μετρήσουμε από το τέλος. Το -1 αντιστοιχεί στο τελευταίο στοιχείο.
print(mylist[-1], mylist[-2])
4 3
Οι λίστες είναι μεταβλητοί περιέκτες και τροποποιούνται με απλές αναθέσεις τιμής ή μεθόδους όπως η append, η remove και η pop.
Ορισμός
Αμετάβλητο (immutable) ονομάζεται ένα αντικείμενο το οποίο δεν μπορεί να τροποποιηθεί μερικά. Στην περίπτωση ενός περιέκτη αυτό αφορά τόσο το πλήθος, όσο και το περιεχόμενο των στοιχείων του. Ο μόνος τρόπος να αλλάξει ένα αμετάβλητο αντικείμενο είναι να του ανατεθεί τιμή εξ ολοκλήρου. Ο περιορισμός αυτός δεν ισχύει για ένα μεταβλητό (mutable) αντικείμενο.
mylist[2] = 2
mylist.append(1)
mylist.remove(4)
print(mylist)
[1, 2, 2, 1]
Exercise 1.1
Αποθηκεύστε τον παρακάτω πίνακα σε μια λίστα που διατηρεί τις διαστάσεις του:
Solution to Exercise 1.1
Ένας δισδιάστατος πίνακας μπορεί να θεωρηθεί ως μονοδιάστατος πίνακας-στήλη με στοιχεία ολόκληρες γραμμές.
Για να διατηρήσουμε τις διαστάσεις του πίνακα \(Α\), θα δημιουργήσουμε 3 λίστες 4 στοιχείων σε αντιστοιχία με τις γραμμές του αρχικού πίνακα και θα τις εντάξουμε σε μια εξωτερική λίστα 3 στοιχείων.
A = [[4, 2, -1, 0], [1, -2, 3, 0], [2, 2, -1, 0]]
print(A)
[[4, 2, -1, 0], [1, -2, 3, 0], [2, 2, -1, 0]]
Important
Στα επόμενα κεφάλαια θα χρησιμοποιήσουμε εκτενώς την μαθηματική έννοια των πολυδιάστατων πινάκων. Για να ορίζουμε πίνακες στον κώδικά μας θα χρησιμοποιούμε συχνά λίστες, τις οποίες όμως θα μετατρέπουμε σε πιο κατάλληλο τύπο για την διεξαγωγή μαθηματικών υπολογισμών.
1.5.2. Πλειάδες#
Η πλειάδα (tuple) έχει τις ίδιες ιδιότητες με την λίστα με την διαφορά ότι είναι αμετάβλητη.
Η σύνταξη της ανάθεσης τιμής σε πλειάδες είναι παρόμοια με τις λίστες αλλά με παρενθέσεις αντί για αγκύλες. Προσέξτε ότι οι παρενθέσεις μπορούν να παραληφθούν εφόσον δεν υπάρχει αμφισημία με τα συμφραζόμενα.
mytuple1 = (1, 2, 3, 4)
mytuple2 = 1, 2, 3, 4
print(mytuple2)
(1, 2, 3, 4)
1.5.3. Σύνολα#
Το σύνολο (set) είναι ένας μη διατεταγμένος και επομένως μη δεικτοδοτούμενος περιέκτης.
Ορισμός
Δεικτοδοτούμενος (subscriptable[1]) ονομάζεται ο περιέκτης που μας δίνει την δυνατότητα να αναφερθούμε σε ένα στοιχείο του με έναν δείκτη σε αγκύλες. Ένας διατεταγμένος περιέκτης είναι πάντα δεικτοδοτούμενος, άλλα όχι το αντίστροφο.
Η ανάθεση συνόλου συντάσσεται με αγκύλες. Εφόσον δεν υφίσταται διάταξη, δεν έχει νόημα να αποθηκευτεί η ίδια τιμή παραπάνω από μία φορά (αποθηκεύεται μόνο η πρώτη).
myset = {1, 2, 3, 1}
print(myset)
{1, 2, 3}
Είναι μεταβλητός περιέκτης και επομένως μπορούμε να προσθέσουμε ή να αφαιρέσουμε στοιχεία με τις μεθόδους add και remove.
myset.add(4)
print(myset)
myset.remove(2)
print(myset)
{1, 2, 3, 4}
{1, 3, 4}
Επιπλέον μπορούμε να χρησιμοποιήσουμε μεθόδους για την ένωση (union), τομή (intersection) και διαφορά (difference) συνόλων, όπως ορίζονται στα μαθηματικά.
1.5.4. Λεξικά#
To λεξικό (dictionary) αποτελεί μια επέκταση του συνόλου, όπου τα στοιχεία αποτελούν ζευγάρια κλειδιών (keys) και τιμών (values). Η ανάθεση τιμής σε λεξικό συντάσσεται με άγκιστρα όπως στο σύνολο, αλλά επιπλέον περιλαμβάνει άνω κάτω τελείες για τον διαχωρισμό κλειδιών και τιμών.
mydict = {"a": 1, "b": 2, "c": 3}
print(mydict)
{'a': 1, 'b': 2, 'c': 3}
Το λεξικό διαφοροποιείται από το σύνολο στο ότι είναι δεικτοδοτούμενος περιέκτης. Μπορούμε να ανατρέξουμε σε μια συγκεκριμένη τιμή του λεξικού ή να δηλώσουμε ένα καινούργιο ζευγάρι χρησιμοποιώντας το κλειδί ως δείκτη.
print(mydict["a"])
mydict["d"] = 4
print(mydict)
1
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
Αν σε ένα λεξικό δηλώσουμε ζευγάρι με το ίδιο κλειδί περισσότερες από μία φορά, αποθηκεύεται μόνο η τελευταία φορά. Τα κλειδιά μπορούν να είναι συμβολοσειρές, ακέραιοι αριθμοί, πραγματικοί αριθμοί, ακόμα και πλειάδες.
Exercise 1.2
Η συμβολοσειρά (str) της Python είναι ένας περιέκτης χαρακτήρων. Ποια είναι τα χαρακτηριστικά της;
Solution to Exercise 1.2
Η συμβολοσειρά (str) της Python είναι ένας
ομογενής
διατεταγμένος
μεταβλητός
περιέκτης.
Θα μπορούσαμε να αναφέρουμε ότι είναι διατρέξιμος και δεικτοδοτούμενος, αλλά αυτό είναι πλεονασμός.
1.6. Εύρη αριθμών#
Μια άλλη εγγενής δομή που χρησιμοποιείται πολύ συχνά είναι το εύρος αριθμών (range). To εύρος αριθμών δηλώνει μία ακολουθία ακεραίων αριθμών με σταθερό βήμα και δημιουργείται με δηλώσεις της μορφής:
range(stop)
range(start, stop[, step])
Μπορείτε να δηλώσετε από ένα μέχρι τρία ορίσματα. Από τα τρία ορίσματα μόνο η τιμή τερματισμού stop δηλώνεται υποχρεωτικά. Η τιμή εκκίνησης start είναι προαιρετική με προεπιλεγμένη τιμή το 0. Το βήμα step είναι προαιρετικό με προεπιλεγμένη τιμή το 1, αλλά αν θέλουμε να το αλλάξουμε πρέπει να δηλώσουμε και την τιμή εκκίνησης (σύνολο 3 ορίσματα).
Important
Η τιμή τερματισμού δεν περιλαμβάνεται στην επιστρεφόμενη ακολουθία, η οποία αντιστοιχεί στο ημιανοιχτό διάστημα \([\text{start},\text{stop})\).
Το εύρος αριθμών είναι διατρέξιμο και χρησιμοποιείται συχνά με τους βρόχους επανάληψης for. Επίσης είναι δεικτοδοτούμενο, όπως και οι διατάξεις. Προσέξτε ότι κατά την δημιουργία ενός εύρους αριθμών δεν γίνεται υπολογισμός των τιμών της ακολουθίας για λόγους εξοικονόμησης μνήμης. Ο υπολογισμός γίνεται κάθε φορά που χρησιμοποιούμε το εύρος αριθμών.
print(range(3)) # range definition
print(range(3)[2]) # subscript
print(range(10, -1, -1)) # range definition
print(list(range(10, -1, -1))) # range calculation and conversion to list
range(0, 3)
2
range(10, -1, -1)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
1.7. Τμήματα διατάξεων#
Μπορούμε να επιλέξουμε ένα τμήμα (slice) μια λίστας ή πλειάδας με έναν δείκτη θέσης που μοιάζει με την σύνταξη του range:
[start:end[:step]]
όπου:
start ο δείκτης θέσης του πρώτου στοιχείου που θέλουμε επιλέξουμε
end ο δείκτης θέσης του στοιχείου μετά το τελευταίο που θέλουμε να επιλέξουμε
step το βήμα προσαύξησης με προεπιλεγμένη τιμή το 1.
Important
Εκτός από το step, μπορούμε να παραλείψουμε το start ή/και το end, αν θέλουμε να ορίσουμε τα αντίστοιχα άκρα της διάταξης.
Αν το βήμα είναι αρνητικό, το start πρέπει να είναι μεγαλύτερο από το end. Σε διαφορετική περίπτωση παίρνουμε ένα άδειο τμήμα.
Κατά την ανάθεση μια νέας μεταβλητής σε ένα τμήμα μιας διάταξης δεν δημιουργείται αντίγραφο αλλά μια αναφορά στον ίδιο χώρο μνήμης.
mylist = [1, 2, 3, 4]
shortlist = mylist[0:2]
print(shortlist)
reverselist = mylist[::-1]
print(reverselist)
[1, 2]
[4, 3, 2, 1]
1.8. Τελεστές#
1.8.1. Αριθμητικοί τελεστές#
Η προτεραιότητα των πράξεων ακολουθεί τις μαθηματικές συμβάσεις σύμφωνα με την ακολουθία:
Παρενθέσεις
Δυνάμεις
Πρόσημα
Πολλαπλασιασμοί και διαιρέσεις
Αθροίσματα και διαφορές
Κατ’εξαίρεση το πρόσημο έχει προτεραιότητα όταν ακολουθεί τον τελεστή της δύναμης, δηλαδή σε εκφράσεις “a**-b”.
a = 3.0
b = 1.5
-a # sign change (unary operator)
a + b
a - b
a * b
a / b # float division
a // b # integer (floor) division
a % b # modulus (float or integer)
a**b # power
5.196152422706632
Important
Ο τελεστής της δύναμης είναι δύο αστερίσκοι και όχι το καπέλο “^”. Το καπέλο χρησιμοποιείται για τον τελεστή bitwise xor και αν το χρησιμοποιήσετε με ακέραιους αριθμούς, δεν θα πάρετε μήνυμα λάθους.
Προσέξτε ότι στην αυτόματη μορφοποίηση κώδικα της Python όλοι οι τελεστές μαθηματικών πράξεων παίρνουν κενά δεξιά και αριστερά. Εξαίρεση αποτελεί το πρόσημο και η δύναμη για να τονισθεί η προτεραιότητά τους.
Tip
Μπορείτε να χρησιμοποιήσετε την γραμμή εντολών της Python ως αριθμομηχανή. Σε αυτή την περίπτωση είναι χρήσιμη η μεταβλητή “_” που αποθηκεύει το τελευταίο αποτέλεσμα.
Exercise 1.3
Υπολογίστε την παρακάτω μαθηματική έκφραση και το τετράγωνό της.
Solution to Exercise 1.3
a = (3 ** (3 / 2) + 5) / (8 + 2)
print(a, a**2)
1.0196152422706632 1.0396152422706633
1.8.2. Λογικοί και συγκριτικοί τελεστές#
Οι συγκριτικοί τελεστές προσομοιάζουν τα αντίστοιχα μαθηματικά σύμβολα ισότητας και ανισότητας. Προσέξτε την διαφοροποίηση του ελέγχου ισότητας από την απόδοση τιμής με την χρήση διπλού συμβόλου “=”. Όσον αφορά την προτεραιότητα, οι μαθηματικές πράξεις προηγούνται των συγκριτικών τελεστών, οι οποίοι ακολουθούνται από τους λογικούς τελεστές.
a = 3.0
b = 1.5
c = 10.0
a > b
a >= b
a < b
a <= b
a == b # double equal mark
a != b # not equal
a < b and b < c
not (a > b or b > c) # Equivalent with the above
a < b < c # Equivalent with the above
False
1.9. Έλεγχος ροής και στοίχιση#
Για τον έλεγχο ροής χρησιμοποιούνται οι γνωστές δηλώσεις if, for και while που συναντώνται και σε άλλες γλώσσες προγραμματισμού. Οι δηλώσεις αυτές καταλήγουν σε άνω κάτω τελεία που υποδηλώνει ότι ακολουθεί μία νέα ενότητα κώδικα (block). Κάθε νέα ενότητα κώδικα στοιχίζεται 4 (κατά σύμβαση) χαρακτήρες προς τα δεξιά. Για να υποδείξουμε το τέλος μια ενότητας κώδικα αρκεί να επιστρέψουμε 4 θέσεις αριστερά. Η στοίχιση είναι συστατικό της σύνταξης της Python και οποιαδήποτε ασυνέπεια θα προκαλέσει σφάλμα.
Παρακάτω δίνονται ορισμένα παραδείγματα.
a = 8
b = 10
if b != 0:
x = a / b
print(x)
elif a == 0 and b == 0:
print("Not a number")
else:
print("Infinite")
0.8
a = [] # empty list
for i in range(4):
a.append(i**2) # Add element to end of list
b = [i**2 for i in range(4)] # Equivalent expression
print(a == b) # check set equivalence
True
Οι βρόχοι επανάληψης for και while μπορούν να τερματιστούν πρόωρα με την εντολή break ή να ξεκινήσουν καινούργια επανάληψη με την εντολή continue.
i = 0
n = 0
while i < 10:
i += 1
if i < 0:
break # Exit while loop
if i % 2 == 0: # Check if even number
n += i
else:
continue # Start new iteration
print(i)
print(n)
2
4
6
8
10
30
1.10. Συναρτήσεις και τεκμηρίωση#
Οι αριθμητικοί και συγκριτικοί τελεστές που αναφέρθηκαν παραπάνω είναι στην πραγματικότητα συντομεύσεις για εγγενείς συναρτήσεις της Python. Μπορούμε να ορίσουμε και τις δικές μας συναρτήσεις με την εντολή def. Κάθε εντολή def ακολουθείται από μια ενότητα κώδικα. Η εντολή return τερματίζει την εκτέλεση της συνάρτησης επιστρέφοντας τον έλεγχο και μία μεταβλητή. Μπορεί να χρησιμοποιηθεί περισσότερες μία ή περισσότερες φορές ή και καθόλου, οπότε η συνάρτηση θα τερματιστεί στην τελευταία γραμμή της ενότητας κώδικα.
def f(x):
f = x**2 + 2 * x + 1 # blocks are denoted by indentation
return f
def g(x: float) -> float: # with type annotations and docstring
"""
Calculates y=x^2+2x+1.
Args:
x: float
Returns:
y: float
"""
return x**2 + 2 * x + 1
print(f(0.5), g(0.5), g(2))
help(g)
2.25 2.25 9
Help on function g in module __main__:
g(x: float) -> float
Calculates y=x^2+2x+1.
Args:
x: float
Returns:
y: float
Στο παραπάνω παράδειγμα η συνάρτηση g περιλαμβάνει:
δύο υποδείξεις τύπου (type hints) με τα σύμβολα “:” και “->” στην δήλωση def.
ένα κείμενο τεκμηρίωσης (docstring) στην γραμμή που ακολουθεί την δήλωση def.
Για τον διερμηνευτή της Python η g είναι ισοδύναμη με την f. Οι υποδείξεις τύπου ενημερώνουν τον προγραμματιστή ότι η συνάρτηση g(x) δέχεται μία μεταβλητή τύπου float και επιστρέφει μία μεταβλητή ίδιου τύπου, ενώ το κείμενο τεκμηρίωσης επεξηγεί περαιτέρω τον υπολογισμό. Οι υποδείξεις τύπου δεν λαμβάνονται υπόψη από τον διερμηνευτή και για αυτό κατά την κλήση της συνάρτησης g με διαφορετικό τύπο ορίσματος (int), η συνάρτηση εκτελείται κανονικά.
Tip
Η χρήση υποδείξεων τύπου και κείμενου τεκμηρίωσης στις συναρτήσεις αποτελεί μια καλή πρακτική και συνίσταται εμφατικά. Οι πληροφορίες αυτές είναι άμεσα διαθέσιμες στον προγραμματιστή με την εντολή help, ενώ αξιοποιούνται από τα ολοκληρωμένα περιβάλλοντα ανάπτυξης (IDE).
1.11. Μονάδες κώδικα#
Όταν ο κώδικάς μας μεγαλώσει σε μέγεθος, συνήθως είναι πιο πρακτικό να τον οργανώσουμε σε πολλά αρχεία συγκεντρώνοντας συναφείς συναρτήσεις και κλάσεις. Μπορεί μάλιστα κάποια συνάρτηση να είναι χρήσιμη και σε άλλες εφαρμογές μας, οπότε θα ήταν καλό να την χρησιμοποιήσουμε χωρίς να την αντιγράψουμε. Η Python παρέχει αυτή την δυνατότητα μέσω των μονάδων κώδικα (modules). Κάθε αρχείο της Python αποτελεί μία μονάδα κώδικα και οι δηλώσεις της μπορούν να εισαχθούν σε ένα άλλο αρχείο μέσω μιας δήλωσης import.
Η καθιερωμένη Python έχει μάλιστα τις δικές της μονάδες κώδικα, οι οποίες δεν εισάγονται εξ ορισμού για λόγους οικονομίας των ονομάτων αλλά είναι διαθέσιμες για χρήση κατά περίπτωση. Κάποιες από τις πιο συνηθισμένες μονάδες κώδικα είναι:
math για μαθηματικές συναρτήσεις και σταθερές,
os για αλληλεπίδραση με το λειτουργικό σύστημα
sys για αλληλεπίδραση με τον διερμηνευτή
Η τελεία χρησιμοποιείται για την αναφορά στον χώρο ονομάτων της μονάδας κώδικα sys. Για παράδειγμα η κλάση version_info της μονάδας κώδικα sys περιλαμβάνει την έκδοση του διερμηνευτή.
import sys
print(sys.version_info)
sys.version_info(major=3, minor=12, micro=5, releaselevel='final', serial=0)
Τέλος με την τελεία μπορούμε να προσπελάσουμε και τις υπομονάδες που είναι ενταγμένες σε μια μονάδα κώδικα. Για παράδειγμα η υπομονάδα os.path περιέχει χρήσιμες συναρτήσεις για την διαχείριση διαδρομών αρχείων.
import os
print(os.path.exists("."))
True
1.12. Βελτιωτικές προτάσεις (PEP)#
Η εξέλιξη της Python βασίζεται σε βελτιωτικές προτάσεις (Python Enhancement Proposals), γνωστές ως PEP, οι οποίες συντάσσονται και συναποφασίζονται από μέλη της κοινότητας της Python. Υπάρχουν τρεις μεγάλες κατηγορίες προτάσεων:
Προτάσεις που αφορούν τον σχεδιασμό προτύπων (Standards track), όπως:
τα χαρακτηριστικά της γλώσσας
τη λειτουργία του διερμηνευτή (interpreter) CPython
τη διαλειτουργικότητα με το υπόλοιπο οικοσύστημα
Πληροφοριακές προτάσεις (Informational)
Διαχειριστικές προτάσεις (Process)
Οι παρακάτω ενδεικτικές PEP παρουσιάζουν ενδιαφέρον:
PEP 1, Σκοπός και κατευθυντήριες γραμμές των PEP
PEP 8, Οδηγίες για το στυλ συγγραφής κώδικα Python
PEP 20, Το ζεν της Python
PEP 719, Χρονοδιάγραμμα κυκλοφορίας Python 3.13
PEP 745, Χρονοδιάγραμμα κυκλοφορίας Python 3.14