Διάλεξη 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 είναι οι ακόλουθοι:

Μπορούνε να βρούμε τον τύπο ενός αντικειμένου χρησιμοποιώντας τη συνάρτηση type: Αν γράψουμε type(2) θα πάρουμε <class 'int'>, ενώ type(3.14) θα επιστρέψει <class 'float'> και type('John') θα επιστρέψει <class 'str'>, τον τύπο δηλαδή των strings. Αντικείμενα συγκεκριμένου τύπου και τελεστές μπορούν να συνδιάζονται έτσι ώστε να σχηματίζουν εκφράσεις (expressions), αντικείμενα δηλαδή του ιδίου τύπου. Για παράδειγμα 3+4 είναι ένα αντικείμενο τύπου int και 3.0 + 4.0 είναι ένα αντικείμενο τύπου float. Για τους αριθμητικούς τύπους int και float ορίζονται οι συνηθισμένες πράξεις της αριθμητικής αλλά και η πράξη της ύψωσης σε δύναμη και του υπολοίπου της διαίρεσης. Οι τελεστές σύγκρισης είναι == για ισότητα, != είναι ο τελεστής όχι ίσο, ενώ οι τελεστές <, ≤, >, ≥ έχουν την αναμενόμενη έννοια.

Η προτεραιότητα των αριθμητικών τελεστών είναι η συνηθισμένη: ο τελεστής ύψωσης σε δύναμη έχει την υψηλότερη προτεραιότητα, ακολουθούμενος από τους τελεστές προσήμου, τους τελεστές *, /, //, % και τέλος τους τελεστές της πρόσθεσης και αφαίρεσης. Βεβαίως, οι τελεστές σύγκρισης έχουν χαμηλότερη προτεραιότητα από όλους τους αριθμητικούς τελεστές.

Οι τελεστές του τύπου bool είναι:

Η προτεραιότητα του τελεστή 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).