Διάλεξη 19ης Σεπτεμβρίου 2016
Σκοπός του συγκεκριμένου μαθήματος (όσο και της συνέχειάς του, ΜΕΜ-107) είναι η κατανόηση και η αναγνώριση της σημασίας των υπολογισμών στη λύση προβλημάτων. Επειδή, για τους περισσότερους φοιτητές του τμήματος, τα δύο αυτά μαθήματα είναι τα μόνα που θα πάρουν από την επιστήμη των υπολογιστών, δίνεται σημασία στην παράθεση όσο το δυνατόν περισσότερων προβλημάτων από διάφορα πεδία εφαρμογών αλλά και στην ανάπτυξη τεχνικών (αλγορίθμων) για την λύση τους με τη βοήθεια του υπολογιστή.
Μια γλώσσα προγραμματισμού, για μας η Python, αποτελεί το μέσο για την έκφραση των υπολογισμών και την υλοποίηση των αλγορίθμων για τη λύση προβλημάτων.
Ένα πρόγραμμα αποτελείται από μια σειρά ορισμών και εντολών οι οποίες ερμηνεύονται ή εκτελούνται από ένα άλλο πρόγραμμα, τον λεγόμενο
ερμηνευτή (interpreter) της Python. Τα αποτελέσματα της εκτέλεσης ενός προγράμματος εμφανίζονται, συνήθως, στην οθόνη του υπολογιστή.
Για παράδειγμα, αν το πρόγραμμά μας αποτελείται από την εντολή print('I am learing Python!')
, τότε μετά την εκτέλεσή του θα
δούμε στην οθόνη το μήνυμα I am learing Python!.
Μπορούμε να χρησιμοποιήσουμε τον ερμηνευτή της Python κατευθείαν από τη γραμμή εντολών του υπολογιστή μας δίνοντας την εντολή python3.
Ο υπολογιστής μας θα απαντήσει με τους χαρακτήρες >>>, το λεγόμενο σύμβολο αναμονής (prompt), το οποίο δηλώνει ότι ο ερμηνευτής
περιμένει εντολές από τον χρήστη. Στη διπλανή εικόνα φαίνεται η απάντηση του υπολογιστή στην εντολή print('I am learing Python!')
.
Για να είμαστε ακριβείς, print
είναι μια συνάρτηση (function) και 'I am learing Python!'
είναι το όρισμά της (argument). Η συνάρτηση print
μπορεί να κληθεί με περισσότερα του ενός ορίσματα, όπως για παράδειγμα,
print('My name is', 'Michael')
τα οποία θα τα εμφανίσει στην οθόνη χωρισμένα με ένα κενό χαρακτήρα και κατά τη σειρά με την
οποία δόθηκαν. Στις συγκεκριμένες χρήσεις της print
, τα ορίσματά της είναι ακολουθίες χαρακτήρων μεταξύ εισαγωγικών.
Τα εισαγωγικά δεν είναι μέρος της ακολουθίας χαρακτήρων, χρησιμεύουν απλά για να δηλώσουν την αρχή και το τέλος της. Αν τα εισαγωγικά πρέπει να είναι
μέρος της ακολουθίας χαρακτήρων το δηλώνουμε χρησιμοποιώντας το πρόθεμα '\'. Στην Python, αλλά και σε πολλές άλλες γλώσσες προγραμματισμού,
ο χαρακτήρας '\' ονομάζεται χαρακτήρας διαφυγής (escape character) και δηλώνει την ειδική μεταχείριση του χαρακτήρα που ακολουθεί.
Έτσι, μπορούμε, για παράδειγμα, να γράψουμε print('Wake up, it\'s late!')
για να δούμε τους
χαρακτήρες Wake up, it's late!. Αναφέρουμε επίσης τον χαρακτήρα αλλαγής γραμμής '\n', η εμφάνιση του
οποίου μεταφέρει την εκτύπωση στην επόμενη γραμμή. Τέλος, σημειώνουμε ότι μπορούμε να χρησιμοποιούμε διπλά εισαγωγικά στη θέση των απλών εισαγωγικών
χαρακτήρων.
>>> print('She said: \"I need a minute.\"')
She said: "I need a minute."
>>> print('He said: \"It\'s late, we\'d better leave now.\"')
He said: "It's late, we'd better leave now."
>>> print("So many books, so little time.\n-- Frank Zappa")
So many books, so little time.
-- Frank Zappa
Αντικείμενα, εκφράσεις και αριθμητικοί τύποι
Στην Python, τα αντικείμενα «ακολουθίες χαρακτήρων» ονομάζονται strings (συμβολοσειρές). Πέρα από τα strings, η Python χειρίζεται και άλλα αντικείμενα, τα λεγόμενα βαθμωτά αντικείμενα (scalar objects). Κάθε αντικείμενο έχει τύπο (type) ο οποίος ορίζει το τι μπορεί να κάνει ένα πρόγραμμα με ένα αντικείμενο του συγκεκριμένου τύπου. Οι τύποι των βαθμωτών αντικειμένων της Python είναι οι ακόλουθοι:
int
. Ο τύπος των ακεραίων αριθμών. Οι τιμές των αντικειμένων τύπουint
γράφονται με τον ίδιο τρόπο που γράφουμε τους ακέραιους αριθμούς στο δεκαδικό σύστημα, π.χ., 104, -213 κλπ.float
. Ο τύπος των πραγματικών αριθμών. Οι τιμές των αντικειμένων τύπουfloat
γράφονται είτε με συνήθη τρόπο αναπαράστασης αριθμών με δεκαδικό μέρος, π.χ. 3.14, -102.47, είτε με τον λεγόμενο επιστημονικό συμβολισμό (scientific notation). Για παράδειγμα, μπορούμε να γράψουμε1.23E-7
για να δηλώσουμε την τιμή $1.23\times 10^{-7}$ και6.022E23
για να αναπαραστήσουμε τη σταθερά του Avogadro. Ο όροςfloat
προέρχεται από το όνομα floating point (κινητή υποδιαστολή), τον τρόπο αναπαράστασης, δηλαδή, των πραγματικών αριθμών στον υπολογιστή.bool
. Ο τύπος των αντικειμένων με τιμέςTrue
καιFalse
.NoneType
. Ο τύπος αντικειμένων με μία και μοναδική τιμή, την τιμήNone
. Χρησιμοποιείται για να δηλώσει την απουσία κάποιας τιμής, όπως για παράδειγμα κατά την κλήση μιας συνάρτησης χωρίς τα προεπιλεγμένα ορίσματά της. (Περισσότερα για τον συγκεκριμένο τύπο αργότερα).
Μπορούνε να βρούμε τον τύπο ενός αντικειμένου χρησιμοποιώντας τη συνάρτηση type
: Αν γράψουμε type(2)
θα πάρουμε <class 'int'>, ενώ type(3.14)
θα επιστρέψει <class 'float'> και
type('John')
θα επιστρέψει <class 'str'>, τον τύπο δηλαδή των string
s.
Αντικείμενα συγκεκριμένου τύπου και τελεστές μπορούν να συνδιάζονται έτσι ώστε να σχηματίζουν εκφράσεις (expressions), αντικείμενα δηλαδή
του ιδίου τύπου. Για παράδειγμα 3+4
είναι ένα αντικείμενο τύπου int
και
3.0 + 4.0
είναι ένα αντικείμενο τύπου float
.
Για τους αριθμητικούς τύπους int
και float
ορίζονται οι συνηθισμένες πράξεις της
αριθμητικής αλλά και η πράξη της ύψωσης σε δύναμη και του υπολοίπου της διαίρεσης. Οι τελεστές σύγκρισης είναι
==
για ισότητα, !=
είναι ο τελεστής όχι ίσο, ενώ οι τελεστές <, ≤, >, ≥
έχουν
την αναμενόμενη έννοια.
i+j
είναι το άθροισμα τωνi
καιj
. Το άθροισμα έχει τύποint
ανi
καιj
είναι και οι δύο τύπουint
. Αν ο τύπος τουi
ή/και τουj
είναιfloat
, το άθροισμα έχει τύποfloat
. Τα ίδια ισχύουν, φυσικά, για την διαφοράi-j
.i*j
είναι το γινόμενο τωνi
καιj
. Το γινόμενο έχει τύποint
ανi
καιj
είναι και οι δύο τύπουint
. Αν ο τύπος τουi
ή/και τουj
είναιfloat
, το γινόμενο έχει τύποfloat
.i/j
είναι το πηλίκο τωνi
καιj
του οποίου ο τύπος είναι πάντοτεfloat
. Ο τελεστής//
είναι ο τελεστής της ακέραιας διαίρεσης, κατά την οποία το ακριβές αποτέλεσμα διαίρεσης στρογγυλοποιείται προς τα κάτω. Έτσι,12//5
είναι 2,13.0//4.0
είναι3.0
, αλλά-13//4
είναι -4.i%j
είναι το υπόλοιπο της διαίρεσης τουint i
με τονint j
.i**j
είναι τοi
στην δύναμηj
. Το αποτέλεσμα είναιint
αν και οι δύο τελεσταίοι είναι τύπουint
, διαφορετικά είναιfloat
.
Η προτεραιότητα των αριθμητικών τελεστών είναι η συνηθισμένη: ο τελεστής ύψωσης σε δύναμη έχει την υψηλότερη
προτεραιότητα, ακολουθούμενος από
τους τελεστές προσήμου, τους τελεστές *, /, //, %
και τέλος τους τελεστές της πρόσθεσης και αφαίρεσης.
Βεβαίως, οι τελεστές σύγκρισης έχουν χαμηλότερη προτεραιότητα από όλους τους αριθμητικούς τελεστές.
Οι τελεστές του τύπου bool
είναι:
a and b
είναιTrue
ανa
καιb
είναιTrue
,False
διαφορετικά.a or b
είναιTrue
αν τουλάχιστον ένα από ταa
καιb
είναιTrue
,False
διαφορετικά.not a
είναιTrue
ανa
είναιFalse
,True
διαφορετικά.
Η προτεραιότητα του τελεστή not
είναι μεγαλύτερη από αυτή του τελεστή and
η οποία
είναι μεγαλύτερη από αυτή του τελεστή or
. Η προτεραιότητα και των τριών αυτών τελεστών είναι μικρότερη από την
προτεραιότητα των τελεστών σύγκρισης η οποία με τη σειρά της είναι μικρότερη από την προτεραιότητα των αριθμητικών τελεστών.
Μεταβλητές και ο τελεστής ανάθεσης
Στην Python, οι μεταβλητές παρέχουν ένα τρόπο αντιστοίχισης ονομάτων με αντικείμενα. Για παράδειγμα, στον κώδικα
pi = 3.14
radius = 11
area = pi * (radius**2)
radius = 13
τα ονόματα pi, radius, area
"δένονται" κατ' αρχάς με τα αντικείμενα, 3.14, 11 και
pi * (radius**2)
,
ενώ στη συνέχεια το όνομα radius
"δένεται" με το αντικείμενο 13. Αυτό, φυσικά δεν έχει καμιά επίδραση στη τιμή της
μεταβλητής area
. Μια εντολή ανάθεσης, όπως οι προηγούμενες τέσσερις εντολές συσχετίζει το όνομα στα αριστερά του
συμβόλου =
με το αντικείμενο στα δεξιά του. Σημειώνουμε ακόμα ότι η Python επιτρέπει πολλαπλές αναθέσεις στην ίδια
εντολή, όπως για παράδειγμα, x, y = 1, 2
κατά την οποία τα ονόματα x, y
αντιστοιχίζονται
με τα αντικείμενα 1 και 2. Παρατηρήστε ότι η εντολή ανάθεσης x, y = y, x
ανταλλάσσει τις τιμές των μεταβλητών
x, y
γιατί πρώτα υπολογίζονται οι εκφράσεις στο δεξιό μέλος και στη συνέχεια εκτελούνται οι αντιστοιχίσεις ονομάτων
με αντικείμενα. Μπορούμε εύκολα να ελέγξουμε αυτό το γεγονός με την εντολή print('x =', x, 'y =', y)
.