Σημειωματάριο Τρίτης 6 Οκτ. 2015

Εισαγωγή στη γλώσσα python και τρόποι για να τρέξετε προγράμματα σε python

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

Αυτά που είδαμε για το πώς κάνουμε πράξεις με αριθμούς στην python μπορούν να συνοψιστούν αρκετά καλά σε αυτά που μπορείτε να βρείτε στη σελίδα αυτή (ελληνικά) και σε αρκετά μεγαλύτερη λεπτομέρεια στη σελίδα αυτή (αγγλικά).

Είναι απαραίτητο όταν θα διαβάζετε τις δύο παραπάνω σελίδες να μπορείτε να δοκιμάζετε στον υπολογιστή τον κώδικα που φαίνεται εκεί. (Μπορείτε για ευκολία να τον παίρνετε από τις σελίδες αυτές με copy-paste, ή, αν είναι μικρός, να τον γράφετε με το χέρι.)

Υπάρχουν πολλοί τρόποι να τρέξει κανείς ένα python interpreter. (Αυτό είναι το πρόγραμμα που διαβάζει τις εντολές ή το πρόγραμμα σε python και το εκτελεί. Σε αυτό το πρόγραμμα αναφερόμαστε συνήθως για συντομία με τη λέξη "η python".)

Codeskulptor

Εδώ μπορείτε να τρέξετε κώδικα python χωρίς να εγκαταστήσετε τίποτα στον υπολογιστή σας. Έχει μερικούς περιορισμούς αλλά για την αρχή του εξαμήνου είναι μάλλον υπεραρκετό. Π.χ. αν γράψετε 1+2 δεν τυπώνει τίποτα (όπως θα τύπωνε ο python interpreter που τρέχει στο linux από command line). Για να τυπώσετε το αποτέλεσμα πρέπει να χρησιμοποιήσετε την εντολή print όπως

print (1+2+3.2)**2

Δείτε π.χ. στην παρακάτω εικόνα:

Μπορείτε να δοκιμάσετε σε αυτή τη σελίδα όλα τα προγράμματα του σημερινού μαθήματος (τα παίρνετε από δω με copy και τα κάνετε paste στο αριστερό παράθυρο του codeskulptor).

python interpreter στο linux

Μπείτε στον eliot.math.uoc.gr (με το putty ή με όποιο άλλο πρόγραμμα θέλετε που μπορεί να σας συνδέσει με ssh με ένα υπολογιστή) και δώστε στο command line την εντολή python. Τώρα δίνετε πλέον εντολές στον python interpreter στο prompt >>>.

Δείτε την εικόνα παρακάτω:

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

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

python house.py

Το αρχείο αυτό το δημιουργούμε με ένα text editor (όπως π.χ. το nano που έχουμε ήδη δει). Στην παρακάτω εικόνα βλέπουμε πώς τρέχουμε ένα από τα προγράμματα που βρίσκονται παρακάτω και το οποίο είναι αποθηκευμένο στο αρχείο house.py.

Αργότερα στο μάθημα θα πρέπει πάντα να μπορείτε να τρέξετε ένα πρόγραμμα με αυτόν ακριβώς τον τρόπο (από τη γραμμή εντολών δηλ.). Όταν θα χρησιμοποιείτε το εργαστήριο τότε θα μπορείτε να χρησιμοποιείτε και ένα καλύτερα text editor από τον nano, π.χ. τον editor με το όνομα gedit, ο οποίος χρωματίζει και κατάλληλα το πρόγραμμά σας με τρόπο ώστε να σας βοηθάει να το γράψετε σωστά συντακτικά.

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

Εγκατάσταση της python στα Windows

Αν έχετε υπολογιστή που τρέχει κάποια έκδοση των Windows τότε έχετε διάφορες επιλογές για το ποια python θα τρέξετε. Μπορείτε να κατεβάσετε την python από την κεντρική σελίδα της python εδώ. και να την εγκαταστήσετε στον υπολογιστή σας. Έπειτα μπορείτε να τρέχετε το περιβάλλον idle που εγκαθίσταται μαζί με την python. Το περιβάλλον αυτό διευκολύνει τη συγγραφή και την εκτέλεση των προγραμμάτων σας. Μια άλλη επιλογή είναι ένα ολοκληρωμένο περιβάλλον όπως το Enthought Canopy (επιλέξτε την έκδοση 32bit αν δεν είστε σίγουροι αν ο υπολογιστής σας τρέχει σε 32 ή 64 bit -- το 32bito software τρέχει και σε 64bito επεξεργαστή αλλά όχι ανάποδα).

Μπορείτε να τρέχετε στον υπολογιστή σας τα προγράμματα που σας ανατίθενται αλλά πριν τα υποβάλετε για έλεγχο θα πρέπει να τα μεταφέρετε στο linux και να βεβαιωθείτε ότι τρέχουν στην python που είναι εγκατεστημένη εκεί. Ο λόγος είναι ότι τα προγράμματά σας θα ελέγχονται αυτόματα για το αν τρέχουν ή όχι σε περιβάλλον linux (εκεί όπου τα υποβάλλετε δηλ.).

Τα προγράμματα που γράψαμε σήμερα για τον υπολογισμό όγκου και εμβαδού του σπιτιού με παραμέτρους

Διαβάστε για τη χρήση των μεταβλητών στην python π.χ. εδώ.

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

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

Το σπίτι φαίνεται στην παρακάτω εικόνα και η σημασία των παραμέτρων φαίνεται στα σχόλια που υπάρχουν στις πρώτες γραμμές του προγράμματος που ακολουθεί. Τα σχόλια είναι το κείμενο που ακολουθεί το χαρακτήρα # και μπορεί να είναι τελείως ελεύθερο κείμενο, δεν υπόκειται δηλ. στους κανόνες της γλώσσα python. Ο σκοπός του κειμένου αυτού είναι να κάνει τη δομή του προγράμματος και τη σημασία των διαφόρων εντολών πιο ξεκάθαρη.

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

\[ V = 2 \cdot a \cdot c \cdot wt - dw \cdot dh \cdot wt + 2 ( (b-2\cdot wt)\cdot c\cdot wt - ww \cdot wh \cdot wt ) + (a-2\cdot wt)(b-2\cdot wt) \cdot rt \]

Για παράδειγμα ο πρώτος προσθετέος \(2 \cdot a \cdot c \cdot wt\) αντιπροσωπεύει τον όγκο του τοίχου της πρόσοψης μαζί με τον απέναντί του τοίχο πριν όμως αφαιρεθεί ο όγκος της πόρτας, που είναι ο 2ος όρος στην παραπάνω έκφραση για το \(V\), κλπ.

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

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

Έτσι στην πρώτη ανάθεση στη μμεταβλητή vol αναθέτουμε σε αυτή την ποσότητα \(2 \cdot a \cdot c \cdot wt\) που αντιπροσωπεύει τον όγκο των δύο τοίχων όπως εξηγούμε παραπάνω.

Στη δεύτερη εντολή

vol = vol - dw*dh*wt # αφαίρεση όγκου πόρτας

Αφαιρούμε από τη μεταβλητή vol την ποσότητα \(dw\cdot dh \cdot wt\) που είναι ο όγκος της πόρτας. Ο μηχανισμός με τον οποίο γίνεται αυτή η αφαίρεση είναι ότι πρώτα υπολογίζεται η έκφραση που βρίσκεται στα δεξιά του συμβόλου = της ανάθεσης, δηλ. η έκφραση

vol - dw*dh*wt

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

print vol

εκτυπώνεται η τιμή της μεταβλητής vol που είναι ο όγκος που υπολογίσαμε (αποτέλεσμα: 58.824 \(m^3\)).

In [8]:
# -*- coding: utf-8 -*- # η γραμμή αυτή μπαίνει πρώτη για να τυπώνονται σωστά τα ελληνικά

a = 10.0 # πλάτος
b = 9.0 # βάθος
c = 4. # ύψος
dw = 1.0 # πλάτος πόρτας
dh = 2.0 # ύψος πόρτας
ww = 1.10 # πλάτος παραθύρου
wh = .80 # ύψος παραθύρου
wt = 0.30 # πάχος τοίχου
rt = 0.20 # πάχος ταράτσας

vol = 2*a*c*wt  # όγκος μπρος, πίσω τοίχων, με την πόρτα

vol = vol - dw*dh*wt # αφαίρεση όγκου πόρτας

vol = vol + 2*((b-2*wt)*c*wt - ww*wh*wt) # πλαϊνοί τοίχοι

vol = vol + (a-2*wt)*(b-2*wt)*rt #ταράτσα

print vol
58.824

Στο δεύτερό μας πρόγραμμα που φαίνεται παρακάτω και το οποίο φτιάξαμε αντιγράφοντας και τροποποιώντας το πρώτο, υπολογίζουμε και το εμβαδό του σπιτιού που θέλει βάψιμο (π.χ. δε συμπεριλαμβάνομαι το εμβαδό της πάνω μεριάς της πλάκας της ταράτσας αλλά μόνο της κάτω πλευράς) και επιπλέον κάνουμε την τροποποίηση στο σπίτι ότι στην πρόσοψη θα έχουμε και ένα στρογγυλό παράθυρο με ακτίνα \(r\). Τώρα πρέπει να αφαιρέσουμε από τον όγκο τον όγκο του παραθύρου \(\pi r^2 \cdot wt\) και επίσης το εμβαδό του παραθύρου \(\pi r^2\) από το εμβαδό της έξω και της μέσα μεριάς του μπροστινού τοίχου. Για να υπολογιστούν αυτές οι ποσότητες ορίζουμε μια νέα μεταβλητή

pi = 3.14159

με την κατά προσέγγιση τιμή του \(\pi\) και τη χρησιμοποιούμε στους τύπους αντί του \(\pi\) (το οποίο δε μπορούμε να αναπαραστήσουμε ακριβώς στον υπολογιστή).

Ο τύπος που δίνει το εμβαδό που θα χρειαστεί να βαφεί είναι ο \[ A = 2(a\cdot c + (a-2\cdot wt)(c-rt)) - 2 dw\cdot dh - 2\pi r^2 + 2(b\cdot c + (b-2 wt)(c-rt)) - 4 ww\cdot wh + (a-2 wt)(b-2 wt) rt \] και αυτός ο τύπος υπολογίζεται (σταδιακά, όπως και πριν η μεταβλητή vol) στη μεταβλητή area.

Για την πρόσθεση μιας ποσότητας στη μεταβλητή vol (και ομοίως για τη μεταβλητή area) χρησιμοποιούμε εδώ αντί της μορφής

vol = vol + ...

τη συντομογραφία που υπάρχει στην python

vol += ...

κατά την οποία υπολογίζεται το δεξί μέλος και δεν ανατίθεται στη μεταβλητή που είναι αριστερά (vol στην προκειμένη περίπτωση) αλλά προστίθεται στην τιμή της μεταβλητής αυτής. Ομοίως λειτουργεί και ο τελεστής -= που επίσης χρησιμοποιείται στο δεύτερο αυτό πρόγραμμα.

Τέλος με την εντολή print vol, area τυπώνουμε και τον όγκο και το εμβαδό που υπολογίσαμε.

In [13]:
# -*- coding: utf-8 -*- # η γραμμή αυτή μπαίνει πρώτη για να τυπώνονται σωστά τα ελληνικά

a = 10.0 # πλάτος
b = 9.0 # βάθος
c = 4. # ύψος
dw = 1.0 #πλάτος πόρτας
dh = 2.0 #ύψος πόρτας
ww = 1.10 #πλάτος παραθύρου
wh = .80 #ύψος παραθύρου
wt = 0.30 #πάχος τοίχου
rt = 0.20 #πάχος ταράτσας
r = .6

pi = 3.14159

vol = 2*a*c*wt  # όγκος μπρος, πίσω τοίχων, με την πόρτα

vol -= pi*r*r*wt # αφαίρεση όγκου παραθύρου

vol -= dw*dh*wt # αφαίρεση όγκου πόρτας

vol += 2*((b-2*wt)*c*wt - ww*wh*wt) # πλαϊνοί τοίχοι

vol += (a-2*wt)*(b-2*wt)*rt #ταράτσα



area = 2*(a*c + (a-2*wt)*(c-rt))

area -= 2*dw*dh + 2*pi*r**2

area += 2*(b*c+(b-2*wt)*(c-rt)) - 4*ww*wh

area += (a-2*wt)*(b-2*wt)



print vol, area
58.48470828 356.4580552