To wiki αυτό έγινε για να προσφέρει υποστήριξη για την Python, μια εναλλακτική και ανοιχτή γλώσσα προγραμματισμού που πραγματικά μπορεί κανείς να μάθει να προγραμματίζει σε αυτήν σε 20 λεπτά! Για πιο σοβαρή ενασχόληση με την γλώσσα είναι καλύτερο κάποιος να διαβάσει το Python Tutorial - Guido van Rossum
Αρχικά να πούμε μερικά λόγια για την Python.
Καταρχήν το όνομα δεν προέρχεται από το γνωστό ερπετό της οικογένειας Pythonidae αλλά από κάτι πιο χαρούμενο και προσβάσιμο, τους Άγγλους κωμικούς Monty Python. H Python πρωτοεκδόθηκε από τον Ολλανδό προγραμματιστή Guido van Rossum το 1991 και αναπτύσσεται ως ανοιχτό λογισμικό (free software) και η διαχείρισή της γίνεται από τον μη κερδοσκοπικό οργανισμό Python Software Foundation. Ο κώδικας διανέμεται με την άδεια Python Software Foundation License η οποία είναι συμβατή με την GPL - General Public License.
Πάει αρκετός καιρός από τότε που ανανεώθηκε το συγκεκριμένο Wiki και παρόλο που δεν έχουμε (σαν forum) κάνει σημαντική βελτίωση στην Python, νομίζω ότι έχoυν γίνει καλύτερα κατανοητές κάποιες βασικες λειτουργίες της, με αποτέλεσμα ο κώδικας των προηγούμενων παραδειγμάτων να είναι παροχυμένος. Αυτό όμως δεν πάει να πει ότι είναι άχρηστος ή ότι δεν δουλεύει. Ίσα ίσα, ένα πρόβλημα που διαπιστώθηκε είναι οτι στα περισσότερα βιβλία χρησιμοποιείται πάντα ο πιο εκλεπτυσμένος τρόπος ώστε να γίνει κάτι, αφήνωντας τους αρχάριους κάπως χαμένους! Πάει όμως να πει ότι είναι σχετικά λάθος επειδή υπάρχουν καλύτερα εργαλεία στην Python για να αντιμετωπιστούν τα προβλήματα που παρουσιάστηκαν.
Επομένως,χωρίς να πειράξουμε τα προηγούμενα, θα προσπαθήσουμε να κάνουμε τον κώδικα πιο εκλεπτυσμένο και σύντομο.
Για να προγραμματίσει κάποιος σε Python θα πρέπει αρχικά να την έχει εγκατεστημένη στον υπολογιστή του.
Η εγκατάσταση είναι μια πάρα πολύ απλή διαδικασία, αρκεί κάποιος να επισκεφτεί την σελίδα της python, http://www.python.org/download/ και να κατεβάσει την έκδοση για το λειτουργικό σύστημα που έχει.
Για όποιον χρησιμοποιεί GNU/Linux η εγκατάσταση είναι ακόμα πιο εύκολη: Αρκεί να ανοίξει τον package manager που χρησιμοποιεί και να ψάξει (search) για την Python και έπειτα να την εγκαταστήσει. Επίσης σε πρόσφατες διανομές μπορεί η Python να είναι ήδη εγκατεστημένη στο σύστημά σας. Για να το διαπιστώσετε απλά ανοίξτε την κονσόλα σας και πληκτρολογήστε :
$ python
και πατήστε enter. Αν η γλώσσα είναι εγκατεστημένη θα πρέπει να δείτε κάτι τέτοιο:
Python 3.6.0 (default, Jan 16 2017, 12:12:55) [GCC 6.3.1 20170109] on linux Type "copyright", "credits" or "license()" for more information. >>>
Να σημειωθεί εδώ ότι η πιο πρόσφατη έκδοση της Python πλέον είναι η 3. Tο tutorial σήμερα είναι γραμμένο για 3 και αναφέρει τις διαφορές με την 2 όπου υπάρχουν. Επειδή υπάρχουν κάποιες βασικές διαφορές (π.χ. η raw_input αντί για την input της έκδοσης 3), αν σκοπεύετε να δουλέψετε στην 2 καλό είναι να τις διαβάσετε και να τροποποιήσετε τα προγράμματα αναλόγως.
Όταν λοιπόν είστε έτοιμοι να γράψετε το πρόγραμμά σας θα χρειαστείτε επεξεργαστή κειμένου. Αυτός μπορεί να είναι από τα απλά Notepad και gedit ή να είναι πιο “κατάλληλος” για Python, όπως είναι o atom και ο IDLE oι οποίοι αναγνωρίζουν διάφορες οντότητες και τις χρωματίζουν διαφορετικά κάνοντας τη ζωή σας ευκολότερη! Καλό θα ήταν να δουλεύετε σε IDLE ο οποίος έχει σχεδιαστεί ειδικά για την Python. (o IDLE βρίσκεται μέσα στο “πακέτο” της python που κατεβάζετε για τα Ms Windows. Στο Linux απλά ψάξτε τον και εγκαταστήστε τον μέσω του package manager σας.) (Για τον atom μην ξεχάσετε να εγκαταστήσετε το πακέτο script ώστε να εκτελείτε τα προγράμματά σας με απλό τρόπο)
Επειδή το να γράφεις κώδικα σε απλό κειμενογράφο δεν είναι πρακτικό, συνίσταται να κατεβάσετε τον IDLE εξαρχής για να υπάρχει μια κοινή βάση επικοινωνίας.
Παραδοσιακά το πρώτο πρόγραμμα που γράφει κανείς σε μια νέα γλώσσα προγραμματισμού, είναι αυτό που επιστρέφει στην οθόνη το: Γεια σου ντουνιά! (hello world!)
Τα πράγματα στην Python είναι τόσο απλά:
print('Geia sou ntounia!')
Όταν λοιπόν γράψουμε το παραπάνω στον IDLE και πατήσουμε enter στην οθόνη μας θα εμφανιστεί το παρακάτω:
Geia sou ntounia!
Από εδώ και πέρα ο κώδικας θα έχει τη μορφή
>>> print('Geia sou ntounia!') Geia sou ntounia!
τα 3 > αποτελεί σημάδι ότι αυτή τη σειρά την εισάγουμε εμείς ενώ αυτή που δεν έχει μας την επιστρέφει ο υπολογιστής
Σε αυτό το σημείο να αναφέρουμε επίσης ότι οτιδήποτε και να γράψουμε πίσω από το σύμβολο # ο υπολογιστής το αγνοεί. Ουσιαστικά το # χρησιμοποιείται για να εισάγουμε σχόλια μέσα στον κώδικα μας για να διευκολύνουν κάποιον που τον διαβάζει.
>>> print('Geia sou ntounia!') #ayta den fainontai giati einai sxolia Geia sou ntounia!
παρατηρούμε ότι το print είναι χρωματισμένο πορτοκαλί που υποδηλώνει ότι είναι μια εντολή ενώ το 'Geia sou ntounia!' είναι πράσινο που υποδηλώνει ότι είναι ένα string. String ονομάζεται ότι βρίσκεται ανάμεσα από δυο ' και στην οθόνη εμφανίζεται αυτούσιο!
Αργά ή γρήγορα (μάλλον γρήγορα) θα φτάσετε στο σημείο όπου θα πρέπει να εκτελέσετε μαθηματικές πράξεις! Οι πράξεις στην Python είναι σχετικά απλές:
>>> 2+3 5 >>> 2-3 -1 >>> 2*3 6
Η μήπως όχι;
>>> 2/3 0
Όπα! Τοπογράφος είμαι ρε παιδιά, ούτε ένα δεκαδικό ψηφίο? Αν το παραπάνω είναι ακόμη ένα σουρεαλιστικό αστείο προς τιμή των Monty Python,ε τότε είναι πολύ κακόγουστο! Μην ανησυχείτε συνάδελφοι δεν πρόκειται για αστείο των Monty Python (άλλωστε δεν έχουν κακόγουστα) αλλά για ιδιότητες των αριθμών. Όταν γράφουμε στην Python έναν αριθμό “σκέτο” (πχ. 4) τότε η γλώσσα τον αντιλαμβάνεται ως int, δηλαδή integer, δηλαδή ακέραιο. Για αυτό το λόγο στη διαίρεση μας επιστρέφει τον αμέσως χαμηλότερο ακέραιο που σε αυτήν την περίπτωση είναι το 0.
Για να δοκιμάσουμε κάπως διαφορετικά:
>>> 3.0/2 1.5 >>> 3/2.0 1.5 >>> 3.0/2.0 1.5
Αχά! Ώστε έτσι δουλεύει. Ναι, δουλεύει γιατί πλέον η γλώσσα αντιλαμβάνεται τον αριθμό ως float, δηλαδή ως floating point number, δηλαδή ως πραγματικό.
Ευτυχώς στην έκδοση 3 δεν υπάρχει αυτό το θέμα. Η διαίρεση δίνει το σωστό αποτέλεσμα όπως κι αν είναι γραμμένοι οι αριθμοί:
>>> 2/3 0.6666666666666666
Μπορούμε επίσης να βάλουμε μεταβλητές
>>> x=5 >>> y=12 >>> x*y 60 >>> x/y 0
βλέπουμε πως και εδώ έχουμε πρόβλημα με τους int αριθμούς. Για να παίρναμε το αναμενόμενο αποτέλεσμα θα έπρεπε ή να δίναμε τους αριθμούς ως floats (δλδ 5.0 και 12.0 αντίστοιχα) ή να ορίζαμε στη γλώσσα ότι είναι float ενώ τους εισάγαμε ως int. Αυτό γίνεται έτσι:
>>> x=float(x) >>> y=float(y) >>> x/y 0.41666666666666669
Όπως σκεφτήκατε θα δούλευε και αν μετατρέπαμε μόνο τον έναν από τους δυο σε float. Καλό είναι όμως σε ένα πρόγραμμα να τους μετατρέπουμε όλους γιατί πάλι θα είχαμε πρόβλημα αν χρειαζόταν να γίνει η διαίρεση y/100. Επίσης η μετατροπή των μεταβλητών σε float μας εξοικονομεί χρόνο (δεν χρειάζεται κάθε φορά να γράφουμε 5.0) αλλά και προσφέρει λειτουργικότητα στον χρήστη ο οποίος δεν ξέρει πως λειτουργεί ο μηχανισμός της Python.
Όπως είπαμε και πριν στην Python3 δεν έχουμε θέμα:
>>> x=5 >>> y=12 >>> x*y 60 >>> x/y 0.4166666666666669
σημείωση: Θα αναρωτιέστε “τι τα θέλω τόσα δεκαδικά”. πράγματι, πιο κάτω θα αναφερθεί ένας τρόπους που κρατάμε όσα θέλουμε.
Και μόλις μάθατε πως καλούμε το module math, το οποίο μας βοηθά να κάνουμε πιο πολύπλοκες πράξεις και υπολογισμούς, όπως να βρούμε τετραγωνικές ρίζες, ημίτονα, εφαπτόμενες κλπ! Το μόνο, λοιπόν, πράγμα που έχετε να κάνετε για να το καλέσετε είναι όταν το χρειαστείτε να γράψετε :
import math
Τότε ο IDLE αλλάζει γραμμή και έχει καλέσει το math. Εκτός του ότι τώρα μπορούμε να κάνουμε πιο πολύπλοκες και τοπογραφικές πράξεις, είμαστε χαρούμενοι και για τον λόγο ότι, οι αριθμοί που επιστρέφουν από πράξεις που σχετίζονται με το math είναι αυτομάτως float.
Παρακάτω ακολουθεί μια λίστα επιλεγμένων συναρτήσεων του math. Για να δείτε όλη τη λίστα επισκεφτείτε το : Python math module
math.ceil(x) Επιστρέφει τον x σαν float, στρογγυλοποιημένο κατά πάνω (στον κοντινότερο ακέραιο).
math.floor(x) Επιστρέφει τον x σαν float, στρογγυλοποιημένο κατά κάτω (στον κοντινότερο ακέραιο).
math.fabs(x) Επιστρέφει την απόλυτη τιμή του x.
math.hypot(x, y) Επιστρέφει την υποτείνουσα των κάθετων πλευρών x και y. (καλό ε;)
math.exp(x) Επιστρέφει το e^x.
math.log(x) Επιστρέφει τον λογάριθμο του x με βάση το e.
math.log10(x) Επιστρέφει τον λογάριθμο του x με βάση το 10.
math.pow(x, y) Επιστρέφει το x^y.
math.sqrt(x) Επιστρέφει την τετραγωνική ρίζα του x.
math.sin(x) Ημίτονο x (σε rad).
math.cos(x) Συνημίτονο x (σε rad).
math.tan(x) Εφαπτομένη x (σε rad).
Για τα αντίστοιχα τόξα απλά προσθέτουμε ένα a μπροστά από την συνάρτηση (πχ. arctan = math.atan(x))
Μετατροπή Γωνιών:
math.degrees(x) Μετατρέπει την γωνία x από rad σε μοίρες.
math.radians(x) Μετατρέπει την γωνία x από μοίρες σε rad.
το math συμπεριλαμβάνει επίσης και τις μαθηματικές σταθερές των
π (math.pi) και
e (math.e).
Λοιπόν νομίζω ότι σε αυτό το σημείο έχουν περάσει γύρω στα 17 λεπτά και όπως ειπώθηκε παραπάνω θα προγραμματίσουμε σε 20! Τα προηγούμενα ήταν λίγο βαρετά αλλά απαραίτητα για να μπορέσουμε να προχωρήσουμε σε πιο “ωραία” πράγματα.
Το πρόγραμμα που θα φτιάξουμε δεν είναι άλλο από το 1ο θεμελιώδες πρόβλημα της πολυαγαπημένης μας Γεωδαισίας (γνωρίζουμε τις συντεταγμένες του Α, την απόσταση ΑΒ και τη γωνία διεύθυνσης αΑΒ και ψάχνουμε τις συντεταγμένες του Β).
Σε αυτό το σημείο θα ήθελα να σας συστήσω μια πολύ καλή μας φίλη, την raw_input. Η raw_input είναι φοβερή γιατί μας βοηθάει να εισάγουμε μεταβλητές στον υπολογιστή πολύ πιο θεαματικά από το χ=5, για παράδειγμα! Ας το δούμε στην πράξη!
σημείωση: Επειδή το πρόγραμμα μας απαιτεί αρκετές σειρές αυτή τη φορά, στον IDLE πατήστε file→new θα σας ανοίξει ενα καινούριο παράθυρο οπού εκεί θα γράψετε τον κώδικα και όταν θέλετε να τον “τρέξετε” θα πηγαίνετε στο Run→Run Module, ή απλά θα πατάτε F5. Κατόπιν θα σας ζητάει να το σώσετε πρώτα και έπειτα θα το “τρέχει”.
Φωνή από το πουθενά :“Μάστορα πέρασαν τα 3 λεπτά!”
import math xa=input('Dose mou to Xa:') #eisagoume to Xa xa=float(xa) #metatrepoume to int se float ya=input('Dose mou to Ya:') #eisagoume to Ya ya=float(ya) sab=input('Dose mou tin apostasi AB:') #eisagoume to Sab sab=float(sab) aab=input('Dose mou tin gonia diey8insis ab -se grad-:') #eisagoume to aAB se grad aab=float(aab) aabr=math.pi*aab/200 #metatropi tou aAB apo grad se rad xb= xa+sab*math.sin(aabr) #ypologismos Xb yb= ya+sab*math.cos(aabr) #ypologismos Xb print('To simeio B exei syntetagmenes Xb:', xb, ', Yb:' , yb) #epistrofi stin o8oni twn timwn Xb, Yb
Και αυτό ήταν! Παρατηρείστε ότι αν το διαβάσετε είναι πολύ απλό να καταλάβετε τι κάνει περίπου ακόμη και αν λείπουν τα σχόλια!
Τώρα ας το κάνουμε λίγο πιο τακτοποιημένο, εισάγοντας δυο νέες φίλες, την .split() και την %.3f. Για να δούμε:
import math xa, ya=input('Dose mou to Xa kai Ya -xwrismena me komma-:').split(',') #eisagoume to Xa kai Ya xa=float(xa) #metatrepoume to int se float ya=float(ya) sab, aab=input('Dose mou tin apostasi AB kai tin gwnia diey8insis aAb (se grad) -xwrismenes me komma -:').split(',') sab=float(sab) aab=float(aab) aabr=math.pi*aab/200 #metatropi tou aAB apo grad se rad xb= xa+sab*math.sin(aabr) #ypologismos Xb yb= ya+sab*math.cos(aabr) #ypologismos Xb print('To simeio B exei syntetagmenes Xb: %.3f, Yb: %.3f' %(xb, yb)) #epistrofi stin o8oni twn timwn Xb, Yb
Τι έχουμε κάνει εδω; Ουσιαστικά εισάγουμε δυο μεταβλητές με μια input (raw_input), “λέγοντας” απλά στο πρόγραμμα ότι όταν “δει” κόμμα -.split(',')- να “καταλάβει” ότι μετά από εκεί είναι η δεύτερη μεταβλητή. Επίσης με την %.3f περιορίσαμε τα δεκαδικά σε 3 (με %.4f τα περιορίζουμε σε 4 και πάει λέγοντας).
Με το σύμβολο % ο υπολογιστής “καταλαβαίνει” ότι εδώ είναι θέση μεταβλητής που του την ορίζουμε στο τέλος, έξω από το string. (string είπαμε είναι ότι βρίσκετε ανάμεσα σε δυο ') Στο συγκεκριμένο πρόγραμμα έχουμε δυο % σε μια γραμμή αλλά ο υπολογιστής δεν μπερδεύεται επειδή στο τέλος του λέμε με ποια σειρά να βάλει τις μεταβλητές %(xb,yb)
Δυστυχώς μέχρι τώρα η input στην Python2 δεν έχει αποκτήσει την split της οπότε πρέπει να χρησιμοποιήσουμε την raw_input με παρόμοιο τρόπο:
import math xa, ya=raw_input('Dose mou to Xa kai Ya -xwrismena me komma-:').split(',') #eisagoume to Xa kai Ya xa=float(xa) #metatrepoume to int se float ya=float(ya) sab, aab=raw_input('Dose mou tin apostasi AB kai tin gwnia diey8insis aAb (se grad) -xwrismenes me komma -:').split(',') sab=float(sab) aab=float(aab) aabr=math.pi*aab/200 #metatropi tou aAB apo grad se rad xb= xa+sab*math.sin(aabr) #ypologismos Xb yb= ya+sab*math.cos(aabr) #ypologismos Xb print('To simeio B exei syntetagmenes Xb: %.3f, Yb: %.3f' %(xb, yb)) #epistrofi stin o8oni twn timwn Xb, Yb
Ας προχωρήσουμε λίγο βαθύτερα στα νερά του προγραμματισμού! Στο κεφάλαιο αυτό παρουσιάζεται το If. Ουσιαστικά πρόκειται για μια δήλωση συνθήκης στο πρόγραμμα μας!
Ένα παράδειγμα ψευτο-κώδικα θα μπορούσε να είναι αυτό:
Τι ώρα είναι? Αν η ώρα είναι ανάμεσα στις 00:00 και 12:00 : τύπωσε 'Καλημέρα' Αλλιώς : τύπωσε 'καλησπέρα'
Απλό ε? Για να το δούμε και σε πραγματικό κώδικα:
password=input('Speak friend and enter:') if password.endswith('friend'): print('Welcome to the Dwarven Kingdom of Khazad-Dum') else: print('You are not welcome to enter our Halls')
Παρατηρείστε ότι το print είναι πιο μέσα από το if. Αυτό σημαίνει ότι θα εκτελεστεί μόνο όταν ο χρήστης εισάγει το σωστό σύνθημα. Αλλιώς είναι σαν να μην υπάρχει.
Φυσικά μπορούμε να βάλουμε όσα if θέλουμε, μέχρι να ικανοποιηθούν οι περιπτώσεις που θέλουμε να καλύψουμε.
(Στην Python2 πρέπει να κάνουμε raw_input με παρόμοιο τρόπο:
password=raw_input('Speak friend and enter:')
και ίδιο το υπόλοιπο παράδειγμα)
Το if μπορεί να είναι πολύ βολικό αλλά έχει ένα βασικό μειονέκτημα. Μόλις ολοκληρωθεί η διαδικασία το πρόγραμμα τερματίζεται. Φανταστείτε πόσο άβολα θα ήταν τα πράγματα αν εισάγατε των κωδικό του e-mail σας λάθος και το πρόγραμμα δεν σας έδινε δεύτερη ευκαιρία!
Το μεγάλο αυτό κενό έρχεται να καλύψει η while, που ουσιαστικά επαναλαμβάνει το κομμάτι του κώδικα που θέλουμε μέχρι να βρούμε το σωστό σύνθημα.
Για να δούμε πως θα δούλευε το παραπάνω πρόγραμμα με την while:
while 1: password=input('Speak friend and enter:') if password.endswith('friend'): print('Welcome to the Dwarven Kingdom of Khazad-Dum') break else: print('You are not welcome to enter our Halls')
Τα καινούρια στοιχεία εδώ είναι το while και το break.
Το while ορίζει από ποιο σημείο και έπειτα αρχίζουν οι επαναλήψεις. Προσέξτε ότι όλες οι υπόλοιπες γραμμές είναι “πιο μέσα” από το while Αυτό σημαίνει ότι αυτές οι γραμμές είναι “μέσα” στη συνθήκη while.
To break ουσιαστικά “σπάει” το while. Όταν δηλαδή ο χρήστης εισάγει το σωστό σύνθημα δεν χρειάζεται το πρόγραμμα να ξαναρωτήσει για το σύνθημα. Οπότε με το break βγαίνουμε από το while
Και αν θέλουμε να βάλουμε περιορισμό στο while? Αν στο παράδειγμα μας θέλαμε να δίναμε 3 ευκαιρίες στον χρήστη να βρεί τον κωδικό; Πανεύκολο!
x=1 while x <= 3: password=input('Speak friend and enter:') if password.endswith('friend'): print('Welcome to the Dwarven Kingdom of Khazad-Dum') break else: print('The secret word is wrong. Please try again') x=x+1 else: print 'You failed three times. The gates are closed forever.'
( Όσοι επιμένετε σε Python2 μην ξεχάσετε την χρήση της raw_input αντί της input. )
Άραγε μετά από αυτά, μπορείτε να γράψετε ενα πρόγραμμα που να επιλύει το 2ο Θεμελιώδες Πρόβλημα;
Σίγουρα μέχρι τώρα στα πειράματα σας με τη γλώσσα θα έχετε συναντήσει αυτό το μήνυμα:
Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 5/0 ZeroDivisionError: integer division or modulo by zero
Όπου και τερματίζεται το πρόραγαμμα. Τις περισσότερες φορές είναι συντακτικό λάθος (syntax error) που σημαίνει ότι έχετε γράψει κάτι λάθος στον κώδικα σας.
Αν δεν είναι όμως; Αν διαβάσετε πιο προσεκτικά το παραπάνω σφάλμα θα δείτε ότι στην τελευταία του γραμμή εμφανίζει το λόγο του σφάλματος : ZeroDivisionError , δηλαδη διαιρέσαμε με το 0.
Υπάρχουν διάφοροι τύποι σφαλμάτων. Για παράδειγμα αν στο πρόγραμμα επίλυσης του 1ου θεμελιώδους Προβλήματος, στην δεύτερη περίπτωση που είχαμε εισαγωγή δυο μεταβλητών με μια input(raw_input) δεν χωρίζαμε τις μεταβλητές με κόμμα θα μας επιστρεφόταν κάτι τέτοιο:
Dose mou to Xa kai Ya -xwrismena me komma kai keno-:32 132 Traceback (most recent call last): File "/home/sairinlote/Desktop/Mathimata/Python Programming/wikigeodesy1ab.py", line 2, in <module> xa, xb=input('Dose mou to Xa kai Ya -xwrismena me komma kai keno-:').split(',') #eisagoume to Xa kai Ya ValueError: need more than 1 value to unpack
Αυτό που περιμέναμε! ValueError: Μας λέει ότι χρειάζεται ακόμα μια μεταβλητή.
Μπορούσαμε να το είχαμε προβλέψει ότι κάποιος δεν θα έβαζε κόμμα και να είχαμε προετοιμάσει το πρόγραμμα να αντιδράσει ανάλογα! Για συντομία, παραθέτω μόνο την γραμμή πάνω στην οποία θα δουλέψουμε:
try:
xa, ya=input('Dose mou to Xa kai Ya -xwrismena me komma kai keno-:').split(',') #eisagoume to Xa kai Ya except ValueError: print('Xwrise se parakalw tis metavlites me komma') raise
Τώρα σε περίπτωση που εισάγουμε μια μεταβλητή ή εισάγουμε δυο αλλα δεν τις χωρίσουμε με κόμμα το πρόγραμμα θα βρεθεί μπροστά σε ένα ValueError και επείδη το είχαμε προβλέψει θα τυπώσει ενα πιο κατανοητό μήνυμα. Έπειτα θα τερματιστεί κάνοντας raise το error statement.
Τι θα γινόταν αν δεν είχαμε βάλει το raise? Δοκιμάστε το!
Προφανώς αν δεν είχαμε βάλει το raise το πρόγραμμα θα συνέχιζε κανονικά και θα μας κυνηγούσε όλος ο τομέας Γεωδαισίας. Άραγε μπορούμε να συνδυάσουμε μια επαναληπτική διαδικασία (while) με το except ώστε το πρόγραμμα να μην προχωράει παρακάτω μέχρι να του δηλώσουμε σωστά τις μεταβλητές;
Φυσικά!
import math while 1: try: xa, ya=input('Dose mou to Xa kai Ya -xwrismena me komma kai keno-:').split(',') #eisagoume to Xa kai Ya except ValueError: print('Xwrise se parakalw tis metavlites me komma') else: break
Αρχίζοντας πρέπει να ξέρετε 3 βασικά πράγματα για την Python και καλο είναι να μην τα ξεχάσετε ποτέ!
0) οι λίστες (lists) είναι ένα απο τα πιο ισχυρά εργαλεία της python 1) βολεύει να γράφουμε χρησιμοποιώντας συναρτήσεις (functions) 2) τα πάντα στην python είναι αντικείμενα (objects)
Η λίστα είναι μια από τις τρεις δομές δεδομένων (data structures) της Python μαζί με τα dictionaries και τα tuples. Πιο σημαντικό είναι ότι η λίστα είναι object (αντικείμενο) και ως object έχει ιδιότητες! Τα στοιχεία της λίστας βρίσκονται μέσα σε [] και είναι χωρισμένα με κόμμα. Στοιχεία μιας λίστας μπορεί να είναι αριθμοί, γράμματα, άλλες λίστες, tuples, dictionaries ακόμα και μεταβλητές (αν έχουν οριστεί προηγουμένως)!
Να μια λίστα:
>>>p=[1,2,3,'a',[5,4,3]] #οριζώ την λίστα με ονομά p >>> p [1, 2, 3, 'a', [5, 4, 3]]
>>> p[0] # επιστρέφει το 1ο στοιχείο της λίστας 1
>>> p[2] # επιστρέφει το 3ο στοιχειο της λίστας (προσοχή στην αρίθμηση λέμε) 3
>>> p[-1] [5, 4, 3] # επιστρέφει το τελευταίο στοιχείο της λίστας!
>>> c=3 # γίνεται και αυτό! >>> a[c] 8
>>> p[10] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
Όπως καταλάβατε, γράφοντας την λίστα και μέσα σε αγκύλες μια θέση, μας επιστρέφει το συγκεκριμένο στοιχείο της λίστας. Όταν η θέση είναι θετική η Python αρχίζει να μετράει από την αρχή (ξεκινώντας απο το 0!!) και όταν είναι αρνητικό από το τέλος! Σε περίπτωση που ζητήσουμε θέση η οποια δεν υπάρχει μας επιστρέφει IndexError.
Ας ξαναφτιάξουμε μια πιο ορθόδοξη λίστα, σαν αυτές που θα χρησιμοποιείται συνήθως, με αριθμούς.
>>> a=[1,6,3,8,3,8,4,9] >>> a [1, 6, 3, 8, 3, 8, 4, 9]
Τι άλλο ενδιαφέρον μπορούμε να κάνουμε με τις λίστες; Μπορούμε να ζητήσουμε να μας επιστραφεί συγκεκριμένο μέρος της λίστας, δηλαδή:
>>> a[:3] # τα πρώτα 3 στοιχεία [1, 6, 3]
>>> a[:-2] # όλα τα στοιχεία εκτός των 2 τελευταίων [1, 6, 3, 8, 3, 8]
>>> a[-2:] # τα δυο τελευταία [4, 9]
>>> a[2:4] # από τη θέση 2 έως την θέση 4. το συγκεκριμένο διαστήμα δεν περιλαμβάνει την θέση 4. Φανταστείτε το ως [2,4) [3, 8]
>>> a[:] [1, 6, 3, 8, 3, 8, 4, 9] # όλα τα στοιχεία
>>> a[:5:2] # τα στοιχεία μέχρι την θέση 5 με βήμα 2 (ανα 2) [1, 3, 3]
>>> a[3::3] # όλα τα στοιχεία από την θέση 3 ανά 3 [8, 4]
List Methods
Μεθόδοι είναι διάφορες “ιδιότητες” που έχουν οι λίστες για να μας κάνουν την ζωή μας ευκολότερη. Σαν πειραματόζωο έχουμε και πάλι την αγαπημένη μας λίστα a
>>> a [1, 6, 3, 8, 3, 8, 4, 9]
>>>a.append(5) # προσθέτει το 5 ως τελευταίο στοιχείο της λίστας >>>a [1, 6, 3, 8, 3, 8, 4, 9, 5]
>>>b=[3,2,6] >>>a.extend(b) # προσθέτει τα στοιχεία της λίστας b στο τέλος της λίστας a. (σαν την append αλλα για λίστες) >>> a [1, 6, 3, 8, 3, 8, 4, 9, 5, 3, 2, 6]
>>>a.insert(2,10) #εισάγει στη θέση 2 τον αριθμό 10 >>>a [1, 6, 10, 3, 8, 3, 8, 4, 9, 5, 3, 2, 6]
>>>a.remove(8) # διαγράφει το πρώτο στοιχείο της λίστας που έχει τιμή 8 (όχι όλα!) >>>a [1, 6, 3, 3, 8, 4, 9, 5, 3, 2, 6]
>>>a.pop() # διαγράφει και επιστρέφει το τελευταίο στοιχείο της λίστας 6
>>>a.pop(3) # διαγράφει και επιστρέφει το στοιχείο της θέσης 3 (δηλαδή το 4ο!!!) μιας λίστας 3
>>>a.index(5) # επιστρέφει την θέση στην οποία βρίσκεται το πρώτο 5αρι της λίστας 8
>>>a.count(3) # επιστρέφει πόσες φορές υπάρχει το στοιχείο 3 στην λίστα 2
>>>a.sort() # ταξινομεί την λίστα ανά αύξουσα ή αλφαβητική σειρά >>>a [1, 2, 3, 3, 4, 5, 6, 8, 8, 9, 10]
>>>a.reverse() #το αντίθετο από την sort() >>>a [10, 9, 8, 8, 6, 5, 4, 3, 3, 2, 1]
Η ιδέα των συναρτήσεων είναι ιδιαίτερα απλή και εύχρηστη. Μια συνάρτηση είναι ενα block, το οποίο όποτε και όπου το καλείς κάνει πάντα την ίδια δουλειά. Για παράδειγμα, γράφουμε ένα πρόγραμμα, κτα την διάρκεια του οποίου πρέπει να υπολογίζουμε σταδιακά γωνίες διεύθυνσης, αποστάσεις ή συντεταγμένες η προφανής λύση θα ήταν να γαψουμε μια φορά τον κώδικα και όποτε χρειάζεται να υπολογιστεί κάτι απο αυτά να τον κάνουμε copy/paste και να γίνεται η δουλειά μας. Παρόλα αυτά, με τις συναρτήσεις αρκεί να γράψουμε τον κώδικα μια φορα και όποτε τον χρειαζόμαστε να χρησιμοποιούμε την συνάρτηση:
Γράφω εδω έναν ψευδοκώδικα για να δείτε τι εννοώ
#Υπολογισμός Γωνίας Διεύθυνσης Δώσε συντεταγμένες σημείων Υπολογισμός ΔX/ΔΥ Διερεύνηση Τελική Γωνία
Αυτό θα πρέπει να το κάνετε κάθε φορά που θέλετε να υπολογίσετε μια γωνία διεύθυνσης. Αν όμως είχατε κάνει μια συνάρτηση θα σασ λυνόταν τα χέρια:
def ΥπολογισμοςΓωνίαςΔιεύθυνσης(x1,y1,x2,y2): Υπολογισμός ΔΧ/ΔΥ Διερεύνηση Τελική Γωνία
Έτσι, όποτε θέλετε να υπολογίσετε μια ακόμη γωνία διεύθυνσης, αρκεί να γράφετε ΥπολογισμοςΓωνίαςΔιεύθυνσης(x1,y1,x2,y2) και η Python πλέον “θυμάται/ξέρει” τι να κάνει.
Ορισμός της Συνάρτησης
Όπως είδαμε παραπάνω τα βασικά μέρη για να οριστεί μια συνάρτηση είναι το όνομα της και η λειτουργία της. Τίποτα άλλο δεν είναι υποχρεωτικό. Να η πιο απλή συνάρτηση. Λέγεται simple (to def -define- μπροστά είναι υποχρεωτικό κατα τον ορισμό της) και όταν εκτελέιται..δεν κάνει τίποτα!
def simple(): pass
Οι πραγματικές συναρτήσεις είναι λίγο πιο πολύπλοκες από αυτήν.
def freefall(t, g=9.81): "Ypologizei to ypsos ptwsis enos antikeimenou se eley8eri ptwsi, dedomenou tou xronou pou ekane gia na pesei" S=0.5*g*pow(t,2) print(S)
Ας αναλύσουμε την λειτουργία της συνάρτησης:
Στην γραμμή 1 ορίζεται η συνάρτηση freefall(), η οποία παίρνει ως μεταβλητές το t (χρόνος) και το g (επιταχυνση της βαρύτητας). Επειδή στα απλά προβλήματα το g έχει συνήθως την τιμή 9,81 μπορείτε να το αγνοήσετε και να δηλώσετε μόνο τον χρόνο και η Python θα δωσει την τιμή 9,81. Αν όμως θέλετε να κάνετε ένα πείραμα στο φεγγάρι, μπορειτε να ορίσετε δικια σας τιμή.
Η 2η γραμμή ονομάζεται docstring και περιγράφει με λίγα λόγια την λειτουργία της συνάρτησης. Η χρήση της είναι προεραιτική, αλλά συνίσταται να την χρησιμοποιείτε πάντα, ώστε όταν κάποιος τρίτος διαβάζει τον κωδικά σας, να καταλαβαίνει από την αρχή τι περίπου κάνει. Το docstring πρέπει να εσωκλείεται σε “ ” ή αν θέλουμε να γράψουμε κάτι πιο μεγάλο και να έχουμε πολλαπλές σειρές χρησιμοποιούμε το “”“ ”“”.
Η 3η γραμμή, είναι ένας απλός υπολογισμός. Το pow(t,2) σημαίνει t στο τετράγωνο.
Μόλις εκτλέσετε το πρόγραμμα, δεν θα συμβεί τίποτα. Για να το χρισιμοποιήσετε πρέπει να γράψετε την συνάρτηση και να δώσετε μια ή δυο μεταβλητές, πχ
>>> freefall(4) 78.480000000000004
Το οποίο επιστρέφει το ύψος στο οποίο βρισκόταν ένα αντικείμενο, αν έκανε 4 secs να φτάσει το έδαφος (με g=9,81), και
>>> freefall(4,7) 56.0
Το οποίο σου επιστρέφει το ύψος στο οποίο βρισκόταν ένα αντικείμενο, αν έκανε 4 secs να φτάσει το έδαφος σε κάποιο πλανήτη με g=7 (στη Μεση Γή?)
Θυμάστε το docstring? Μπορείτε να το δείτε ακόμα και στο runtime, γράφοντας:
>>> print(freefall.__doc__) Ypologizei to ypsos ptwsis enos antikeimenou se eley8eri ptwsi,dedomenou tou xronou pou ekane gia na pesei
Αυτό για το οποίο είναι φημισμένη η Python, είναι η πληθώρα των βιβλιοθηκών της. Πέρα απ'τις περιλαμβανόμενες στην διανομή της βιβλιοθήκες, όπως η math που είδαμε νωρίτερα, υπάρχουν και πολλές εξωτερικές. Εξωτερικές με την έννοια ότι για να τις χρησιμοποιήσουμε, θα πρέπει να τις εγκαταστήσουμε (βλ. παράλληλη εγγραφή geo-processing ). Απ' τις πιο διαδεδομένες, ιδιαίτερα σε εμάς τους πολυτεχνίτες, είναι οι:
Matplotlib βιβλιοθήκη για γραφικές παραστάσεις πινάκων δύο διαστάσεων κ.α.
SciPy ανοιχτό λογισμικό για τα μαθηματικά, τις επιστήμες και την μηχανική.
Tkinter άρθρωμα (module) για την εργαλειοθήκη (toolkit) διεπαφής του γραφικού περιβάλλοντος (GUI) Tk.
pyFLTK προσαρμογέας (wrapper) για την εργαλειοθήκη (toolkit) διεπαφής του γραφικού περιβάλλοντος (GUI) FLTk.
wxPython η έκδοση σε Python της εργαλειοθήκης (toolkit) διεπαφής του γραφικού περιβάλλοντος (GUI) της βιβλιοθήκης C++ wxWidgets.
Python Imaging Library πρόσθετες δυνατότητες ψηφιακής επεξεργασίας εικόνας στην φαρέτρα εντολών της Python.
OpenCV μια βιβλιοθήκη για επεξεργασία εικόνας σε πραγματικό χρόνο.
και πολλές πολλές άλλες
Επίσης, ηGeospatial Python είναι μια συζήτηση (blog) με πληθώρα πληροφοριών σχετικά με τα εργαλεία της Python στον τομέα της γεωπληροφορικής.
Με όλα όσα αναφέρθηκαν παραπάνω, έχετε τη δυνατότητα να κάνετε οποιοδήποτε πρόγραμμα υπολογισμών της Σχολής μας και μάλιστα να είναι και αρκετά σταθερό και φιλικό προς τον χρήστη.
Επίσης να σημειωθεί ότι αυτό το wiki είναι ελεύθερο όπως και η Python. Μπορεί ο καθένας να έρθει να συμπληρώσει πράγματα, να διαγράψει ή να τροποποιήσει. Ο προσανατολισμός του είναι ερασιτεχνικός και κομμένος και ραμμένος στις απαιτήσεις τις σχολής μας. Στόχος του είναι να αποτελεί ένα πρακτικό εργαλείο και όχι να σας μάθει να προγραμματίζετε σαν επαγγελματίες.
Επιπρόσθετα θα σας ενθαρρύναμε ότι πρόγραμμα γράφετε να είναι ανοιχτό και ελεύθερο προς όλους. Να μπορεί δηλαδή ο καθένας να διαβάσει τον κώδικα του και να τον τροποποιήσει ανάλογα με τις ανάγκες του.
Μεταφράζοντας τα 4 στοιχεία τα οποία πρέπει να έχει ένα πρόγραμμα για να θεωρείται ελεύθερο (όλη την φιλοσοφία μπορείτε να την βρείτε εδώ : http://www.gnu.org/philosophy/free-sw.html) :
⇒ Πρέπει να παρέχει την ελευθερία σε τρίτους να το εκτελούν για οποιοδήποτε λόγο.
⇒ Πρέπει να παρέχει την ελευθερία σε τρίτους να μελετούν πως δουλεύει το πρόγραμμα και να το προσαρμόζουν στις δικές τους ανάγκες. Η ελεύθερη πρόσβαση στον κώδικα είναι προαπαιτούμενη
⇒ Πρέπει να παρέχει την ελευθερία σε τρίτους να διανέμουν αντίτυπα του προγράμματος για να βοηθήσουν τον πλησίον τους.
⇒ Πρέπει να παρέχει την ελευθερία σε τρίτους να βελτιώνουν το πρόγραμμα και να δημοσιεύουν τις βελτιώσεις στο ευρύ κοινό, ώστε να επωφελείται από αυτές ολόκληρη η κοινότητα. Η ελεύθερη πρόσβαση στον κώδικα είναι προαπαιτούμενη.
Τέλος ας σημειωθεί ότι ο όρος free software πρέπει να αντιλαμβάνεται ως freedom of speech και όχι ως free beer. ;)