Python για Όλους

Εξερεύνηση Δεδομένων Χρησιμοποιώντας την Python 3

Dr. Charles R. Severance

Γιατί πρέπει να μάθετε να γράφετε προγράμματα;

Η συγγραφή προγραμμάτων (ή προγραμματισμός) είναι μια πολύ δημιουργική και ανταποδοτική δραστηριότητα. Μπορεί να γράψετε προγράμματα για πολλούς λόγους, που κειμένονται από το να αποκομίσετε τα προς το ζην έως το να επιλύσετε ένα δύσκολο πρόβλημα ανάλυσης δεδομένων ή να διασκεδάσετε ή να βοηθήσετε κάποιον άλλο να λύσει ένα πρόβλημα. Αυτό το βιβλίο θεωρεί ότι όλοι πρέπει να γνωρίζουν πώς να προγραμματίζουν και ότι μόλις μάθουν πώς να προγραμματίζουν θα βρουν και τι θέλουν να κάνουν με τη νέα τους δεξιότητα.

Είμαστε περιτριγυρισμένοι στην καθημερινότητά μας από υπολογιστές, που κυμαίνονται από φορητούς υπολογιστές έως κινητά τηλέφωνα. Μπορούμε να φανταστούμε αυτούς τους υπολογιστές ως τους «προσωπικούς μας βοηθούς», που μπορούν να φροντίσουν πολλά πράγματα για λογαριασμό μας. Το υλικό στους σημερινούς υπολογιστές είναι ουσιαστικά κατασκευασμένο για να μας θέτει συνεχώς την ερώτηση “Τι θα θέλατε να κάνω στη συνέχεια;”

Προσωπικός Ψηφιακός Βοηθός
Προσωπικός Ψηφιακός Βοηθός

Οι προγραμματιστές προσθέτουν ένα λειτουργικό σύστημα και ένα σύνολο εφαρμογών στο υλικό και καταλήγουμε σε έναν Προσωπικό Ψηφιακό Βοηθό (PDA), που είναι ιδιαίτερα χρήσιμος και ικανός στο να μας βοηθήσει να κάνουμε πολλά διαφορετικά πράγματα.

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

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

python words.py
Εισάγετε αρχείο: words.txt
to 16

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

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

Δημιουργικότητα και κίνητρο

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

Αν σκεφτούμε τα προγράμματα ως τη δημιουργική παραγωγή ομάδων προγραμματιστών, ίσως το παρακάτω σχήμα να είναι μια πιο λογική εκδοχή του PDA μας:

Οι προγραμματιστές σας μιλάνε
Οι προγραμματιστές σας μιλάνε

Προς το παρόν, το κύριο κίνητρό μας δεν είναι να κερδίσουμε χρήματα ή να ευχαριστήσουμε τους τελικούς χρήστες, αλλά αντίθετα να είμαστε πιο παραγωγικοί στο χειρισμό των δεδομένων και των πληροφοριών που θα συναντήσουμε στην καθημερινή μας ζωή. Όταν ξεκινάτε για πρώτη φορά, είστε και ο προγραμματιστής και ο τελικός χρήστης των προγραμμάτων σας. Καθώς αποκτάτε δεξιότητες ως προγραμματιστής και ο προγραμματισμός σας φαίνεται πιο δημιουργικός, οι σκέψεις σας μπορεί να στραφούν και στην ανάπτυξη προγραμμάτων για άλλους.

Αρχιτεκτονική υλικού υπολογιστών

Πριν ξεκινήσουμε να μαθαίνουμε τη γλώσσα, την οποία πρέπει να μιλάμε, ώστε να δίνουμε οδηγίες στους υπολογιστές, για την ανάπτυξη λογισμικού, πρέπει να μάθουμε λίγα πράγματα για τον τρόπο κατασκευής των υπολογιστών. Αν αποσυναρμολογούσατε τον υπολογιστή ή το κινητό σας τηλέφωνο και κοιτούσατε βαθιά μέσα του, θα βρίσκατε τα ακόλουθα μέρη:

Αρχιτεκτονική Υλικού
Αρχιτεκτονική Υλικού

Οι ορισμοί υψηλού επιπέδου αυτών των τμημάτων είναι οι εξής:

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

Ως προγραμματιστές, η δουλειά σας είναι να χρησιμοποιήσετε και να ενορχηστρώσετε καθέναν από αυτούς τους πόρους, για να λύσετε το πρόβλημα που χρειάζεται να λύσετε, και για να αναλύσετε τα δεδομένα, που λαμβάνετε από τη λύση. Ως προγραμματιστές θα “μιλάτε” κυρίως με την CPU και θα της λέτε τι πρέπει να κάνει στη συνέχεια. Μερικές φορές θα πείτε στην CPU να χρησιμοποιήσει την κύρια μνήμη, τη δευτερεύουσα μνήμη, το δίκτυο ή τις συσκευές εισόδου/εξόδου.

Πού Βρίσκεστε;
Πού Βρίσκεστε;

Είστε το άτομο που πρέπει να απαντά στην ερώτηση τις CPU, “και μετά τί;”. Αλλά θα ήταν κάπως άβολο αν έπρεπε να σας συρρικνώσουμε, σε ύψος 5 χιλιοστών, και να σας εισάγουμε στον υπολογιστή, μόνο και μόνο για να μπορείτε να δίνετε μια εντολή, τρία δισεκατομμύρια φορές το δευτερόλεπτο. Επομένως, πρέπει να γράψετε τις οδηγίες σας εκ των προτέρων. Αυτές τις αποθηκευμένες οδηγίες τις ονομάζουμε πρόγραμμα και την πράξη της καταγραφής αυτών των οδηγιών και την διασφάλιση της ορθότητας αυτών προγραμματισμό.

Κατανόηση του προγραμματισμού

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

Στην ουσία, χρειάζονται δύο δεξιότητες για να είστε προγραμματιστής:

Μόλις μάθετε μία γλώσσα προγραμματισμού, όπως η Python, θα είναι πολύ πιο εύκολο να μάθετε μια δεύτερη γλώσσα, όπως η JavaScript ή η C ++. Η νέα γλώσσα προγραμματισμού θα έχει πολύ διαφορετικό λεξιλόγιο και γραμματική, αλλά οι δεξιότητες επίλυσης προβλημάτων που απαιτούνται είναι οι ίδιες, σε όλες τις γλώσσες προγραμματισμού.

Θα μάθετε το “λεξιλόγιο” και τις “προτάσεις” της Python αρκετά γρήγορα. Θα χρειαστεί όμως περισσότερος χρόνος για να μπορέσετε να γράψετε ένα πρόγραμμα με συνοχή, για την επίλυση ενός ολοκαίνουργιου προβλήματος. Διδασκόμαστε προγραμματισμό όπως και τη γραφή. Αρχίζουμε να διαβάζουμε και να εξηγούμε προγράμματα, μετά γράφουμε απλά προγράμματα και συνέχεια γράφουμε όλο και πιο πολύπλοκα προγράμματα, με την πάροδο του χρόνου. Κάποια στιγμή “βρίσκετε τη μούσα σας” και βλέπετε τα μοτίβα μόνοι σας και μπορείτε να δείτε, πιο εύκολα, πώς να αντιμετωπίσετε ένα πρόβλημα αλλά και να γράψετε ένα πρόγραμμα που να το επιλύει. Και μόλις φτάσετε σε αυτό το σημείο, ο προγραμματισμός γίνεται μια πολύ ευχάριστη και δημιουργική διαδικασία.

Ξεκινάμε με το λεξιλόγιο και τη δομή των προγραμμάτων Python. Κάντε υπομονή καθώς τα απλά παραδείγματα θα σας θυμίζουν την εποχή που ξεκινήσατε να διαβάζετε για πρώτη φορά.

Λέξεις και προτάσεις

Σε αντίθεση με τις ανθρώπινες γλώσσες, το λεξιλόγιο της Python είναι πραγματικά πολύ μικρό. Αυτό το «λεξιλόγιο» το αποκαλούμε «δεσμευμένες λέξεις». Αυτές είναι λέξεις που έχουν πολύ ιδιαίτερη σημασία για την Python. Όταν η Python βλέπει αυτές τις λέξεις σε ένα πρόγραμμα Python, έχουν μία και μοναδική σημασία. Αργότερα, καθώς γράφετε κώδικα, θα φτιάχνετε τις δικές σας λέξεις, που θα έχουν νόημα για εσάς και ονομάζονται μεταβλητές. Θα έχετε ένα μεγάλο εύρος επιλογών για την ονοματολογία των μεταβλητών σας, αλλά δεν μπορείτε να χρησιμοποιήσετε καμία από τις δεσμευμένες λέξεις της Python, ως όνομα μεταβλητής.

Όταν εκπαιδεύουμε έναν σκύλο, χρησιμοποιούμε ειδικές λέξεις όπως “κάθισε”, “μείνε” και “φέρε”. Όταν μιλάτε σε ένα σκυλί και δεν χρησιμοποιείτε καμία από αυτές τις δεσμευμένες λέξεις, απλώς σας κοιτά με ένα ερωτηματικό βλέμμα στο πρόσωπό του μέχρι να πείτε μια δεσμευμένη λέξη. Για παράδειγμα, αν πείτε: “Μακάρι να περπατούσαν περισσότερο οι άνθρωποι, για να βελτιώσουν την υγεία τους”, αυτό που πιθανότατα ακούνε τα περισσότερα σκυλιά είναι “μπλα μπλα μπλα περπάτα μπλα μπλα μπλα μπλα.” Αυτό συμβαίνει επειδή το “περπάτα” είναι μια δεσμευμένη λέξη στη γλώσσα του σκύλου. Πολλοί μπορεί να αντιτείνουν ότι η γλώσσα μεταξύ ανθρώπων και γατών δεν έχει δεσμευμένες λέξεις1.

Κάποιες από τις δεσμευμένες λέξεις στη γλώσσα, που οι άνθρωποι χρησιμοποιούν με την Python, είναι και οι ακόλουθες:

and       del       global      not       with
as        elif      if          or        yield
assert    else      import      pass
break     except    in          raise
class     finally   is          return
continue  for       lambda      try
def       from      nonlocal    while    

Πράγματι, και σε αντίθεση με έναν σκύλο, η Python είναι ήδη πλήρως εκπαιδευμένη. Όταν λέτε “try”, η Python θα δοκιμάζει, κάθε φορά που το λέτε, χωρίς αποτυχία.

Θα μάθουμε αυτές τις δεσμευμένες λέξεις και πώς χρησιμοποιούνται έγκυρα, αλλά προς το παρόν θα επικεντρωθούμε στο ισοδύναμο του «μιλάω», της Python (σε γλώσσα ανθρώπου-σε-σκύλο). Το ωραίο, όταν λέμε στην Python να μιλήσει, είναι ότι μπορούμε ακόμη να της πούμε τι να πει, δίνοντάς της ένα μήνυμα σε εισαγωγικά:

print('Γειά σου κόσμε!')

Και, μόλις, γράψαμε την πρώτη μας, συντακτικά σωστή, πρόταση σε Python. Η πρόταση μας ξεκινά με τη συνάρτηση print, ακολουθούμενη από ένα κείμενο της επιλογής μας, που περικλείεται σε απλά εισαγωγικά. Οι προτάσεις (συμβολοσειρές) στις εντολές εκτύπωσης περικλείονται σε εισαγωγικά. Τα απλά εισαγωγικά και τα διπλά εισαγωγικά είναι ισοδύναμα. Οι περισσότεροι χρησιμοποιούν απλά εισαγωγικά, εκτός από την περίπτωση όπου ένα μόνο εισαγωγικό (το οποίο είναι μπορεί να δηλώνει και “απόστροφο”) πρέπει να εμφανιστεί στη συμβολοσειρά.

Συνομιλία με την Python

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

Για να καταφέρετε να συνομιλήσετε με την Python, πρέπει πρώτα να εγκαταστήσετε το λογισμικό της Python στον υπολογιστή σας καθώς και να μάθετε πώς να εκκινείτε την Python στον υπολογιστή σας. Αυτό απαιτεί πάρα πολλές λεπτομερές για να συμπεριληφθεί σε αυτό το κεφάλαιο, οπότε προτείνω να συμβουλευτείτε το www.gr.py4e.com όπου σας παρέχω λεπτομερείς οδηγίες και βίντεο, για τη ρύθμιση και την εκκίνηση της Python σε συστήματα Macintosh και Windows. Έτσι, κάποια στιγμή, σε ένα τερματικό ή στο παράθυρο εντολών θα πληκτρολογήσετε python και ο διερμηνευτής της Python θα αρχίσει να εκτελείται σε διαδραστική λειτουργία, οπότε θα δείτε κάτι σαν το παρακάτω:

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25)
[MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more
information.
>>>

Η προτροπή >>> είναι ο τρόπος του διερμηνευτή της Python να σας ρωτήσει: “Τι θέλετε να κάνω στη συνέχεια;” Η Python είναι έτοιμη να συζητήσει μαζί σας. Το μόνο που πρέπει να γνωρίζετε είναι πώς να της μιλήσετε, σε γλώσσα Python.

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

>>> Ερχόμαστε ειρηνικά, παρακαλώ πηγαίνετέ μας στον αρχηγό σας
File "<stdin>", line 1
  Ερχόμαστε ειρηνικά, παρακαλώ πηγαίνετέ μας στον αρχηγό σας
       ^
SyntaxError: invalid syntax
>>>

Αυτό δεν πήγε και τόσο καλά. Αν δεν σκεφτείτε κάτι γρήγορα, οι κάτοικοι του πλανήτη είναι πιθανό να σας επιτεθούν με τα δόρατά τους, να σας βάλουν στη σούβλα, να σας ψήσουν στη φωτιά και να σας φάνε για δείπνο.

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

>>> print('Γειά σου κόσμε!')
Γειά σου κόσμε!

Αυτό λειτούργησε πολύ καλύτερα, οπότε προσπαθείτε να επικοινωνήσετε περισσότερο:

>>> print('Πρέπει να είστε οι θρυλικοί θεοί που έρχεστε από τον ουρανό')
Πρέπει να είστε οι θρυλικοί θεοί που έρχεστε από τον ουρανό
>>> print('Σας περιμέναμε πολύ καιρό')
Σας περιμέναμε πολύ καιρό
>>> print('Ο μύθος μας λέει ότι θα είστε πολύ νόστιμοι με μουστάρδα')
Ο μύθος μας λέει ότι θα είστε πολύ νόστιμοι με μουστάρδα
>>> print 'Θα έχουμε συμπόσιο απόψε, εκτός κι αν το πείτε
File "<stdin>", line 1
  print 'Θα έχουμε συμπόσιο απόψε, εκτός κι αν το πείτε
                                                   ^
SyntaxError: Missing parentheses in call to 'print'
>>>

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

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

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

Πριν αφήσουμε την πρώτη μας συνομιλία με τον διερμηνευτή της Python, μάλλον θα πρέπει να μάθετε τον “καθώς πρέπει” τρόπο για να πείτε “αντίο” όταν αλληλεπιδράτε με τους κατοίκους του Πλανήτη Python:

>>> αντίο
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'αντίο' is not defined
>>> if you don't mind, I need to leave
File "<stdin>", line 1
  if you don't mind, I need to leave
           ^
SyntaxError: invalid syntax
>>> quit()

Θα παρατηρήσετε ότι το σφάλμα είναι διαφορετικό στις δύο πρώτες εσφαλμένες προσπάθειες. Το δεύτερο σφάλμα είναι διαφορετικό γιατί το if είναι μια δεσμευμένη λέξη και η Python είδε την δεσμευμένη λέξη και σκέφτηκε ότι προσπαθούσαμε να πούμε κάτι, αλλά αντιλήφθηκε λάθος στη σύνταξη της πρότασης.

Ο σωστός τρόπος για να πείτε “αντίο” στην Python είναι να πληκτρολογήσετε quit() στη διαδραστική προτροπή >>>. Πιθανότατα θα σας έπαιρνε αρκετή ώρα για να το μαντέψετε, οπότε το να έχετε ένα βιβλίο κοντά σας πιθανότατα θα σας φανεί χρήσιμο.

Ορολογία: διερμηνευτής και μεταγλωττιστής

Η Python είναι μια γλώσσα υψηλού επιπέδου, κατασκευασμένη ώστε να είναι σχετικά απλό, για τους ανθρώπους, να διαβάζουν και να γράφουν και για τους υπολογιστές να διαβάζουν και να επεξεργάζονται. Άλλες γλώσσες υψηλού επιπέδου είναι οι Java, C ++, PHP, Ruby, Basic, Perl, JavaScript και πολλές άλλες. Το πραγματικό υλικό μέσα στην κεντρική μονάδα επεξεργασίας (CPU) δεν καταλαβαίνει καμία από αυτές τις γλώσσες υψηλού επιπέδου.

Η CPU καταλαβαίνει μια γλώσσα που ονομάζουμε γλώσσα μηχανής. Η γλώσσα μηχανής είναι πολύ απλή και, ειλικρινά, πολύ κουραστική για να γραφτεί, επειδή τα αναπαριστά όλα με μηδενικά και μονάδες:

001010001110100100101010000001111
11100110000011101010010101101101
...

Η γλώσσα μηχανής φαίνεται, επιφανειακά, αρκετά απλή, δεδομένου ότι υπάρχουν μόνο μηδενικά και μονάδες, αλλά η σύνταξή της είναι ακόμη πιο σύνθετη και πιο πολύπλοκη από της Python. Έτσι, πολύ λίγοι προγραμματιστές γράφουν, κάποιες φορές, σε γλώσσα μηχανής. Αντ’ αυτού, κατασκευάζουμε διάφορους μεταφραστές, που επιτρέπουν στους προγραμματιστές να γράφουν σε γλώσσες υψηλού επιπέδου, όπως η Python ή η JavaScript και αυτοί οι μεταφραστές μετατρέπουν τα προγράμματα σε γλώσσα μηχανής για να εκτελεστεί πραγματικά από την CPU.

Δεδομένου ότι η γλώσσα μηχανής είναι συνδεδεμένη με το υλικό του υπολογιστή, δεν είναι φορητή, σε διαφορετικούς τύπους υλικού. Προγράμματα γραμμένα σε γλώσσες υψηλού επιπέδου μπορούν να μεταφερθούν μεταξύ διαφορετικών υπολογιστών, χρησιμοποιώντας διαφορετικό διερμηνευτή στο νέο μηχάνημα ή επαναμεταφράζοντας τον κώδικα για να δημιουργηθεί μια νέα έκδοση του προγράμματος σε γλώσσας μηχανής για το νέο μηχάνημα.

Αυτοί οι μεταφραστές γλωσσών προγραμματισμού εμπίπτουν σε δύο γενικές κατηγορίες: (1) διερμηνείς και (2) μεταγλωττιστές.

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

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

>>> x = 6
>>> print(x)
6
>>> y = x * 7
>>> print(y)
42
>>>

Σε αυτό το παράδειγμα, ζητάμε από την Python να θυμάται την τιμή έξι και να χρησιμοποιήσει το όνομα x, ώστε να μπορούμε να ανακτήσουμε την τιμή αργότερα. Επαληθεύουμε ότι η Python έχει κρατήσει την τιμή, χρησιμοποιώντας το print. Στη συνέχεια, ζητάμε από την Python να ανακτήσει το x και να το πολλαπλασιάσει επί επτά και να θέσει την νέα τιμή που υπολόγισε στο y. Κατόπιν, ζητάμε από την Python να εκτυπώσει την τρέχουσα τιμή του y.

Παρόλο που πληκτρολογούμε αυτές τις εντολές Python, μία γραμμή τη φορά, η Python τις αντιμετωπίζει ως μια διατεταγμένη σειρά δηλώσεων με μεταγενέστερες δηλώσεις που μπορούν να ανακτήσουν δεδομένα που δημιουργήθηκαν σε προγενέστερες δηλώσεις. Γράφουμε την πρώτη μας απλή παράγραφο με τέσσερις προτάσεις, με λογική και ουσιαστική σειρά.

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

Εάν διαθέτετε σύστημα Windows, συχνά αυτά τα εκτελέσιμα προγράμματα γλώσσας μηχανής έχουν ένα επίθημα “.exe” ή “.dll”, που σημαίνει “εκτελέσιμο” ή “dynamic link library / βιβλιοθήκη δυναμικών συνδέσμων” αντίστοιχα. Σε Linux και Macintosh, δεν υπάρχει επίθημα που να χαρακτηρίζει μοναδικά ένα αρχείο ως εκτελέσιμο.

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

^?ELF^A^A^A^@^@^@^@^@^@^@^@^@^B^@^C^@^A^@^@^@\xa0\x82
^D^H4^@^@^@\x90^]^@^@^@^@^@^@4^@ ^@^G^@(^@$^@!^@^F^@
^@^@4^@^@^@4\x80^D^H4\x80^D^H\xe0^@^@^@\xe0^@^@^@^E
^@^@^@^D^@^@^@^C^@^@^@^T^A^@^@^T\x81^D^H^T\x81^D^H^S
^@^@^@^S^@^@^@^D^@^@^@^A^@^@^@^A\^D^HQVhT\x83^D^H\xe8
....

Δεν είναι εύκολο να διαβάσετε ή να γράψετε σε γλώσσα μηχανής, οπότε είναι ωραίο να έχουμε διερμηνείς και μεταγλωττιστές, που μας επιτρέπουν να γράφουμε σε γλώσσες υψηλού επιπέδου, όπως η Python ή η C.

Τώρα, σε αυτό το σημείο στη συζήτησή μας για τους μεταγλωττιστές και τους διερμηνείς, θα πρέπει να αναρωτηθείτε λίγο για τον ίδιο τον διερμηνευτή της Python. Σε ποια γλώσσα έχει γραφτεί; Είναι γραμμένος σε μεταγλωττισμένη γλώσσα; Όταν πληκτρολογούμε “python”, τι ακριβώς συμβαίνει;

Ο διερμηνευτής της Python είναι γραμμένος σε μια γλώσσα υψηλού επιπέδου που ονομάζεται “C”. Μπορείτε να δείτε τον πραγματικό πηγαίο κώδικα για τον διερμηνευτή της Python πηγαίνοντας στο www.python.org και βρίσκοντας τη διαδρομή προς τον πηγαίο κώδικα. Έτσι η Python είναι ένα πρόγραμμα που είναι μεταγλωττισμένο σε γλώσσα μηχανής. Όταν εγκαταστήσατε την Python στον υπολογιστή σας (ή ο προμηθευτής την εγκατέστησε), αντιγράψατε ένα αντίγραφο κώδικα μηχανής του μεταφρασμένου προγράμματος Python στο σύστημά σας. Στα Windows, ο εκτελέσιμος κώδικας μηχανής για την ίδια την Python είναι πιθανό σε ένα αρχείο με όνομα όπως:

C:\Python35\python.exe

Αυτά είναι περισσότερα από ό,τι πραγματικά πρέπει να γνωρίζετε για να είστε προγραμματιστής Python, αλλά μερικές φορές αξίζει να απαντήσετε σε αυτές τις μικρές ενοχλητικές ερωτήσεις στην αρχή.

Γράφοντας ένα πρόγραμμα

Η πληκτρολόγηση εντολών στον διερμηνευτή της Python είναι ένας πολύ καλός τρόπος για να πειραματιστείτε με τις δυνατότητες της Python, αλλά δεν συνιστάται για την επίλυση πιο πολύπλοκων προβλημάτων.

Όταν θέλουμε να γράψουμε ένα πρόγραμμα, χρησιμοποιούμε έναν συντάκτη κειμένου για να γράψουμε τις εντολές Python σε ένα αρχείο, το οποίο ονομάζεται script / σενάριο. Κατά συνθήκη, τα σενάρια Python έχουν ονόματα που τελειώνουν με .py.

Για να εκτελέσετε το σενάριο, πρέπει να πείτε στον διερμηνευτή της Python το όνομα του αρχείου. Στο τερματικό / γραμμή εντολών, πληκτρολογείτε python hello.py ως εξής:

$ cat hello.py
print('Γειά σου κόσμε!')
$ python hello.py
Γειά σου κόσμε!

Το “$” είναι η προτροπή του λειτουργικού συστήματος και το “cat hello.py” μας δείχνει το περιεχόμενο του αρχείου “hello.py”, που είναι ένα πρόγραμμα Python μιας γραμμής, για την εκτύπωση μιας συμβολοσειράς.

Καλούμε, στη συνέχεια, τον διερμηνευτή της Python και του λέμε να διαβάσει τον πηγαίο κώδικα από το αρχείο “hello.py” αντί να μας ζητήσει τις γραμμές του κώδικα Python διαδραστικά.

Θα παρατηρήσετε ότι δεν ήταν ανάγκη να γράψετε quit() στο τέλος του προγράμματος Python στο αρχείο. Όταν η Python διαβάζει τον πηγαίο κώδικα από ένα αρχείο, ξέρει να σταματά όταν φτάσει στο τέλος του αρχείου.

Τι είναι ένα πρόγραμμα;

Ο στοιχειώδης ορισμός ενός προγράμματος είναι μια ακολουθία δηλώσεων Python που έχουν σχεδιαστεί για να κάνουν κάτι. Ακόμα και το απλό σενάριο hello.py είναι ένα πρόγραμμα. Είναι ένα πρόγραμμα μιας γραμμής και δεν είναι ιδιαίτερα χρήσιμο, αλλά με τον αυστηρό ορισμό, είναι ένα πρόγραμμα Python.

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

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

Για παράδειγμα, κοιτάξτε το παρακάτω κείμενο για έναν κλόουν και ένα αυτοκίνητο. Κοιτάξτε το κείμενο και εντοπίστε την πιο κοινή λέξη και πόσες φορές εμφανίζεται.

the clown ran after the car and the car ran into the tent
and the tent fell down on the clown and the car

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

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

όνομα = input('Εισάγετε αρχείο:')
handle = open(όνομα, 'r')
πλήθη = dict()

for γραμμή in handle:
    λέξεις = γραμμή.split()
    for λέξη in λέξεις:
        πλήθη[λέξη] = πλήθη.get(λέξη, 0) + 1

maxπλήθος = None
maxλέξη = None
for λέξη, πλήθος in list(πλήθη.items()):
    if maxπλήθος is None or πλήθος > maxπλήθος:
        maxλέξη = λέξη
        maxπλήθος = πλήθος

print(maxλέξη, maxπλήθος)

# Code: http://www.py4e.com/code3/words.py

Δεν χρειάζεται καν να γνωρίζετε την Python για να χρησιμοποιήσετε αυτό το πρόγραμμα. Θα χρειαστεί να ανατρέξετε στο Κεφάλαιο 10 αυτού του βιβλίου, για να κατανοήσετε πλήρως τις εκπληκτικές τεχνικές Python που χρησιμοποιήθηκαν για τη δημιουργία του προγράμματος. Είστε ο τελικός χρήστης, απλά χρησιμοποιείτε το πρόγραμμα και θαυμάζετε την εξυπνάδα του και πώς σας γλίτωσε από τόσο πολύ χειρωνακτική προσπάθεια. Απλώς πληκτρολογείτε τον κώδικα σε ένα αρχείο που ονομάζεται words.py και το εκτελείτε ή κατεβάζετε τον πηγαίο κώδικα από το http://www.gr.py4e.com/code3/ και το εκτελείτε.

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

Τα δομικά στοιχεία των προγραμμάτων

Στα επόμενα κεφάλαια, θα μάθουμε περισσότερα για το λεξιλόγιο, τη δομή των προτάσεων, τη δομή των παραγράφων και τη δομή της “ιστορίας” σε Python. Θα μάθουμε για τις ισχυρές δυνατότητες της Python και πώς να συνδυάσουμε αυτές τις δυνατότητες για να δημιουργήσουμε χρήσιμα προγράμματα.

Υπάρχουν ορισμένα εννοιολογικά πρότυπα χαμηλού επιπέδου, που χρησιμοποιούμε για την κατασκευή προγραμμάτων. Αυτές οι κατασκευές δεν είναι μόνο για προγράμματα Python, είναι μέρος κάθε γλώσσας προγραμματισμού από τη γλώσσα μηχανής έως τις γλώσσες υψηλού επιπέδου.

είσοδος
Λήψη δεδομένων από τον “έξω κόσμο”. Αυτή μπορεί να είναι η ανάγνωση δεδομένων από ένα αρχείο ή ακόμη και κάποιου είδους αισθητήρα όπως μικρόφωνο ή GPS. Στα αρχικά μας προγράμματα, η εισαγωγή θα προέρχεται από τον χρήστη που πληκτρολογεί δεδομένα στο πληκτρολόγιο.
έξοδος
Εμφάνιση των αποτελεσμάτων του προγράμματος σε μια οθόνη ή αποθήκευση τους σε ένα αρχείο ή ίσως εγγραφή τους σε μια συσκευή, όπως μια συσκευή αναπαραγωγής μουσικής ή εκφώνισης κειμένου.
σειριακή εκτέλεση
Εκτέλεση δηλώσεων της μίας μετά την άλλη, με τη σειρά που συναντώνται στο σενάριο.
υπό όρους εκτέλεση
Έλεγχος ορισμένων συνθηκών και, στη συνέχεια, εκτέλεση ή παράληψη μιας ακολουθίας εντολών.
επαναλαμβανόμενη εκτέλεση
Εκτέλεση κάποιου συνόλου δηλώσεων κατ’ επανάληψη, συνήθως με κάποια παραλλαγή.
επαναχρησιμοποίηση
Γραφή μιας σειράς εντολών μία φορά, απόδοση ονόματος σε αυτές και, στη συνέχεια, επαναχρησιμοποίησή τους, όπως χρειάζεται κάθε φορά, σε όλο το πρόγραμμά σας.

Ακούγεται, σχεδόν, πάρα πολύ απλό για να είναι αληθινό, και φυσικά δεν είναι ποτέ τόσο απλό. Είναι σαν να λέμε ότι το περπάτημα είναι απλά «να βάζεις το ένα πόδι μπροστά από το άλλο». Η «τέχνη» της συγγραφής ενός προγράμματος συνθέτει και υφαίνει αυτά τα βασικά στοιχεία μαζί πολλές φορές, για να παράγει κάτι που είναι χρήσιμο για τους τελικούς χρήστες του.

Το παραπάνω πρόγραμμα καταμέτρησης λέξεων χρησιμοποιεί άμεσα όλα τα παραπάνω μοτίβα, εκτός από ένα.

Τι θα μπορούσε να πάει στραβά;

Όπως είδαμε στις πρώτες μας συνομιλίες με την Python, πρέπει να επικοινωνούμε με μεγάλη ακρίβεια, όταν γράφουμε κώδικα Python. Η παραμικρή απόκλιση ή λάθος θα κάνει την Python να σταματήσει την εκτέλεση του προγράμματός σας.

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

>>> primt 'Γειά σου κόσμε!'
File "<stdin>", line 1
  primt 'Γειά σου κόσμε!'
                     ^
SyntaxError: invalid syntax
>>> primt ('Γειά σου κόσμε')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'primt' is not defined
>>> Python σε μισώ!
File "<stdin>", line 1
  Python σε μισώ!
       ^
SyntaxError: invalid syntax
>>> αν βγεις από κει μέσα, θα σου δώσω ένα μαθηματάκι
File "<stdin>", line 1
   αν βγεις από κει μέσα, θα σου δώσω ένα μαθηματάκι
            ^
SyntaxError: invalid syntax
>>>

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

Η Python μοιάζει πάρα πολύ με ένα σκύλο, σε αγαπάει άνευ όρων, έχει μερικές λέξεις κλειδιά που καταλαβαίνει, σε κοιτάζει με ένα γλυκό βλέμμα (>>>) και περιμένει να πεις κάτι που καταλαβαίνει. Όταν η Python λέει “SyntaxError: invalid syntax”, απλά κουνάει την ουρά της και λέει: “Φαινόσαστε να λέτε κάτι, αλλά απλώς δεν καταλαβαίνω τι εννοούσατε, αλλά συνεχίστε να μου μιλάτε (>>>).”

Καθώς τα προγράμματά σας γίνονται όλο και πιο εξελιγμένα, θα συναντήσετε τρεις γενικούς τύπους σφαλμάτων:

Syntax errors - Συντακτικά λάθη
Αυτά είναι τα πρώτα λάθη που θα κάνετε και είναι τα πιο εύκολα στο να τα διορθώσετε. Ένα συντακτικό λάθος σημαίνει ότι έχετε παραβιάσει τους κανόνες “γραμματικής” της Python. Η Python κάνει ό,τι μπορεί για να δείξει ακριβώς σε ποια γραμμή και ποιον χαρακτήρα μπερδεύτηκε. Το μόνο δύσκολο κομμάτι συντακτικών σφαλμάτων είναι ότι μερικές φορές το λάθος που χρειάζεται διόρθωση είναι στην πραγματικότητα σε προηγούμενο σημείο στο πρόγραμμα και όχι εκεί όπου παρατήρησε η Python ότι μπερδεύτηκε. Έτσι, η γραμμή και ο χαρακτήρας που υποδεικνύει η Python σε ένα συντακτικό λάθος, μπορεί να είναι απλώς το σημείο εκκίνησης για την έρευνά σας.

Logic errors -Λογικά λάθη
Ένα λογικό λάθος προκύπτει όταν το πρόγραμμά σας έχει καλή σύνταξη αλλά υπάρχει κάποιο λάθος στη σειρά των δηλώσεων ή ίσως λάθος στον τρόπο που οι προτάσεις σχετίζονται μεταξύ τους. Ένα καλό παράδειγμα λογικού σφάλματος μπορεί να είναι: “Πάρτε ένα ποτήρι από το μπουκάλι νερό σας, βάλτε το στο σακίδιο σας, περπατήστε στη βιβλιοθήκη και, στη συνέχεια, τοποθετήστε το καπάκι στο μπουκάλι”.

Semantic errors - Σημασιολογικά λάθη
Ένα σημασιολογικό σφάλμα προκύπτει όταν η περιγραφή των βημάτων, που πρέπει να ακολουθηθούν είναι συντακτικά τέλεια και με τη σωστή σειρά, αλλά απλώς υπάρχει ένα λάθος στο πρόγραμμα. Το πρόγραμμα είναι απόλυτα σωστό αλλά δεν κάνει αυτό που το προορίζατε για να κάνει. Ένα απλό παράδειγμα θα ήταν αν δίνατε σε κάποιον οδηγίες για το πώς θα φτάσει σε ένα εστιατόριο και λέγατε, “… όταν φτάσετε στη διασταύρωση με το βενζινάδικο, στρίψτε αριστερά, προχωρήστε ένα μίλι και το εστιατόριο είναι ένα κόκκινο κτίριο στα αριστερά σας”. Ο φίλος σας έχει αργήσει πολύ και σας καλεί για να σας πει ότι βρίσκεται σε ένα αγρόκτημα και τριγυρνά πίσω από έναν αχυρώνα, χωρίς σημάδι εστιατορίου. Τότε του λέτε “έστριψες αριστερά ή δεξιά στο βενζινάδικο;” και σας λέει, “ακολούθησα τέλεια τις οδηγίες σου, τις έχω καταγράψει, λέει στρίψε αριστερά και προχώρησε ένα μίλι μετά το βενζινάδικο”. Και τότε του λέτε: «Λυπάμαι πολύ, γιατί ενώ οι οδηγίες μου ήταν συντακτικά σωστές, δυστυχώς περιείχαν ένα μικρό, αλλά μη εντοπισμένο σημασιολογικό σφάλμα».

Και πάλι, και στους τρεις τύπους λαθών, η Python προσπαθεί σκληρά, απλώς να κάνει ό,τι ακριβώς ζητήσατε.

Εκσφαλμάτωση - Debugging

Όταν, στην Python, προκύπτει ένα λάθος ή ακόμα και όταν σας δίνει ένα αποτέλεσμα που είναι διαφορετικό από αυτό που θα έπρεπε, τότε ξεκινά η αναζήτηση της αιτίας του σφάλματος. Η εντοπισμός σφαλμάτων είναι η διαδικασία εύρεσης της αιτίας του σφάλματος στον κώδικά σας. Όταν κάνετε εντοπισμό σφαλμάτων σε ένα πρόγραμμα, και ειδικά εάν εργάζεστε σε ένα δύσκολο σφάλμα, υπάρχουν τέσσερα πράγματα που πρέπει να δοκιμάσετε:

ανάγνωση
Ελέγξτε τον κώδικά σας, διαβάστε τον ξανά στον εαυτό σας, και ελέγξτε ότι λέει αυτό που θέλατε να πείτε.
εκτέλεση
Πειραματιστείτε κάνοντας αλλαγές και εκτελώντας διαφορετικές εκδόσεις. Συχνά, εάν εμφανίζετε το σωστό πράγμα στο σωστό σημείο του προγράμματος, το πρόβλημα γίνεται εμφανές, αλλά μερικές φορές πρέπει να αφιερώσετε λίγο χρόνο για να φτιάξετε κρηπιδώματα.
μηρυκασμός
Αφιερώστε λίγο χρόνο στο να σκεφτείτε! Τι είδους σφάλμα είναι: σύνταξης, εκτέλεσης, σημασιολογικό; Τι πληροφορίες μπορείτε να πάρετε από τα μηνύματα σφάλματος ή από την έξοδο του προγράμματος; Τι είδους σφάλμα μπορεί να προκαλέσει το πρόβλημα που βλέπετε; Τι αλλάξατε τελευταία, πριν εμφανιστεί το πρόβλημα;
υποχώρηση
Κάποια στιγμή, το καλύτερο που μπορείτε να κάνετε είναι να κάνετε πίσω, αναιρώντας τις πρόσφατες αλλαγές, μέχρι να επιστρέψετε σε ένα πρόγραμμα που λειτουργεί και το καταλαβαίνετε. Στη συνέχεια, μπορείτε να ξανά ξεκινήσετε την κατασκευή του.

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

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

Η εκτέλεση πειραμάτων μπορεί να βοηθήσει, ειδικά αν εκτελείτε μικρές, απλές δοκιμές. Αλλά εάν εκτελείτε πειράματα χωρίς να σκεφτείτε ή να διαβάσετε τον κώδικά σας, μπορεί να πέσετε σε ένα μοτίβο που ονομάζω “προγραμματισμός τυχαίων περιπάτων”, η οποία είναι η διαδικασία πραγματοποίησης τυχαίων αλλαγών έως ότου το πρόγραμμά σας λειτουργήσει σωστά. Περιττό να πούμε ότι ο προγραμματισμός τυχαίων περιπάτων μπορεί να διαρκέσει πολύ.

Πρέπει να αφιερώσετε χρόνο στο να σκεφτείτε. Το Debugging είναι σαν μια πειραματική επιστήμη. Θα πρέπει να έχετε τουλάχιστον μία υπόθεση για το ποιο είναι το πρόβλημα. Εάν υπάρχουν δύο ή περισσότερες υποθέσεις, προσπαθήστε να σκεφτείτε μια δοκιμή που θα εξαλείψει κάποιες από αυτές.

Το διάλειμμα βοηθά στη σκέψη. Το ίδιο και η συζήτηση. Εάν εξηγήσετε το πρόβλημα σε κάποιον άλλο (ή ακόμα και στον εαυτό σας), μερικές φορές θα βρείτε την απάντηση πριν τελειώσετε την εξήγηση.

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

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

Το ταξίδι της μάθησης

Καθώς προχωράτε στο υπόλοιπο βιβλίο, μην φοβηθείτε εάν οι έννοιες δεν φαίνεται να ταιριάζουν μεταξύ τους και τόσο καλά, την πρώτη φορά. Όταν μαθαίνατε να μιλάτε, δεν ήταν πρόβλημα που τα πρώτα σας χρόνια κάνατε απλώς χαριτωμένους θορύβους και γρύλισμους. Και δεν πείραζε, αν και χρειάστηκαν έξι μήνες για να μεταβείτε από το απλό λεξιλόγιο σε απλές προτάσεις και χρειάστηκαν 5-6 χρόνια ακόμη για να μεταβείτε από προτάσεις σε παραγράφους και μερικά χρόνια ακόμη για να μπορέσετε να γράψετε ένα ενδιαφέρον, μικρό και πλήρες διήγημα μόνοι σας.

Θέλουμε να μάθετε την Python πολύ πιο γρήγορα, οπότε τα διδάσκουμε όλα ταυτόχρονα στα επόμενα κεφάλαια. Αλλά είναι σαν να μαθαίνετε μια νέα γλώσσα, που χρειάζεται χρόνο για να την απορροφήσετε και να την κατανοήσετε, πριν την κάνετε κτήμα σας. Αυτό οδηγεί σε κάποια σύγχυση, καθώς εξετάζουμε και επανεξετάζουμε θέματα για να προσπαθήσουμε να σας κάνουμε να δείτε τη μεγάλη εικόνα, ενώ ορίζουμε τα μικροσκοπικά κομμάτια που συνθέτουν αυτή τη μεγάλη εικόνα. Ενώ το βιβλίο είναι γραμμένο γραμμικά, και αν παρακολουθείτε ένα μάθημα θα προχωρήσει με γραμμικό τρόπο, μην διστάσετε να είστε μη γραμμικοί στον τρόπο με τον οποίο προσεγγίζετε το υλικό. Κοιτάξτε μπροστά και πίσω και διαβάστε χαλαρά. Μια γρήγορη ανάγνωση του πιο προηγμένου υλικού, χωρίς απαραίτητα να κατανοείτε πλήρως τις λεπτομέρειες, μπορεί να οδηγήση σε καλύτερη κατανόηση του “γιατί;” του προγραμματισμού. Επανεξετάζοντας το προηγούμενο υλικό και ακόμη επαναλαμβάνοντας προηγούμενες ασκήσεις, θα συνειδητοποιήσετε ότι στην πραγματικότητα μάθατε πολύ υλικό ακόμα κι αν το υλικό που κοιτάτε επί του παρόντος φαίνεται λίγο ακατανόητο.

Συνήθως όταν μαθαίνετε την πρώτη σας γλώσσα προγραμματισμού, υπάρχουν μερικές υπέροχες “Αχά!” στιγμές, που μπορείτε, κάνοντας ένα βήμα πίσω, να κοιτάξετε από ψηλά το πελέκημα της πέτρας με σφυρί και σμίλη και να δείτε ότι πράγματι δημιουργείτε ένα όμορφο γλυπτό.

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

Γλωσσάριο

bug
Ένα λάθος του προγράμματος.
ανάλυση - parse
Η εξέταση ενός προγράμματος και η ανάλυση της συντακτικής δομής του.
γλώσσα μηχανής
Η γλώσσα χαμηλότερου επιπέδου για λογισμικό, η οποία είναι η γλώσσα που εκτελείται απευθείας από την κεντρική μονάδα επεξεργασίας (CPU).
γλώσσα υψηλού επιπέδου
Μια γλώσσα προγραμματισμού, όπως η Python, που έχει σχεδιαστεί για να είναι εύκολη η ανάγνωσή της και η γραφή της από ανθρώπους.
γλώσσα χαμηλού επιπέδου
Μια γλώσσα προγραμματισμού που έχει σχεδιαστεί για να είναι εύκολη στην κατανόησή της από τον υπολογιστή. Ονομάζεται επίσης “γλώσσα μηχανής” ή “γλώσσα assembly”.
δευτερεύουσα μνήμη
Αποθηκεύει προγράμματα και δεδομένα και διατηρεί τις πληροφορίες ακόμη και όταν σταματήσει η τροφοδοσία ρεύματος. Γενικά πιο αργή από την κύρια μνήμη. Παραδείγματα δευτερεύουσας μνήμης αποτελούν οι μονάδες δίσκου και η μνήμη flash σε USB sticks.
διαδραστική λειτουργία - interactive mode
Ένας τρόπος χρήσης του διερμηνευτή της Python, πληκτρολογώντας εντολές και εκφράσεις στη γραμμή προτροπής.
διερμηνεία
Η διαδικασία εκτέλεσης ένας προγράμματος σε γλώσσα υψηλού επιπέδου, μεταφράζοντάς το μία προς μία γραμμή.
επίλυση προβλήματος
Η διαδικασία διατύπωσης ενός προβλήματος, εύρεσης μιας λύσης και διατύπωσης της λύσης αυτής.
κεντρική μονάδα επεξεργασίας
Η καρδιά κάθε υπολογιστή. Είναι αυτή που τρέχει το λογισμικό που γράφουμε. Ονομάζεται επίσης “CPU” ή “επεξεργαστής”.
κύρια μνήμη
Αποθηκεύει προγράμματα και δεδομένα. Η κύρια μνήμη χάνει τις πληροφορίες της όταν σταματήσει η τροφοδοσία ρεύματος.
μεταγλώττιση - compile
Η μετάφραση ενός ολόκληρου προγράμματος, γραμμένου σε γλώσσα υψηλού επιπέδου,ταυτόχρονα, σε γλώσσα χαμηλού επιπέδου, προετοιμάζοντάς το για μετέπειτα εκτέλεση.
μεταφερσιμότητα
Η ιδιότητα ενός προγράμματος να μπορεί να εκτελεστεί σε περισσότερα από ένα είδη υπολογιστών.
πηγαίος κώδικας
Ένα πρόγραμμα σε γλώσσα υψηλού επιπέδου.
πρόγραμμα
Ένα σύνολο οδηγιών, που καθορίζει έναν υπολογισμό.
προτροπή - prompt
Όταν ένα πρόγραμμα εμφανίζει ένα μήνυμα και περιμένει από ο χρήστης να πληκτρολογήσει κάποια είσοδο στο πρόγραμμα.
σημασιολογία
Το νόημα ενός προγράμματος.
σημασιολογικό λάθος
Ένα σφάλμα σε ένα πρόγραμμα που ως αποτέλεσμα έχει το να κάνει κάτι διαφορετικό από αυτό που ήθελε ο προγραμματιστής.
συνάρτηση print
Μια οδηγία προς τον διερμηνευτή της Python, που προκαλεί την εμφάνιση τιμών στην οθόνη.

Ασκήσεις

Άσκηση 1: Ποια είναι η λειτουργία της δευτερεύουσας μνήμης σε έναν υπολογιστή;

a)Εκτελεί όλο τον υπολογισμό και τη λογική του προγράμματος
b) Ανακτά ιστοσελίδες μέσω Διαδικτύου
c) Αποθηκεύει πληροφορίες μακροπρόθεσμα, ακόμη και πέρα από έναν κύκλο ισχύος
d) Δέχεται είσοδο από τον χρήστη

Άσκηση 2: Τι είναι ένα πρόγραμμα;

Άσκηση 3: Ποια είναι η διαφορά μεταξύ μεταγλωττιστή και διερμηνευτή;

Άσκηση 4: Ποιο από τα παρακάτω περιέχει “κώδικα μηχανής”;

a) Ο διερμηνευτής της Python
b) Το πληκτρολόγιο
c) Το πηγαίο αρχείο Python
d) Ένα έγγραφο επεξεργαστή κειμένου

Άσκηση 5: Τί λάθος υπάρχει στον ακόλουθο κώδικα;

>>> primt 'Hello world!'
File "<stdin>", line 1
  primt 'Hello world!'
                     ^
SyntaxError: invalid syntax
>>>

Άσκηση 6: Πού αποθηκεύεται στον υπολογιστή μια μεταβλητή, όπως το “x”, μετά την ολοκλήρωση της ακόλουθης γραμμής Python;

x = 123

a) Κεντρική μονάδα επεξεργασίας
b) Κύρια μνήμη
c) Δευτερεύουσα μνήμη
d) Συσκευές εισόδου
e) Συσκευές εξόδου

Άσκηση 7: Τί θα εμφανίσει το ακόλουθο πρόγραμμα;

x = 43
x = x - 1
print(x)

a) 43
b) 42
c) x + 1
d) Σφάλμα επειδή το x = x + 1 δεν είναι μαθηματικά σωστό

Άσκηση 8: Εξηγήστε καθένα από τα παρακάτω χρησιμοποιώντας ως παράδειγμα μία ανθρώπινη ικανότητα: (1) Κεντρική μονάδα επεξεργασίας, (2) Κύρια μνήμη, (3) Δευτερεύουσα μνήμη, (4) Συσκευή εισόδου και (5) Συσκευή εξόδου. Για παράδειγμα, “Τι είναι το ανθρώπινο ισοδύναμο με μια κεντρική μονάδα επεξεργασίας”;

Άσκηση 9: Πώς διορθώνετε ένα “Συντακτικό Λάθος”;


  1. http://xkcd.com/231/


Αν εντοπίσετε κάποιο λάθος σε αυτό το βιβλίο μην διστάσετε να μου στείλετε τη διόρθωση στο Github.