Εισαγωγή στην Python δεδομένων μιας μεταβλητής κι αυτός δεν μπορεί ν’ αλλάξειΗ Python είναι μια από τις πιο δημοφιλής γλώσσες προγραμματισμού. αργότερα. Οι μεταγλωττισμένες γλώσσες προγραμματισμού είναιΔημιουργήθηκε το 1989 από τον Guido van Rossum. Το Python Software συνήθως στατικές. Π.χ. C/C++, C#, Erlang, Java, κ.ά.Insitute – PSF (Ίδρυμα Λογισμικού Python) ελέγχει την ανάπτυξη της Ανάλογα με το μοντέλο προγραμματισμού που χρησιμοποιείται σε:γλώσσας ήδη από την έκδοση 2.1. Βασίζεται στην ιδέα ότι ο κώδικας θα • Προστακτικές (Imperative), όπου το πρόγραμμα αποτελείται απόπρέπει να εκφράζει ξεκάθαρα μια ιδέα ή μια εργασία. Γι’ αυτό το λόγο, μια σειρά από εντολές που εκτελούνται με τη σειρά και αλλάζουνένα πρόγραμμα Python είναι μικρότερο από το αντίστοιχο πρόγραμμα σε τιμές σε μεταβλητές. Η κατάσταση του προγράμματος εξαρτάταιC/C++, C# ή Java. Επίσης, ένα πρόγραμμα Python μπορεί να τρέξει σε κάθε φορά από τις τιμές των μεταβλητών. Υπάρχουν οι εξής δυοοποιαδήποτε πλατφόρμα (MacOS, Linux, Unix, Windows). υπο-κατηγορίες:Η Python 3 εκδόθηκε το Δεκέμβριο του 2008 και ένα από τα πιο χρήσιμα ◦ Διαδικαστικές (Procedural), που διαχειρίζονται τα δεδομέναχαρακτηριστικά της είναι η υποστήριξη unicode χαρακτήρων. και και τις διαδικασίες ανεξάρτητα, όπως π.χ. C, Pascal, Fortran, κ.ά.Κατηγορίες γλωσσών προγραμματισμού ◦ Αντικειμενοστραφής (Object Oriented) όπου οι διαδικασίεςΥπάρχουν πολλές κατηγοριοποιήσεις των γλωσσών προγραμματισμού. (μέθοδοι) εφαρμόζονται στα δικά τους δεδομένα, δηλ.Ανάλογα με τον τρόπο εκτέλεσης, χωρίζονται σε: δεδομένα και διαδικασίες εσωκλείονται σε κλάσεις. Π.χ. C++, • μεταγλωττισμένες (compiled) όπου ολόκληρο το πρόγραμμα Java, Python, Perl, Ruby κ.ά. μεταγλωττίζεται σε γλώσσα μηχανής, με τη βοήθεια του • Συναρτησιακές (functional) που βασίζονται στις συναρτήσεις οι μεταγλωττιστή (compiler), για πιο γρήγορη εκτέλεση. Σ’ αυτή την οποίες όμως δεν αλλάζουν τα δεδομένα αλλά, όπως και στα κατηγορία ανήκουν γλώσσες όπως C/C++, C#, Erlang, Java κ.ά. μαθηματικά, επιστρέφουν νέα δεδομένα. Π.χ. Java 8, Scala, όπου μετά τη φάση της μεταγλώττισης (και ίσως και της σύνδεσης Clojure, Haskell, OCaml, Erlang κ.ά. – linker) παράγεται κάποιο εκτελέσιμο αρχείο (π.χ. .exe, Οι στατικές γλώσσες προγραμματισμού στοχεύουν σε ταχύτερη εκτέλεση .class, .beam κλπ.) • μεταφραστικές (interpreted) όπου κάθε εντολή του προγράμματος και μεγάλες εφαρμογές. Οι δυναμικές γλώσσες στοχεύουν σε ευκολία εκτελείται ως έχει χωρίς μεταγλώττιση. Παραδείγματα χρήσης και μικρότερες εφαρμογές. μεταφραστικών γλωσσών: Perl, Python, Ruby, Javascript, Basic, Με βάση τις παραπάνω κατηγορίες, μπορούμε να πούμε ότι η Python είναι Visual Basic, bash. μια αντικειμενοστραφής (αλλά και με στοιχεία συναρτησιακής), δυναμική,Ανάλογα με τον τρόπο διαχείρισης της μνήμης (μεταβλητών) διακρίνονται μεταφραστική γλώσσα προγραμματισμού.σε: • Δυναμικές (dynamic) όπου σε μια μεταβλητή μπορεί να Εγκατάσταση αποθηκεύονται διαφορετικού τύπου δεδομένα σε διαφορετικές Δυστυχώς ή ευτυχώς, υπάρχουν δυο βασικές εκδόσεις της Python που δεν χρονικές στιγμές. Οι μεταφραστικές γλώσσες προγραμματισμού είναι τελείως συμβατές μεταξύ τους. Αυτές είναι η Python 2 και η Python είναι συνήθως δυναμικές. Π.χ. Perl, Python, Ruby, Javascript, 3. Συνήθως το Ubuntu έρχεται προ εγκατεστημένο και με τις δυο αυτές Basic, Visual Basic, bash κ.ά. εκδόσεις. Για την έκδοση 2 δώστε: • Στατικές (static) όπου δηλώνουμε από την αρχή τον τύπο $ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)[GCC 4.8.2] on linux2 Ο Μεταφραστής της PythonType \"help\", \"copyright\", \"credits\" or \"license\" formore information. Όπως είπαμε, η Python είναι μια μεταφραστική γλώσσα>>> quit() προγραμματισμού. Ο μεταφραστής (interpreter) μεταφράζει τον πηγαίοενώ για την έκδοση 3: κώδικα σε κώδικα bytes (.pyc) ώστε να μπορεί να εκτελεστεί από την$ python3 Εικονική Μηχανή Python (Python Virtual Machine – PVM). Η PVMPython 3.4.3 (default, Sep 14 2016, 12:36:27)[GCC 4.8.4] on linux διαθέτει και συλλέκτη σκουπιδιών (garbage collector), όπως κι η Java, γιαType \"help\", \"copyright\", \"credits\" or \"license\" for να ελευθερώνει τη μνήμα από αντικείμενα που δε χρησιμοποιούνται πλέον.more information. με Επεξεργαστές κειμένου Python κάποιους>>> quit() τα Προτού συνεχίσουμε, ίσως θα θέλατε να εγκαταστήσετεΜπορείτε να τερματίσετε την python είτε με την εντολή quit() είτε κειμενογράφους που αναγνωρίζουν τη σύνταξη της Python2:Ctrl-D. • Aptana Studio 3Αν δεν είναι εγκατεστημένη κάποια ή και δυο εκδόσεις, τότε κατά • DrPythonγνωστά: • Geany$ sudo apt-get install python$ sudo apt-get install python3 • GeditΑν δεν θέλετε να την εγκαταστήσετε, μπορείτε να τη δοκιμάσετε online σε • JetBrains PyCharm • NetBeans με το Python pluginκάποιο online REPL (Read Eval Print Loop) όπως π.χ.1 Python shell, • PyDev βασισμένο στο EclipseREPL ή ideone ή codeskulptor.Άλλες χρήσιμες εντολές: • SciTE$ pydoc • Stani’s Python Editorpydoc - the Python documentation tool • Sublime... • Vim Το πρώτο μας πρόγραμμαΗ ιστορία δεν τελειώνει όμως εδώ. Υπάρχουν κι άλλοι μεταφραστές Μπορούμε να γράψουμε προγράμματα python είτε στο διαδραστικό(interpreters) αλλά και μεταγλωττιστές (compilers) της γλώσσας όπως π.χ. περιβάλλον (κέλυφος) που μόλις είδαμε, είτε γράφοντας τα προγράμματάjython, που είναι μια υλοποίηση της Python σε Java και άρα μπορεί ναεκτελεστεί στην εικονική μηχανή της Java (Java Virtual Machine), η μας σε αρχεία κειμένου με κατάληξη .py και εκτελώντας τα. περιβάλλον Ας δούμε μερικά παραδείγματα με το αλληλεπιδραστικόironpython για .NET και Mono, η CPython ως βιβλιοθήκη της C, η πρώτα:IPython, PyPy (Just-In-Time compiler) κ.ά. $ python1 http://noeticforce.com/python-online-compiler-interpreter-code-editors 2 https://wiki.python.org/moin/PythonEditors
Python 2.7.6 (default, Jun 22 2015, 17:58:13) Δηλώσαμε μια μεταβλητή με όνομα my_variable και αποθηκεύσαμε σ’[GCC 4.8.2] on linux2 αυτή την τιμή 43 και στην επόμενη γραμμή εκτυπώσαμε την μεταβλητήType \"help\", \"copyright\", \"credits\" or \"license\" for αυτή. Παρατηρήστε ότι, αντιθέτως με τις στατικές γλώσσεςmore information.>>> print \"Καλώς ήρθατε στην Python!\" προγραμματισμού, δεν απαιτείται να δηλώσουμε τον τύπο της μεταβλητήςΚαλώς ήρθατε στην Python!>>> quit() my_variable· αυτός εννοείται από τον τύπο δεδομένων της τιμήςΗ εντολή print τυπώνει ότι ακολουθεί την εντολή στην οθόνη. Η εντολή εκχώρησης (ακέραιος στο παράδειγμά μας). Μάλιστα, οι δυναμικέςquit() τερματίζει την python. γλώσσες προγραμματισμού, όπως η Python, επιτρέπουν ν’ αλλάξετε τον$ python3Python 3.4.3 (default, Sep 14 2016, 12:36:27) τύπο δεδομένων μιας μεταβλητής κατά τη διάρκεια του προγράμματος:[GCC 4.8.4] on linuxType \"help\", \"copyright\", \"credits\" or \"license\" for >>> my_variable = 'Hello' >>> print my_variable Hello Η Python υποστηρίζει διάφορους τύπους δεδομένων:more information. >>> my_int=7>>> print \"Καλώς ήρθατε στην Python!\" >>> my_float=1.23 >>> my_bool=TrueFile \"<stdin>\", line 1 >>> type(my_int)print \"Καλώς ήρθατε στην Python!\" ^ <type 'int'> >>> type(my_float)SyntaxError: Missing parentheses in call to 'print' <type 'float'>>>> print (\"Καλώς ήρθατε στην Python!\") >>> type(my_bool)Καλώς ήρθατε στην Python! <type 'bool'>>>> quit() >>> type(my_variable)Μόλις είδατε μια βασική διαφορά μεταξύ των δυο εκδόσεων. Στην <type 'str'>python3, η εντολή print() είναι μια συνάρτηση, επομένως χρειάζεται η Τύπος Δεδομένων Τιμές Πράξειςχρήση παρενθέσεων.Στη συνέχεια, όπου υπάρχουν διαφορές στη σύνταξη μεταξύ των δυο Λογικός (bool) True, False And, & , or, |, xor,εκδόσεων θα το αναφέρουμε. ^, not, ~Μεταβλητές Ακέραιος (int) +, -, *, /, //, %, **Οι μεταβλητές είναι αποθήκες μνήμης όπου μπορούμε ν’ αποθηκεύσουμε Πραγματικός (float) +, -, *, /, //, %, **διάφορες τιμές. Π.χ.3 (): Αλφαριθμητικό (str) Μέσα σε ' ' ή \" \" +, *>>> my_variable = 43>>> print my_variable43 Το % δηλώνει το υπόλοιπο (modulo) μιας διαίρεσης, το ** την ύψωση σε δύναμη, ενώ το // στρογγυλοποιεί προς τα κάτω4:3 υποθέτουμε python 2 4 Αντίστοιχη της floor
>>> print 5/4 # πηλίκο, python2 >>> print int('110',2)15>>> print(5/4) # πηλίκο, python3 >>> int('AE',16)1.25 174>>> print 5//4 # ακέραιο πηλίκο1 >>> x = 0>>> print 5.0/4.0 # πηλίκο, python2 >>> x += 1 # είναι ισοδύναμη με x = x + 11.25 >>> print x>>> print 5.0//4.0 # ακέραιο πηλίκο, python2 11.0 Υπάρχουν και οι τελεστές -=, *=, /=, %=, //=, **= που δουλεύουν>>> print 5%4 # υπόλοιπο1 παρόμοια. Τέλος, οι τελεστές << (αριστερή ολίσθηση) και >> (δεξιά>>> print 2**3 # ύψωση σε δύναμη8 ολίσθηση).>>> print my_variable + ' Python!'Hello Python! >>> print 014 # οκταδικός (0o14 στην python3)>>> print my_variable*3 12HelloHelloHelloενώ μόλις είδατε τι σημαίνουν οι τελεστές + και * για αλφαριθμητικά! >>> print 0xC # δεκαεξαδικός 12Φυσικά, υπάρχει η προτεραιότητα πράξεων και μπορείτε να την αλλάξετε >>> print 0b1100 # δυαδικός 12 >>> x << 1 # αριστερή ολίσθηση (left shift) 24με χρήση παρενθέσεων: >>> x >> 1 # δεξιά ολίσθηση (right shift)>>> print 3+6*2 615 Είδαμε ότι μπορούμε να ορίσουμε ένα αλφαριθμητικό μέσα σε ' ' ή \" \".>>> print (3+6)*218 Τι γίνεται όμως αν αυτοί οι δυο χαρακτήρες υπάρχουν μέσα στοΤώρα πλέον μπορείτε να εξηγήσετε το παρακάτω: αλφαριθμητικό μας; χαρακτήρα διαφυγής \ (escape>>> s = '4'>>> print s >>> print 'This isn't a joke.'4 File \"<stdin>\", line 1>>> print s*4 print 'This isn't a joke.'4444 ^>>> print int(s) * 416 SyntaxError: invalid syntaxΗ συνάρτηση int() μετατρέπει από έναν τύπο δεδομένων σ’ έναν άλλο, Στην περίπτωση αυτή χρησιμοποιούμε τον(από str σε int στην προκειμένη περίπτωση). Η συνάρτηση str() κάνει character): >>> print 'This isn\'t a joke.' This isn't a joke.την αντίστροφη μετατροπή (από int σε str). Υπάρχουν επίσης οι oct(), Ας δούμε τώρα πώς μπορούμε να γράψουμε ένα πρόγραμμα Python. Στονhex() και bin(). Υπάρχει όμως και μια δεύτερη έκδοση της int(): αγαπημένο σας κειμενογράφο εισάγετε το παρακάτω:
#!/usr/bin/env python Πώς ονομάζεσαι; Γιάννηςprint 'Hello. I am a python program.' Γειά σου Γιάννης. Καλωσήρθες στην Python!name = raw_input(\"What is your name? \")print \"Hello \" + name + \". Welcome to Python!\"και αποθηκεύστε το ως π.χ. hello-python.py. Ας δοκιμάσουμε με την python 3 (hello-python-3-el.py): #!/usr/bin/env python3$ chmod +x hello-python.py # -*- coding: utf8 -*-$ ./hello-python.py print('Γειά σου. Είμαι ένα πρόγραμμα python.')Hello. I am a python program. name = input(\"Πώς ονομάζεσαι; \")What is your name? John print(\"Γειά σου \" + name + \". Καλωσήρθες στηνHello John. Welcome to Python! Python!\")Η εντολή raw_input() θα εμφανίσει το μήνυμα, που του περνάμε ωςόρισμα, στη γραμμή εντολών και θα αποθηκεύσει την είσοδο του χρήστη $ chmod +x hello-python-3-el.py $ ./hello-python-3-el.pyστη μεταβλητή name.Ας δοκιμάσουμε και την ελληνική έκδοση του προγράμματος (hello- Γειά σου. Είμαι ένα πρόγραμμα python. Πώς ονομάζεσαι; Γιάννηςpython-el.py):#!/usr/bin/env python Γειά σου Γιάννης. Καλωσήρθες στην Python!print 'Γειά σου. Είμαι ένα πρόγραμμα python.' Παρατηρήστε ότι στην python3 η raw_input() έχει μετονομαστεί σεname = raw_input(\"Πώς ονομάζεσαι; \") input(). Ο χαρακτήρας +, όπως θα δούμε, είναι ο χαρακτήραςprint \"Γειά σου \" + name + \". Καλωσήρθες στην Python!\" συγχώνευσης αλφαριθμητικών. Υπάρχει όμως κι άλλος τρόπος να συγχωνεύσουμε μεταβλητές με αλφαριθμητικά και να τα εμφανίσουμε$ chmod +x hello-python-el.py στην οθόνη. Έτσι η τελευταία εντολή του προγράμματος (python 2)$ ./hello-python-el.py μπορεί να γραφεί και ως εξής:File \"./hello-python-el.py\", line 2 print \"Γειά σου %s. Καλωσήρθες στην Python!\" %(name)SyntaxError: Non-ASCII character '\xce' in file./hello-python-el.py on line 2, but no encoding Ο τελεστής % στο τέλος του αλφαριθμητικού θα αντικαταστήσει τα %sdeclared; see http://www.python.org/peps/pep-0263.html μέσα στο αλφαριθμητικό με τις μεταβλητές μέσα στις παρενθέσειςfor detailsΤζίφος! Αν διαβάσουμε τον υπερσύνδεσμο που μας προτείνει τότε αρκεί (χωρισμένες με κόμμα αν είναι περισσότερες από μια). Φυσικά υπάρχουννα κάνουμε την ακόλουθη αλλαγή για να δουλέψει: και %i ή %d, %f για int, float αντίστοιχα. Π.χ. η παρακάτω εντολή σημαίνει δυο ψηφία μετά την υποδιαστολή:#!/usr/bin/env python# -*- coding: utf8 -*- >>> print \"%.2f\" % 5.2 5.20print 'Γειά σου. Είμαι ένα πρόγραμμα python.' Σχόλιαname = raw_input(\"Πώς ονομάζεσαι; \") # Αυτό είναι ένα σχόλιο μιας γραμμήςprint \"Γειά σου \" + name + \". Καλωσήρθες στην Python!\" \"\"\"Αυτό είναι ένα σχόλιο$ ./hello-python-el.py πολλών γραμμών\"\"\"Γειά σου. Είμαι ένα πρόγραμμα python.
Εντολές αποφάσεων και επανάληψης Σου αρέσει η Python (Ν/ν/Ο/ο);οΌπως κάθε γλώσσα προγραμματισμού, έτσι και η Python υποστηρίζει Μήπως να το ξανασκεφτόσουνα; $ ./testif.pyεντολές αποφάσεων και επανάληψης. Σου αρέσει η Python (Ν/ν/Ο/ο);Μ Απάντησε με Ν/ΟΗ εντολή αποφάσεων if συντάσσεται ως εξής:if συνθήκη1: bodyelif συνθήκη2: Εντολή επανάληψης: body while συνθήκη:else: body body Π.χ. >>> i = 0Προσέξτε να μην ξεχάσετε το : μετά από κάθε συνθήκη. >>> while i < 10: Done.Ένα σημαντικό θέμα σε κάθε γλώσσα προγραμματισμού είναι πώς να ... i += 1 ... print iκαθορίζουμε ποιες εντολές είναι να εκτελεστούν μαζί, ως μπλοκ, και ποιες ... print 'All Done' εμφανίζει τους ακεραίους από 1-10 και στο τέλος Allόχι. Π.χ. στην Java, C/C++, ένα μπλοκ κώδικα ορίζεται μέσα σε { }, στηνPascal μεταξύ των εντολών BEGIN END κλπ. Η Python χρησιμοποιεί τα Ας δούμε άλλο ένα παράδειγμα (testwhile.py:):κενά! Όσες εντολές έχουν εσοχή 4 κενά από την αρχή αποτελούν ένα #!/usr/bin/env python3μπλοκ, 8 κενά αποτελούν ένα εσωτερικό μπλοκ κ.ο.κ. answer = input(\"Σου αρέσει η Python (Ν/ν/Ο/ο); \")Προσοχή! Μπορείτε να χρησιμοποιήσετε και τον στηλοθέτη (tab) μόνο αν while not (answer == 'Ν' or answer == 'ν' or answer ==τον έχετε ορίσει στους 4 χαρακτήρες. 'Ο' or answer == 'ο'):Ας δούμε ένα παράδειγμα με το παρακάτω πρόγραμμα testif.py: answer = input(\"Σου αρέσει η Python; Απάντησε με#!/usr/bin/env python3 (Ν/ν/Ο/ο).\")answer = input(\"Σου αρέσει η Python (Ν/ν/Ο/ο);\") print('Ευχαριστώ για την απάντηση!')if answer == 'Ν' or answer == 'ν': $ chmod u+x testwhile.pyprint(\"Καλωσήρθες στη Python!\") $ ./testwhile.pyelif answer == 'Ο' or answer == 'ο': Σου αρέσει η Python (Ν/ν/Ο/ο); λprint (\"Μήπως να το ξανασκεφτόσουνα;\") Σου αρέσει η Python; Απάντησε με (Ν/ν/Ο/ο): νelse: Ευχαριστώ για την απάντηση!print(\"Απάντησε με Ν/Ο\")Παρατηρήστε ότι ο έλεγχος για ισότητα γίνεται με == ενώ για ανισότητα Θα μπορούσαμε να γράψουμε τη συνθήκη κι ως εξής, όπως θα μάθουμε παρακάτω:με !=. while not answer in ['Ν', 'ν', 'Ο', 'ο']:$ chmod +x testif.py$ ./testif.py Θα πρέπει να προσέχετε η συνθήκη να παίρνει κάποια στιγμή την τιμήΣου αρέσει η Python (Ν/ν/Ο/ο);N False, διαφορετικά πέφτετε σε ατέρμονο βρόγχο και το πρόγραμμά σαςΚαλωσήρθες στη Python! δεν τελειώνει ποτέ.$ ./testif.py Υπάρχει και μια άλλη έκδοση της while:
while συνθήκη: παρακάτω:body1 for i in range(0,10):else: print i+1body2 print 'All Done'Το μπλοκ else θα εκτελεστεί όταν η συνθήκη γίνει False. Π.χ. το All Done θα εμφανιζόταν επίσης 10 φορές. Επομένως χρειάζεται#!/usr/bin/env python3count = 1 μεγάλη προσοχή για το που αρχίζει και που τελειώνει ένα μπλοκ εντολώνanswer = input(\"Σου αρέσει η Python (Ν/ν/Ο/ο); \")while count < 3 and not answer in ['Ν', 'ν', 'Ο', που ορίζεται με εσοχές. Παρακάτω θα δούμε κι άλλες χρήσεις της for.'ο']: Δομές Δεδομένων count += 1 Η Python υποστηρίζει τις ακόλουθες δομές δεδομένων: answer = input(\"Σου αρέσει η Python; Απάντησε με(Ν/ν/Ο/ο): \") Λίστες (Lists)if answer in ['Ν', 'ν', 'Ο', 'ο']: print('Ευχαριστώ για την απάντηση!') Ορίζονται μέσα σε [ ]. Οι λίστες μπορούν να περιλαμβάνουνelse: οποιονδήποτε τύπο δεδομένων: αριθμούς, αλφαριθμητικά, άλλες λίστες,print('Ξεπέρασες τον επιτρεπτό αρ. προσπαθειών!') κλπ. Η σύνταξη μιας λίστας είναι [Element1, Element2, ...,$ ./testwhile.py ElementN] και όπως ειπώθηκε, κάθε Element μπορεί να ανήκει σεΣου αρέσει η Python (Ν/ν/Ο/ο); α διαφορετικό τύπο δεδομένων:Σου αρέσει η Python; Απάντησε με (Ν/ν/Ο/ο): σΣου αρέσει η Python; Απάντησε με (Ν/ν/Ο/ο): δ >>> months =Ξεπέρασες τον επιτρεπτό αρ. προσπαθειών! ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιο ς','Ιούνιος','Ιούλιος','Αυγούστος','Σεπτέμβριος','Οκτώ βριος','Νοέμβριος','Δεκέμβριος'] >>> print months[0]Εντολή επανάληψης: Ιανουάριοςfor μεταβλητή in λίστα_τιμών: Οι λίστες ξεκινάνε από το δείκτη 0. >>> print months[9:12] body1 ['\xce\x9f\xce\xba\xcf\x84\xcf\x8e\xce\xb2\xcf\x81\xceelse \xb9\xce\xbf\xcf\x82', '\xce\x9d\xce\xbf\xce\xad\xce\xbc\xce\xb2\xcf\x81\xce\ body2Π.χ.for i in range(0,10): xb9\xce\xbf\xcf\x82',print i+1 '\xce\x94\xce\xb5\xce\xba\xce\xad\xce\xbc\xce\xb2\xcf\print 'All Done' x81\xce\xb9\xce\xbf\xcf\x82']Το παραπάνω πρόγραμμα εμφανίζει τους ακεραίους από 1-10 και στο Ενώ στην python 3 η παραπάνω εντολή δουλεύει σωστά επιστρέφονταςτέλος All Done. Η μεταβλητή i παίρνει τιμές από 0-9. ['Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'], στην 2 όχι. Αν καιΠαρατηρήστε ότι η τελευταία εντολή είναι έξω από το μπλοκ εντολών που δοκίμασα τα πάντα που βρήκα στο Διαδίκτυο, δεν κατάφερα να βρω πώςεκτελούνται από τη for. Αν κάναμε το λάθος να τη γράψουμε όπως στο να εμφανίσω σωστά την παραπάνω εντολή στην Python 2.
Παρατηρήστε ότι η παραπάνω εντολή επιστρέφει τα στοιχεία 9, 10 και 11 ['πληκτρολόγιο'] >>> basket2 = ['joystick']της λίστας. >>> print(basket + basket2) # συγχώνευσηΣυνεχίζουμε με Python 3. Υπάρχουν διάφορες συναρτήσεις για λίστες: ['πληκτρολόγιο', 'joystick'] Αν θέλουμε να προσπελάσουμε μόνο τα στοιχεία που βρίσκονται στις>>> basket = []>>> basket.append(\"πληκτρολόγιο\") ζυγές θέσης στη λίστα, χρησιμοποιούμε τον τελεστή τεμαχισμού>>> basket.append(\"οθόνη\")>>> basket.append(\"ποντίκι\") [start:end:step]5:>>> print(basket) >>> basket = ['πληκτρολόγιο', 'οθόνη', 'ποντίκι']['πληκτρολόγιο', 'οθόνη', 'ποντίκι'] >>> print(basket[0::2])>>> print(len(basket)) ['πληκτρολόγιο', 'ποντίκι']3 >>> ae = ['A', 'Β', 'Γ', 'Δ', 'Ε']>>> indx = basket.index(\"οθόνη\") >>> print(ae[3:])>>> print(indx) ['Δ', 'Ε']1 >>> print(ae[:2])>>> basket.insert(indx, \"mousepad\") ['A', 'Β']>>> print(basket) >>> print(ae[::2])['πληκτρολόγιο', 'mousepad', 'οθόνη', 'ποντίκι'] ['A', 'Γ', 'Ε']>>> for item in basket: Η συνάρτηση range(start,stop,step) επιστρέφει μια λίστα ακεραίων:... print(item) range(6) # => [0,1,2,3,4,5]πληκτρολόγιο range(1,6) # => [1,2,3,4,5]mousepad range(1,6,3) # => [1,4]οθόνηποντίκι Η χρήση της for για λίστες που είδαμε παραπάνω έχει το μειονέκτημα>>> basket.sort() είναι ότι δεν γνωρίζουμε σε ποια θέση βρισκόμαστε στη λίστα. Θα>>> for i in range(len(basket)):... print(basket[i]) μπορούσαμε να χρησιμοποιήσουμε έναν μετρητή, αλλά υπάρχει κι οmousepadοθόνη παρακάτω τρόπος:πληκτρολόγιοποντίκι >>> basket = ['πληκτρολόγιο', 'οθόνη', 'ποντίκι']>>> basket.remove('mousepad') >>> for index, item in enumerate(basket):>>> print(basket) ... print(\"%d: %s\" % (index, item))['οθόνη', 'πληκτρολόγιο', 'ποντίκι'] 0: πληκτρολόγιο>>> item = basket.pop() #διαγραφή τελευταίου στοιχείου 1: οθόνη>>> print(basket) 2: ποντίκι['οθόνη', 'πληκτρολόγιο'] Επίσης, υποστηρίζονται και iterators όπως και με άλλες γλώσσες>>> del(basket[0]) προγραμματισμού: >>> i = iter(basket) >>> while hasNext(i): ... print(next(i))>>> print(basket) 5 Το end δεν περιλαμβάνεται, δηλ. το διάστημα είναι [start, end).
πληκτρολόγιο >>> print(stock.keys())οθόνη dict_keys(['πληκτρολόγια', 'οθόνες', 'mousepads',ποντίκι 'ποντίκια'])Traceback (most recent call last): >>> print(stock.values())File \"<stdin>\", line 2, in <module> dict_values([50, 13, 111, 85])StopIteration >>> print(stock.items())Η εξαίρεση που βλέπετε στο τέλος είναι φυσιολογική. dict_items([('πληκτρολόγια', 50), ('οθόνες', 13),Αν θέλουμε να προσπελάσουμε δυο λίστες ταυτόχρονα, τότε η Python ('mousepads', 111), ('ποντίκια', 85)]) >>> del stock['οθόνες']παρέχει λύση και γι’ αυτό: >>> print(stock) {'πληκτρολόγια': 50, 'mousepads': 111, 'ποντίκια': 85}>>> for item1, item2 in zip(basket, basket2): >>> for key, value in stock.items():... print(\"%s ή %s;\" % (item1, item2)) ... print(key, value)πληκτρολόγιο ή joystick; πληκτρολόγια: 50Η zip() σταματάει στο τέλος της μικρότερης λίστας. mousepads: 111Φυσικά και υποστηρίζονται n-διάστατες λίστες, π.χ.: ποντίκια: 85>>> matrix2D = [[3,5],[2,-1]] # πίνακας 2x2>>> print matrix2D[0][3, 5] Πλειάδες (tuples)Λεξικά (dictionaries) Ορίζονται μέσα σε ( ). Η πλειάδα είναι μια αμετάβλητη (immutable) λίστα. Μετά τη δημιουργία της, δεν μπορούμε ν’ αλλάξουμε ούτε τοΟρίζονται μέσα σε { }. Η διαφορά του με τη λίστα είναι ότι αντί γιαδείκτες για προσπέλαση των τιμών, χρησιμοποιούνται κλειδιά (keys). Ένα μέγεθος ούτε το περιεχόμενό της. Είναι κάτι αντίστοιχο των enumeratedκλειδί μπορεί να είναι είτε ακέραιος αριθμός είτε αλφαριθμητικό. Σε άλλες types (enum) σε γλώσσες όπως η Java ή οι C/C++/C#. Η σύνταξη μιαςγλώσσες προγραμματισμού ονομάζονται πίνακες κατακερματισμού πλειάδας είναι (Element1, Element2, ..., ElementN) και κάθε Element μπορεί να ανήκει σε διαφορετικό τύπο δεδομένων:(hashmaps). Η σύνταξη ενός λεξικού είναι {key1 : value1, key2 : >>> colors = ('black', 'blue', 'red', 'green',value2, ..., keyN : valueN} και κάθε value μπορεί να ανήκει 'yellow')σε διαφορετικό τύπο δεδομένων: >>> colors[1] 'blue'>>> stock = {'πληκτρολόγια' : 56, 'ποντίκια' : 85, >>> colors[1] = 'cyan''mousepads' : 111} Traceback (most recent call last):>>> print(stock['mousepads'])111 File \"<stdin>\", line 1, in <module>>>> stock['πληκτρολόγια'] = 50 TypeError: 'tuple' object does not support item>>> stock['οθόνες'] = 13 assignment>>> print(stock) Προσοχή απαιτείται σε πλειάδες που περιέχουν ένα μόνο στοιχείο:{'πληκτρολόγια': 50, 'mousepads': 111, 'οθόνες': 13,'ποντίκια': 85} >>> singleton = (1)>>> print(stock.get('οθόνες')) >>> print singleton13 1
>>> singleton_tuple = (1,) # το κόμμα απαιτείται Ισότητα ==>>> print singleton_tuple Ανισότητα !=(1,)Υποστηρίζονται οι τελεστές + και *, όπως και στις λίστες καθώς και οτεμαχισμός τους: >>> print(s1 - s2) # αφαίρεση>>> colors[1:3] {'red', 'black'} >>> print(s1 | s2) # ένωση('blue', 'red')>>> colors[1:3] * 2 {'red', 'blue', 'black', 'yellow'} >>> print(s1 & s2) # τομή('blue', 'red', 'blue', 'red') {'blue'} >>> print(s1 > s2)Σύνολα (sets) FalseΟρίζονται μέσα σε { }. Ένα σύνολο περιέχει μη ταξινομημένα στοιχεία >>> print(s1 < s2)τα οποία είναι μοναδικά, δηλ. δεν υπάρχουν διπλότυπα. Η σύνταξη μιας False == s2) >>> print(s1 != s2)πλειάδας είναι {Element1, Element2, ..., ElementN} και κάθε FalseElement μπορεί να ανήκει σε διαφορετικό τύπο δεδομένων: >>> print(s1>>> s1 = {'black', 'blue', 'red'}>>> s2 = set(['green', 'yellow']) True>>> print(s2) >>> print('black' in s1){'green', 'yellow'} True>>> s2.add('blue')>>> s2.add('green') # υπάρχει ήδη Και μια σύνταξη που μπορεί να σας εκπλήξει:>>> print(s2) >>> [val * 1.23 for val in stock.values()]{'green', 'blue', 'yellow'} [136.53, 104.55, 61.5]>>> s2.remove('green') Σύνταξη List Comprehension: [operation for var in iterable if condition]>>> print(s2) >>> [i for i in range(11) if i % 2 == 0]{'blue', 'yellow'} [0, 2, 4, 6, 8, 10]Τα σύνολα υποστηρίζουν τις ακόλουθες πράξεις: Η Python 3 υποστηρίζει και: Πράξη Σύμβολο Set comprehension: {operation for var in set if condition} Dict comprehension: {key:value for key,value in sequence if condition} Αφαίρεση - Ένωση | Αλφαριθμητικά Τομή & Τα αλφαριθμητικά (str) είναι κι αυτά λίστες χαρακτήρων που ξεκινάνε από το δείκτη 0: Υπερσύνολο > >>> day = \"Καλημέρα\" Υποσύνολο < >>> print day[0]
>>> >>> print(s.split(' ')) ['Καλημέρα', 'φίλε!']Τζίφος! >>> s.replace(\"!\",\"!!\")$ python3 'Καλημέρα φίλε!!'Python 3.4.3 (default, Sep 14 2016, 12:36:27) >>> print(s.isalpha()) # δεν περιέχει αριθμούς κλπ.[GCC 4.8.4] on linuxType \"help\", \"copyright\", \"credits\" or \"license\" for Falsemore information. >>> print(day.isalpha()) True>>> day = \"Καλημέρα\">>> print(day[0]) >>> for letter in day:Κ ... if letter == 'α':Αν όμως θέλετε να μάθετε πώς να εκτελέσετε τον παραπάνω κώδικα στην ... print(letter) αPython 2 μπορείτε να δηλώσετε ότι το \"Καλημέρα\" είναι unicode με έναν ααπό δυο τρόπους:>>> day = unicode(\"Καλημέρα\",'utf8') Συναρτήσεις και Αρθρώματα>>> print day[0] Οι συναρτήσεις είναι μπλοκ εντολών που εκτελούνται ως σύνολο ότανΚ καλούνται. Οι συναρτήσεις στη Python ορίζονται ως εξής:>>> day = u\"Καλημέρα\">>> print day[1] def function_name(parameters):α body>>> print day[4:8] όπου οι παράμετροι μπορεί να είναι οποιονδήποτε τύπου δεδομένων (π.χ.μέρα αλφαριθμητικό, λίστα κλπ.)Υποστηρίζονται οι ακόλουθες συναρτήσεις: Ας δούμε μια συνάρτηση η οποία βρίσκει αν μια λέξη είναι παλινδρομική.>>> length = len(day) Κατ’ αρχήν, θα πρέπει να βρούμε την αντίστροφη της λέξης (text):>>> print(length)8 def reverse(text):>>> print(day.lower()) reversedtext = []καλημέρα for i in range(len(text)-1, -1, -1):>>> day.islower() reversedtext.append(text[i])False return ''.join(reversedtext)>>> print(day.upper())ΚΑΛΗΜΈΡΑ Υπάρχουν πολλοί τρόποι για ν’ αντιστρέψουμε μια λέξη, όπως μπορείτε να>>> day.isupper()False βρείτε στο διαδίκτυο, π.χ. ένας πιο σύντομος κάνει χρήση της συνάρτησης>>> print(day.find(\"μέρα\")) # σε ποια θέση;4 reversed():>>> print(day[4:len(day)]) # substring ''.join(list(reversed(text))) ένας άλλος είναι text[::-1]. Ας δούμε όμως αυτήν που γράψαμε παραπάνω. Η λέξη text περνιέται ως παράμετρος στη συνάρτηση reverse(). Η range() επιστρέφει τουςμέρα αριθμούς από το μήκος της λέξης παρά ένα, μέχρι το -1, δηλ. αντίστροφα.>>> s = \"Καλημέρα φίλε!\"
Οι χαρακτήρες ένας-ένας επισυνάπτονται στη λίστα reservedtext ενώ η ... number += 1 ... lst.append(1)τελευταία εντολή μετατρέπει τη λίστα σε αλφαριθμητικό. ... return number, lstΠλέον, η παλινδρομική συνάρτηση μπορεί να γραφτεί πολύ εύκολα ως: ... >>> number = 5def isPalindrome(text): >>> lst = ['Hallo'] return text == reverse(text) >>> number, lst = add1(number, lst) number= 6Αν θέλουμε να την τεστάρουμε: lst=['Hallo',1] >>> number>>> print('Is \'cat\' palindrome? ' + 6str(isPalindrome('cat'))) >>> lstFalse lst=['Hallo',1]>>> print('Is \'abba\' palindrome? ' + Η σειρά των παραμέτρων έχει σημασία, αλλά μπορούμε να τουςstr(isPalindrome('abba')))True αλλάξουμε τη σειρά όπως στο παρακάτω παράδειγμα:Προσοχή θέλει αν τα ορίσματα περνούν ως αναφορά ή ως τιμή: >>> def process(text, word):>>> def add1(number, lst): ...... number += 1... lst.append(1) >>> process('Hallo world!', 'world')... print('number= ', number) >>> process(word='world', text='Hallo world!')... print('lst= ', lst) Οι παράμετροι μπορούν να λάβουν και εξ’ ορισμού τιμές, π.χ....>>> number = 5 >>> def process(text, word=''):>>> lst = ['Hallo'] ...>>> add1(number, lst)number= 6 >>> process('Hallo world!') # η word = ''lst=['Hallo',1] Αν ο αριθμός των ορισμάτων που περνάμε είναι μεγαλύτερος από τον>>> number5 αριθμό των παραμέτρων, τότε μπορούμε να δηλώσουμε την τελευταία>>> lst παράμετρο με ένα * ώστε τα υπόλοιπα ορίσματα να αποθηκευθούν σ’lst=['Hallo',1]Όπως και σε άλλες γλώσσες προγραμματισμού, η μεταβλητή λίστας είναι αυτήν ως πλειάδα ή με ** για ν’ αποθηκευθούν ως λεξικό: >>> def process(*args):μια διεύθυνση μνήμης όπου μπορεί να βρεθεί η λίστα, άρα περνιέται ως ... return argsαναφορά και άρα μεταβάλλεται η θέση μνήμης. Αντιθέτως, η number >>> process('This', 'is', 'a', 'test')περνιέται ως τιμή, επομένως, παρόλο που και μέσα στη συνάρτηση ('This', 'is', 'a', 'test')ορίζεται μια μεταβλητή με το ίδιο όνομα, αυτή δεν έχει καμιά σχέση με >>> watch = ['Seiko', 455, 5]την εξωτερική μεταβλητή. Αν θέλουμε όμως σώνει και καλά ν’ αλλάξουμε >>> process(watch) (['Seiko', 455, 5],)την τιμή μιας μεταβλητής αμετάβλητου τύπου όπως int, μπορούμε να >>> process(*watch)κάνουμε το εξής: lst): ('Seiko', 455, 5)>>> def add1(number,
>>> def process(**args): χωρίς συνθήκη διακοπής το πρόγραμμα μπαίνει σε ατέρμονα βρόγχο.... return args>>> process(brand='Seiko', price=455, guarantee=5) Δημιουργήστε ένα νέο αρχείο factorial.py:{'guarantee': 5, 'brand': 'Seiko', 'price': 455} #!/usr/bin/env python3>>> watch = {'brand': 'Seiko', 'price': 455, def factorial(n):'guarantee': 5}>>> process(**watch) if n = 0:{'guarantee': 5, 'brand': 'Seiko', 'price': 455} return 1>>> process(watch) else: return n*factorial(n-1)Traceback (most recent call last): print(\"5!=%d\" % factorial(5))File \"<stdin>\", line 1, in <module> print(\"0!=%d\" % factorial(0))TypeError: process() takes 0 positional arguments but και εκτελέστε το:1 was givenΟι συναρτήσεις είναι κι αυτές αντικείμενα στην Python, οπότε μπορούν να $ chmod u+x factorial.py $ ./factorial.pyπεραστούν με τη σειρά τους ως ορίσματα σε άλλες συναρτήσεις! 5!=120>>> def inGreek(): 0!=1... return 'Καλημέρα!' Η Python υποστηρίζει και συναρτησιακό προγραμματισμό, δηλ. λ-... εκφράσεις:>>> def inFrench():... return 'Bonjour!' >>> pow = lambda x: x ** 2 = x2 και της δίνει το... >>> pow(3) για να φιλτράρει το>>> def sayGoodMorning(lang, f): 9... print('Good morning in ', lang, ' is ', f()) Η παραπάνω έκφραση δηλώνει τη συνάρτηση: f(x)...>>> sayGoodMorning('Greek!', inGreek) όνομα pow. Είναι σα να γράφαμε:Good morning in Greek is Καλημέρα! >>> def pow(x):Φυσικά υποστηρίζεται και η αναδρομή. Μια συνάρτηση (υποπρόγραμμα) >>> return x ** 2 >>> pow(3)λέγεται αναδρομική όταν μπορεί και καλεί τον εαυτό της. Ας δούμε ένα 9 Η Python υποστηρίζει και filter-map-reduce6.παράδειγμα, τον υπολογισμό του παραγοντικού ενός φυσικού αριθμού n: Η συνάρτηση filter() δέχεται μια λ-έκφραση • Αν n=0 τότε n! = 1 δεύτερο όρισμά της:• Αν n>0 τότε n! = n*(n-1)! >>> my_list = range(10)Από τα παραπάνω βλέπουμε ότι για να υπολογίσουμε το παραγοντικό του >>> filter(lambda x: x % 2 == 0, my_list)n θα πρέπει πρώτα να υπολογίσουμε το παραγοντικό του n-1. Για να [0, 2, 4, 6, 8]υπολογίσουμε το παραγοντικό του n-1 χρειάζεται πρώτα να υπολογίσουμε Στην Python 2 επιστρέφει λίστα, στην Python 3 όμως επιστρέφει ένατο παραγοντικό του n-2 κ.ο.κ. μέχρις ότου φθάσουμε σε μια συνθήκη όπου αντικείμενο τύπου filter που θα πρέπει να μετατραπεί σε λίστα:μπορούμε να υπολογίσουμε το παραγοντικό, η οποία λέγεται συνθήκηδιακοπής, και στο παραπάνω παράδειγμα είναι το 0!=1. Σημειώστε ότι 6 http://www.bogotobogo.com/python/python_fncs_map_filter_reduce.php
>>> my_list = range(10) χώροι ονομασίας (namespaces) της C++. Όπως οι συναρτήσεις μας>>> list(filter(lambda x: x % 2 == 0, my_list)) βοηθούν να οργανώνουμε τον κώδικά μας σε μπλοκ, τα αρθρώματα μας[0, 2, 4, 6, 8] βοηθούν να οργανώνουμε τις συναρτήσεις μας σε βιβλιοθήκες, ακόμα καιΠαρατηρήστε ότι η λ-έκφραση που περνάμε στη filter() πρέπει να να επεκτείνουμε την ίδια τη γλώσσα. Μπορούν να είναι υπό τη μορφήεπιστρέφει τύπο bool.Η map() μετατρέπει κάθε στοιχείο του 2ου ορίσματός της σύμφωνα με τη πηγαίου κώδικα (.py) ή μεταγλωττισμένου κώδικα (.pyc) ή ακόμα καιλ-έκφραση: δυναμικής βιβλιοθήκης (.so). Όπως το PATH και το CLASSPATH, έτσι κι η Python διαθέτει την PYTHONPATH για να αναζητεί βιβλιοθήκες (βλ.>>> map(lambda x: x ** 2, my_list) # python2 αρθρώματα).[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]>>> list(map(lambda x: x**2, my_list) # python3 Η γλώσσα διαθέτει μια μεγάλη γκάμα από αρθρώματα για όλες σχεδόν τις[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Τέλος, η reduce() μετατρέπει τη λίστα σ’ ένα μόνο στοιχείο (στο δουλειές όπως μπορείτε να δείτε εδώ. Για να μπορέσετε ναακόλουθο παράδειγμα προσθέτει όλα τα στοιχεία της λίστας): χρησιμοποιήσετε τις συναρτήσεις ενός αρθρώματος θα πρέπει πρώτα να>>> reduce(lambda x,y: x + y, my_list) # python245 το εισάγετε στο πρόγραμμά σας:>>> import functools # python3>>> functools.reduce(lambda x,y: x + y, my_list) >>> import math >>> print math.sqrt(25) 5.0 Η εντολή import είναι παρόμοια με την import της Java ή την include45 της C/C++. Η συνάρτηση sqrt() δηλώνεται στο άρθρωμα math το οποίοΤο παραπάνω μοντέλο προγραμματισμού είναι ιδιαίτερα χρήσιμο όπως πρέπει να εισάγουμε στο πρόγραμμά μας με την εντολή import.φαίνεται στο ακόλουθο πιο ρεαλιστικό παράδειγμα. Ας υποθέσουμε ότι τα Μπορούμε όμως να γίνουμε και πιο συγκεκριμένοι, αν θέλουμε μόνο τηνδεδομένα προέρχονται από μια βάση δεδομένων και αποθηκεύονται στη sqrt(): >>> from math import sqrtλίστα από λεξικά data:>>> data =[ >>> print sqrt(25){'προϊόν': 'πληκτρολόγιο', 'τιμή': 26, 'ποσότητα': 2}, 5.0{'προϊόν': 'ποντίκι', 'τιμή': 12, 'ποσότητα': 2}, Ας δούμε μερικά παραδείγματα ακόμα:{'προϊόν': 'mousepad', 'τιμή': 5, 'ποσότητα': 3} ] >>> max(25, -5, 12, 30)Θα θέλαμε να υπολογίσουμε το συνολικό ποσό που θα πρέπει να 30 >>> abs(-12)πληρώσει ο πελάτης. Κατ’ αρχήν θα θέλαμε να αφήσουμε μόνο τα σχετικά 12 δικά μας αρθρώματα ως εξής (mod1.py): Μπορούμε να ορίσουμε και ταπεδία: \"\"\">>> l = list(map(lambda x: [x['τιμή'], x['ποσότητα']], A simple moduledata)) \"\"\">>> print(l) name = \"Simple Module\"[[26, 2], [12, 2], [5, 3]] def printe(s, count): print(s * count)Τα αρθρώματα (modules) είναι σαν τα πακέτα (packages) της Java ή οι και το εκτελούμε κατά τα γνωστά:
>>> import mod1 16:5:40>>> print(mod1.name)Simple Module Αρχεία>>> mod1.printe('Hallo Python', 2) Αν έχετε βαρεθεί να εμφανίζετε τ’ αποτελέσματα στην οθόνη τότε ηHallo PythonHallo Python>>> dir(mod1) Python (όπως και οι περισσότερες γλώσσες προγραμματισμού) έχει τη['__builtins__', '__cached__', '__doc__', '__file__','__loader__', '__name__', '__package__', '__spec__', λύση:'name', 'printe']Εδώ είναι μια λίστα με αρθρώματα της Python. Πολύ χρήσιμη είναι η >>> f = open(\"output.txt\", \"w\")στάνταρ βιβλιοθήκη (standard library) η οποία είναι μια συλλογή από >>> f.write(\"Από την πόλη έρχομαι\nκαι στην κορυφήχρήσιμες συναρτήσεις (όχι μέρος της γλώσσας αυτής καθαυτής), όπως: κανέλλα.\") >>> f.close() • Διαχείριση αρχείων/φακέλων (os) Στο παραπάνω παράδειγμα ανοίγουμε ένα αρχείο στον τρέχοντα φάκελο • Πρόσβαση βάσεων δεδομένων (π.χ. MySQLdb) για εγγραφή (\"w\")7, γράφουμε μια πρόταση και δεν ξεχνάμε να το κλείσουμε. Αν ανοίξετε το αρχείο output.txt θα δείτε την παραπάνω• Ημερομηνία και Ώρα (datetime) παροιμία. Είναι πολύ σημαντικό να μην ξεχάσετε να κλείσετε το αρχείο,• Κανονικές Εκφράσεις (Regular Expressions) (glob, re) καθώς τότε γράφονται τα δεδομένα σ’ αυτό. Επίσης αφήνοντας αρχεία• εργαλεία συμπίεσης ανοιχτά σπαταλάτε άσκοπα πόρους του συστήματός σας. Αν θέλετε να μεταφέρετε τα δεδομένα από τον buffer στο αρχείο χωρίς όμως νακ.ά. κλείσετε το αρχείο, χρησιμοποιήστε την flush(). Μπορούμε να ανοίξουμε ένα αρχείο με διάφορους τρόπους: \"r\" (ανάγνωση), \"w\"Ημερομηνία και Ώρα (εγγραφή), \"r+\" (ανάγνωση και εγγραφή), \"a\" (επισύναψη). ΓιαΗ Python διαθέτει φυσικά μια βιβλιοθήκη για διαχείριση ημερομηνίας και δυαδικό αρχείο προσθέτετε \"b\", π.χ. \"wb\".ώρας. >>> f = open(\"output.txt\", \"r\")>>> from datetime import datetime >>> print f.read() Από την πόλη έρχομαι>>> now = datetime.now()>>> print now και στην κορυφή κανέλλα. >>> f.close()2016-10-16 16:03:13.392686>>> print now.year Η read() διαβάζει ολόκληρο το αρχείο και το επιστρέφει ως ένα2016 αλφαριθμητικό. Αν θέλουμε να το διαβάσουμε γραμμή-γραμμή τότε>>> print now.month10 χρησιμοποιούμε τη readline(). Μπορούμε επίσης να>>> print now.day χρησιμοποιήσουμε την readlines() η οποία το επιστρέφει ως λίστα από16 αλφαριθμητικά (κάθε γραμμή αποτελεί ένα στοιχείο της λίστας). Η>>> print '%s/%s/%s' % (now.day, now.month, now.year)16/10/2016 rstrip(), τέλος, διαγράφει το χαρακτήρα '\n' αν αυτός περιέχεται στο>>> print '%s:%s:%s' % (now.hour, now.minute, αλφαριθμητικό. Αντίστοιχα, για να γράψουμε σ’ ένα αρχείο χρησιμοποιούμε είτε την write(), που είδαμε πιο πάνω, είτε τηνnow.second) 7 Το f λέγεται διαχειριστής αρχείου (file handler)
writelines() που γράφει μια λίστα αλφαριθμητικών στο αρχείο. Όπως είπαμε, η Python είναι και μια αντικειμενοστραφής γλώσσαΓια να μην ξεχνάτε να κλείνετε τα αρχεία, χρησιμοποιήστε την ακόλουθη προγραμματισμού, δηλ. υποστηρίζει κλάσεις κι αντικείμενα. Μια κλάσησύνταξη η οποία κλείνει αυτόματα το αρχείο για σας: αποτελείται από μεταβλητές και συναρτήσεις (που καλούνται μέθοδοι) ωςwith open(\"output.txt\", \"w\") as f: μια οντότητα. Ο αντικειμενοστραφής προγραμματισμός μας βοηθάει ναf.write(\"Μια πάπια μα ποια πάπια!\") αντιστοιχίσουμε μια αφαίρεση των αντικειμένων της πραγματικότητας στηΜπορούμε να τσεκάρουμε αν ένα αρχείο είναι ανοικτό με την ιδιότητα γλώσσα προγραμματισμού. Η σύνταξη έχει ως εξής:closed (π.χ. f.closed). class name(superclass):with open(\"output.txt\", \"r\") as f: def __init__(παράμετροι):for line in f: ... line.rstrip() def method(παράμετροι):Κάθε φορά που διαβάζουμε ή γράφουμε σ’ ένα αρχείο μετακινεί τη θέση ...ενός δρομέα μέσα στο αρχείο (μετριέται σε bytes από την αρχή του Ας δούμε ένα παράδειγμα:αρχείου). Η μέθοδος tell() επιστρέφει την τρέχουσα θέση του δρομέα class Car(object): def __init__(self, mark, maxspeed, ccm, color,σε bytes από την αρχή του αρχείου, ενώ η seek(n, start) μετακινεί doors):το δρομέα n bytes από τη θέση start η οποία μπορεί να έχει μια από τις self.mark = markπαρακάτω τιμές: 0 (os.SEEK_SET): αρχή του αρχείου, 1 (os.SEEK_CUR) self.maxspeed = maxspeedτρέχουσα θέση, 2 (os.SEEK_END) τέλος του αρχείου. self.ccm = ccmΗ οθόνη και το πληκτρολόγιο μπορούν να θεωρηθούν κι αυτά “αρχεία”: self.color = color• sys.stdin: standard input (πληκτρολόγιο) self.doors = doors• sys.stdout: standard output (οθόνη) self.speed = 0 • sys.stderr: standard error (συνήθως οθόνη) def __str__(self): return \"%s: %d km/h, %d ccm, %s, %d θύρες\" %Π.χ.originalErr = sys.stderr (self.mark, self.maxspeed, self.ccm, self.color,sys.stderr = open('error.log', 'a') self.doors)sys.stderr.writeline('ERROR') Όλες οι κλάσεις μπορούν να κληρονομούν από την κλάση object.8ή πιο εύκολα: Η συνάρτηση __init__() ονομάζεται κατασκευαστής (constructor) και είναι η πρώτη που καλείται όταν πρόκειται να κατασκευάσουμε έναprint('ERROR') >> sys.stderrΓια να διαχειριστείτε δυαδικά αρχεία, υπάρχουν δυο χρήσιμες βιβλιοθήκες αντικείμενο της κλάσης μας. Για να καταλάβουμε ποια η διαφορά μεταξύπου θα μπορούσατε να κοιτάξετε: κλάσης και αντικειμένου ας δούμε το παρακάτω τμήμα κώδικα: • η pickle επιτρέπει την ανάγνωση/αποθήκευση δομών δεδομένων όπως λίστες, πλειάδες κλπ. με τις εντολές load()/dump() >>> toyota_yaris = Car('Toyota Yaris', 180, 999, 'white', 5) • η shelve η οποία επιτρέπει την απευθείας ανάγνωση/αποθήκευση >>> subaru_impreza = Car('Subaru Impreza', 220, 1989,λεξικών σε αρχεία 'blue', 2)Κλάσεις 8 Οπότε μπορεί και να παραληφθεί, δηλ. class Car:
Ορίζουμε δυο αντικείμενα τύπου Car, το toyota_yaris και το >>> toyota_yaris.accelerate(20)subaru_impreza. Μπορούμε να πούμε ότι η κλάση Car είναι μια μήτρα >>> print(\"Ταχύτητα: %d km/h\" % toyota_yaris.speed) Ταχύτητα: 20 km/hαπό την οποία μπορούμε να δημιουργήσουμε όσα αντικείμενα τύπου Car >>> toyota_yaris.accelerate(-10)θέλουμε. Όταν γράφουμε την παραπάνω εντολή, καλείται ο >>> print(\"Ταχύτητα: %d km/h\" % toyota_yaris.speed) Ταχύτητα: 10 km/hκατασκευαστής της κλάσης, δηλ. η συνάρτηση __init__(). Όλες οι >>> toyota_yaris.accelerate(-20)μέθοδοι στη Python δέχονται ως πρώτη παράμετρο την self η οποία Λάθος επιτάχυνση -20 km/hδηλώνει το αντικείμενο που δημιουργούμε κάθε φορά και χρησιμοποιείταικαι για να ξεχωρίσουμε τις μεταβλητές (ιδιότητες) του αντικειμένου από >>> print(\"Ταχύτητα: %d km/h\" % toyota_yaris.speed)τις παραμέτρους όταν έχουν το ίδιο όνομα. Παρατηρήστε ότι δε χρειάζεται Ταχύτητα: 10 km/hνα περάσουμε την παράμετρο self ως όρισμα στις παραπάνω μεθόδους Οι ιδιότητες κλάσης ή στατικές ιδιότητες μιας κλάσης ορίζονται ως:από τα αντικείμενα. class Car: ...Μπορούμε να εμφανίσουμε τις ιδιότητες του αντικειμένου ως εξής: availableColors = ('black', 'blue', 'red',>>> print(\"Ταχύτητα: %d km/h\" % toyota yaris.speed) 'white')Ταχύτητα: 0 km/h>>> print(toyota_yaris) ...Toyota Yaris: 180 km/h, 999 ccm, white, 5 θύρες Αυτές είναι κοινές για όλα τα αντικείμενα της κλάσης. Αντίστοιχα, οιΗ τελευταία εντολή καλή την ειδική συνάρτηση __str__() η οποία είναι μέθοδοι κλάσης ή στατικές μέθοδοι ορίζονται περνώντας cls ως πρώτηπαρόμοια με την toString() της Java, δηλ. επιστρέφει μια παράμετρο: class Car:αναπαράσταση του αντικειμένου ως αλφαριθμητικό.Μπορούμε επίσης να ορίσουμε κι άλλες συναρτήσεις (ονομάζονται ... counter = 0μέθοδοι) στην κλάση Car: def productionCounter(cls, n):class Car: cls.counter = n... ... Ας υποθέσουμε τώρα ότι η εφαρμογή μας αντί μόνο για αυτοκίνητα θα def accelerate(self, speed_factor): if speed_factor > 0 and (self.speed + πρέπει να διαχειρίζεται και φορτηγά και λεωφορεία. Επειδή όλες αυτέςspeed_factor) <= self.maxspeed: έχουν κάποια κοινά χαρακτηριστικά, και λόγω της αρχής του να μην self.speed += speed_factor επαναλαμβάνεσαι (DRY – Don’t Repeat Yourself) που ισχύει στον elif speed_factor < 0 and (self.speed +speed_factor) >= 0: προγραμματισμό, μπορούμε να εφαρμόσουμε ένα χαρακτηριστικό του self.speed += speed_factor else: αντικειμενοστραφούς προγραμματισμού που λέγεται κληρονομικότητα print(\"Λάθος επιτάχυνση: %d km/h\" % ή να (inheritance). Δημιουργούμε λοιπόν την κλάση Vehicle: ccm,speed_factor) class Vehicle:Η μέθοδος accelerate() επιτρέπει στο αυτοκίνητο να επιταχύνει def __init__(self, type, mark, maxspeed,επιβραδύνει ανάλογα του αν η παράμετρος που του περνάμε είναι θετική ή color, doors, speed):αρνητική: self.mark = mark self.type = type
self.maxspeed = maxspeed ... self.ccm = ccm bicycle (Hybrid): 25 km/h, 0 ccm, green, 0 θύρες self.color = color Toyota Yaris (car): 180 km/h, 999 ccm, white, 5 θύρες self.doors = doors Η print() καλεί, όπως είπαμε, την σωστή __str__() κάθε φορά, self.speed = 0 ανάλογα με τον τύπο του αντικειμένου. Μια κλάση μπορεί να υπερκαλύψει οποιαδήποτε από τις ειδικές μεθόδους όπως π.χ. __str__(), def __str__(self): __repr__(), η οποία είναι παρόμοια με την __str__(), ή __add__() η return \"%s (%s): %d km/h, %d ccm, %s, %d οποία αντιστοιχεί στην πράξη +. Π.χ. (MyList.py) #!/usr/bin/env python3θύρες\" % (self.mark, self.type, self.maxspeed, class MyList:self.ccm, self.color, self.doors) def __init__(self, aList): def accelerate(self, speed_factor): self.aList = aList ...οπότε η κλάση Car μπορεί να γραφτεί ως: def __add__(self, value):class Car(Vehicle): retList = [] def __init__(self, mark, maxspeed, ccm, color, for e in self.aList:doors): retList.append(e + value) return retList Vehicle.__init__(self, \"car\", mark, maxspeed,ccm, color, doors, 0) def __str__(self): def __mul__(self, value): return Vehicle.__str__(self) retList = [] for e in self.aList:Μέσα στις παρενθέσεις δηλώνουμε την υπερ-κλάση (super class) από την retList.append(e * value) return retListοποία κληρονομεί η κλάση μας. Επίσης, όταν θέλουμε να καλέσουμε μιαμέθοδο της υπερ-κλάσης μας, φροντίζουμε να γράφουμε και την κλάσηπριν, π.χ. Vehicle.__init__(). Η υπο-κλάση κληρονομεί όλες τις lst = [20, 30, 40]ιδιότητες και τις μεθόδους της υπερ-κλάσης (δεν υπάρχουν περιορισμοί mylst = MyList(lst)όπως σε άλλες γλώσσες). Όταν ξανα-υλοποιούμε μια μέθοδο στην print(lst, '+ 5 = ', mylst + 5)υποκλάση, λέμε ότι την υπερκαλύπτουμε (override) και αυτό είναι μια print(lst, '* 5 = ', mylst * 5)ιδιότητα των αντικειμενοστραφών γλωσσών που λέγεται πολυμορφισμός. υπερκαλύπτει την εξ’ ορισμού συμπεριφορά των τελεστών + και * για λίστες:vehicles = [ Vehicle('Hybrid', 'bicycle', 25, 0,'green', 0, 0), Car('Toyota Yaris', 180, 999, 'white', $ ./MyList.py5)] [20, 30, 40] + 5 = [25, 35, 45] [20, 30, 40] * 5 = [100, 150, 200]for v in vehicles:print(v) Μπορούμε να ορίσουμε και αφηρημένες (abstract) κλάσεις αφήνονταςκαι το αποτέλεσμα: κάποιες μεθόδους προς υλοποίηση από τις υποκλάσεις, π.χ.:$ ./vehicle.py class Vehicle():
... 3. Γράψτε τη δική σας ναυμαχία. Ο παίχτης έχει 10 προσπάθειες γιαdef accelerate(self, speed_factor): να βυθίσει το πλοίο που βρίσκεται σε μια τυχαία θέση μιας μήτρας passΑν θέλουμε να καλέσουμε κάποια μέθοδο της υπερκλάσης από την 5x5. Χρησιμοποιήστε τη συνάρτηση randint(start, stop) από το άρθρωμα random. Θα πρέπει να προσέξετε ώστε ο παίκτηςυποκλάση, τότε χρησιμοποιούμε την παραπάνω σύνταξη: να μην εισάγει τις ίδιες συντεταγμένες περισσότερες από μια φορέςclass Car(Vehicle): καθώς και να εισάγει έγκυρες συντεταγμένες. ... def acc(self): OOOOO return super(Car,self).accelerate(10) OOOOO OOOOOη οποία στην Pyhon3 μπορεί να γραφτεί και πιο απλά: OOOOO OOOOO def acc(self): return super().accelerate(10)Το πλεονέκτημα με το να γράψουμε: Γραμμή: 2return Vehicle.accelerate(10) Στήλη: 3είναι ότι αν αργότερα αλλάξουμε την υπερκλάση από Vehicle σε κάποια Αστόχησες! Έχεις ακόμα 9 προσπάθειες...άλλη δεν χρειάζεται ν’ αλλάξουμε τη μέθοδο.Η Python, τέλος, υποστηρίζει πολλαπλή κληρονομικότητα, π.χ. OOOOO OOOOOclass Amphibian(Vehicle, Boat):... O O O X O OOOOOΑσκήσεις OOOOO 1. Γράψτε μια συνάρτηση skip_vowels(text) η οποία θα Γραμμή: 4 επιστρέφει τη φράση που της περνάμε χωρίς φωνήεντα, π.χ. Στήλη: 2 Συγχαρητήρια! Βύθισες το πλοίο!>>> print skip_vowels('Όλα καλά;')λ κλ; 4. Δημιουργήστε μια συνάρτηση replace(text, word) η οποία αντικαθιστά όσες φορές βρει τη word στο text με *. 2. Το Σκραμπλ (Scrabble) είναι ένα παιχνίδι όπου οι παίκτες παίρνουν 5. Προσπαθήστε να λύσετε όσες περισσότερες ασκήσεις μπορείτε πόντους συλλαβίζοντας λέξεις. Το σκορ κάθε λέξης υπολογίζεται από το Project Euler σε Python. προσθέτοντας τα σκορ καθενός γράμματος. Γράψτε μια συνάρτηση 6. Δημιουργήστε μια κλάση Triangle με μια στατική μεταβλητή scrabble_score() που παίρνει ως παράμετρο μια λέξη και number_of_sides = 3, τη μέθοδο κατασκευής να δέχεται ως επιστρέφει το ισοδύναμο σκραμπλ σκορ γι’ αυτή τη λέξη. Τα σκορ ορίσματα τις 3 γωνίες του τριγώνου και μια μέθοδο για τα ελληνικά γράμματα (ξεχάστε τους τόνους) δίνονται check_angles() η οποία να επιστρέφει True αν το άθροισμα των γωνιών είναι 180, διαφορετικά False. Επίσης μια υποκλάση παρακάτω: της, Equilateral με μια στατική μεταβλητή angle = 60 στηscore = {\"α\":1,\"β\":8,\"γ\":4,\"δ\":4,\"ε\":1,\"ζ\":10, \"η\":1,\"θ\":10,\"ι\":1,\"κ\":2,\"λ\":3,\"μ\":3, \"ν\":1,\"ξ\":10,\"ο\":1,\"π\":2,\"ρ\":2,\"σ\":1,\"ς\":1, μέθοδο κατασκευής της οποίας θα καλείται την μέθοδο \"τ\":1,\"υ\":2,\"φ\":8,\"χ\":8,\"ψ\":10,\"ω\":3}
κατασκευής της υπερκλάσης περνώντας τρεις φορές τη γωνία 11. Programming for Everybody (Getting Started with Python), angle. Προσθέστε μεθόδους για να υπολογίσετε την περίμετρο Coursera. και το εμβαδό των παραπάνω. 12. Learn Python the Hard WayΕπίλογος 13. Barry P. (2011), Head First Python, O’Reilly.Σ’ αυτό το άρθρο δώσαμε μια σύντομη περιγραφή της γλώσσας 14. Barry P. & Griffiths D. (2009), Head First Programming, O’Reilly.προγραμματισμού Python. Η Python είναι μια αντικειμενοστραφής, 15. Briggs A. (2012), Hello Python, Manning.δυναμική, μεταφραστική γλώσσα προγραμματισμού. Είδαμε πως μπορούμε 16. Lutz M. (2013), Learning Python, 5th Ed., O’Reilly.να γράψουμε προγράμματα τόσο στην Python 2 όσο και στην Python 3. 17. Lutz M. (2014), Python Pocket Reference, O’Reilly.Αν θέλετε να γράψετε προγράμματα που θα χρησιμοποιούν ελληνικούς 18. Matthes E. (2016), Python Crash Course, No Starch Press.χαρακτήρες, προτιμήστε την έκδοση 3. 19. Payne J. (2010), Beginning Python, Wrox, Wiley.Μέχρι τώρα είδαμε τα πολύ βασικά χαρακτηριστικά της γλώσσας. Αν 20. Sweigart A. (2015), Automate the Boring Stuff with Python, Noθέλετε να εντρυφήσετε περαιτέρω θα πρέπει να μάθετε για τις πολλέςβιβλιοθήκες της γλώσσας π.χ. για πρόσβαση στο σύστημα αρχείων είτε Starch Press.στις βάσεις δεδομένων κ.ά. Μπορείτε να δημιουργήσετε γραφικά 21. Walters G. (2016), “The Python Collection, Full Circle Magazineπεριβάλλοντα με χρήση του wxPython ή του Tkinter καθώς καιεφαρμογές ιστού με το Django που ίσως δούμε σε μελλοντικά άρθρα. Python Special Edition, Vol. 1, Full Circle.Ο ενδιαφερόμενος αναγνώστης καλείται να ανατρέξει στην ιδιαίτεραπλούσια βιβλιογραφία για να εντρυφήσει πάνω στο αντικείμενο καιιδιαίτερα στο διαδραστικό περιβάλλον εκμάθησης της Codecademy.Πηγές: 1. The Python Tutorial. 2. A Byte of Python στα ελληνικά ή A Byte of Python στα αγγλικά 3. Python course. 4. A Gentle Introduction to Programming Using Python, MIT Open Courseware. 5. Learn Python, Codecademy. 6. Dive Into Python 7. Google's Python Class 8. Intro to Computer Science, Udacity. 9. An Introduction to Interactive Programming in Python, Part 1 & Part 2, Coursera. 10. Python Programming: A Concise Introduction, Coursera.
Search
Read the Text Version
- 1 - 20
Pages: