# 1. Εισαγωγή

Αυτό το εγχειρίδιο αναφοράς περιγράφει την γλώσσα προγραμματισμού Python. Δεν προορίζεται ως εγχειρίδιο εκμάθησης.

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

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

Κάθε υλοποίηση της Python συνοδεύεται από έναν αριθμό ενσωματωμένων και πρότυπων module. Αυτές είναι καταγεγραμμένες στο The Python Standard Library. Κάποια ενσωματωμένα module αναφέρονται όταν αλληλεπιδρούν με έναν σημαντικό τρόπο με τον ορισμό της γλώσσας.

## 1.1. Εναλλακτικές Υλοποιήσεις

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

Γνωστές υλοποιήσεις περιλαμβάνουν:

CPython

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

Jython

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

Python για το .NET

  Αυτή η υλοποίηση στην πραγματικότητα χρησιμοποιεί την υλοποίηση CPython, αλλά είναι μία διαχειριζόμενη εφαρμογή του .NET και κάνει διαθέσιμες τις .NET βιβλιοθήκες. Δημιουργήθηκε από τον Brian Lloyd. Για περισσότερες πληροφορίες, δείτε την αρχική σελίδα της Python για το .NET.

IronPython

  Μια εναλλακτική Python για το .NET. Σε αντίθεση με το Python.NET, αυτή είναι μία ολοκληρωμένη υλοποίηση της Python που παράγει IL, και κάνει μεταγλώττιση του κώδικα της Python απευθείας στη γλώσσα assembly του .NET. Δημιουργήθηκε από τον Jim Hugunin, τον πρωτότυπο δημιουργό της Jython. Για περισσότερες πληροφορίες δείτε την ιστοσελίδα της IronPython.

PyPy

  Μια υλοποίηση της Python γραμμένη εξ ολοκλήρου σε Python. Υποστηρίζει αρκετές προηγμένες λειτουργίες που δεν υπάρχουν σε άλλες υλοποιήσεις όπως υποστήριξη για stackless και τον μεταγλωττιστή Just in Time. Ένας από τους στόχους του πρότζεκτ είναι να ενθαρρύνει τον πειραματισμό με την ίδια την γλώσσα κάνοντας πιο εύκολη την τροποποίηση του διερμηνέα (αφού είναι γραμμένος στην Python). Περισσότερες πληροφορίες είναι διαθέσιμες στην αρχική σελίδα του PyPy πρότζεκτ.

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

## 1.2. Σημειογραφία

The descriptions of lexical analysis and syntax use a modified BNF grammar notation. This uses the following style of definition:

    name      ::=  lc_letter (lc_letter | "_")*
    lc_letter ::=  "a"..."z"

Η πρώτη γραμμή λέει ότι ένα `name` είναι ένα `lc_letter` ακολουθούμενο από μία σειρά από μηδέν ή περισσότερα `lc_letter`s και κάτω παύλες. Ένα `lc_letter` με τη σειρά του είναι οποιοσδήποτε από τους μονούς χαρακτήρες `'a'` έως `'z'`. (Αυτός ο κανόνας στην πραγματικότητα εφαρμόζεται για τα ονόματα που ορίζονται στους λεξιλογικούς και γραμματικούς κανόνες αυτού του εγγράφου.)

Κάθε κανόνας ξεκινά με ένα όνομα (το οποίο είναι ένα όνομα ορισμένο από τον κανόνα) και `::=`. Μία κάθετη γραμμή (`|`) χρησιμοποιείται για να διαχωρίσει τις εναλλακτικές· έχει την μικρότερη προτεραιότητα στην σειρά προτεραιότητας πράξεων αυτού του συμβολισμού. Ένας αστερίσκος (`*`) σημαίνει μηδέν ή περισσότερες επαναλήψεις του προηγούμενου αντικειμένου· παρομοίως, το συν (`+`) σημαίνει μία ή περισσότερες επαναλήψεις, και μία φράση περιφραγμένη από αγκύλες (`[ ]`) σημαίνει μηδέν ή μία περίπτωση (με άλλα λόγια, η περιφραγμένη φράση είναι προαιρετική). Οι τελεστές `*` και `+` ενώνονται όσο το δυνατόν πιο σφιχτά· οι παρενθέσεις χρησιμοποιούνται για ομαδοποίηση. Οι συμβολοσειρές είναι περιφραγμένες από εισαγωγικά. Οι κενοί χαρακτήρες είναι μόνο σημαντικοί για να διαχωρίσουν τα tokens. Οι κανόνες συνήθως περιέχονται σε μία μονή γραμμή· οι κανόνες με πολλές εναλλακτικές μπορεί να μορφοποιηθούν εναλλακτικά με κάθε γραμμή μετά την πρώτη να ξεκινάει με μια κάθετη γραμμή.

Στους λεξιλογικούς ορισμούς (όπως στο παραπάνω παράδειγμα), δύο περισσότεροι κανόνες χρησιμοποιούνται: Δύο χαρακτήρες χωρισμένοι από τρεις τελείες σημαίνει επιλογή όποιου μονού χαρακτήρα στο συγκεκριμένο (κλειστό) εύρος ASCII χαρακτήρων. Η φράση ανάμεσα σε γωνιακές παρενθέσεις (`<...>`) δίνει μία άτυπη περιγραφή του ορισμένου συμβόλου· π.χ., αυτό θα μπορούσε να χρησιμοποιηθεί για να περιγράψει την ιδέα του “χαρακτήρα ελέγχου” (control character) αν χρειαστεί.

Αν και η σημειογραφία που χρησιμοποιείται είναι σχεδόν η ίδια, υπάρχει μεγάλη διαφορά ανάμεσα στη σημασία των λεξιλογικών και των συντακτικών ορισμών: ένας λεξιλογικός ορισμός λειτουργεί με τους μεμονωμένους χαρακτήρες της πηγής εισόδου, ενώ ένας ορισμός σύνταξης λειτουργεί στην ροή των token που δημιουργείται από τη λεξιλογική ανάλυση. Όλες οι χρήσεις του BNF στο επόμενο κεφάλαιο («Λεξιλογική Ανάλυση») είναι λεξιλογικοί ορισμοί· οι χρήσεις στα ακόλουθα κεφάλαια είναι συντακτικοί ορισμοί.