Γλώσσες Προγραμματισμού Εφαρμογών Εισαγωγή - Διάλεξη 1 Παπαϊωάννου Αθανάσιος Π.Μ.Σ. «Εφαρμοσμένη Πληροφορική» Χειμερινό Εξάμηνο 20 16-20 17
Python είναι η γλώσσα του μεταφραστή Python και αυτών οι οποίοι μπορούν να επικοινωνήσουν μ αυτή Ένα άτομο το οποίο μπορεί να μιλήσει Python είναι γνωστό σαν Pythonista Σχεδόν όλοι οι γνωστοί Pythonistas χρησιμοποιούν λογισμικό το οποίο αρχικά αναπτύχθηκε από τον Guido van Rossum
Δυο Λόγια για τον Διδάσκοντα 20 ετής εμπειρία στον προγραμματισμό JAVA, C, C++, MATLAB, Python, Javascript Διδασκαλία σε Οικονομικό Πανεπιστήμιο Αθηνών και Πολυτεχνείο Λωζάνης Διεξαγωγή έρευνας από το 1998 Περισσότερες από 55 δημοσιεύσεις, πάνω από 850 ετεροαναφορές Ε-mail: atpapaioannou@inf.uth.gr Ώρες γραφείου: υπό ορισμό (στείλτε μου e-m ail)
Γιατί Python Εύκολη εκμάθηση, αλλά πανίσχυρη Δίνει έμφαση στην αναγνωσιμότητα Πολύ καλή τόσο ως γλώσσα πρωτοτύπων (scripting) / διασύνδεσης όσο και για την ανάπτυξη πλήρως ανεπτυγμένων εφαρμογών "Κλίμακώνεται με την ικανότητα του προγραμματιστή" Κατάλληλη για ταχεία προτυποποίηση (rapid prototyping)
Προβλεψιμότητα Τα λάθη δεν πρέπει ποτέ να «παιρνούν» σιωπηλά Εκτός αν τα σιγήσουμε επίτηδες Σε περίπτωση αμφιβολίας, μην μπείτε στον πειρασμό να μαντέψετε Θα πρέπει να υπάρχει ένας και προτιμότερα μοναδικός- προφανής τρόπος για να κάνετε κάτι στην Python
Πρακτικότητα Τώρα είναι καλύτερα από πολύ αργότερα Παρόλο που ποτέ είναι συχνά καλύτερα από τώρα αμέσως Αν η υλοποίηση είναι δύσκολο να εξηγηθεί, τότε είναι κακή ιδέα Αν είναι εύκολο να εξηγηθεί, τότε μάλλον είναι καλή ιδέα Τα πεδιά ονομάτων (namespaces) είναι πολύ καλή ιδέα ομαδοποίησης Θα τα δούμε στην πορεία
Ανάπτυξη Λογισμικού Ο χρόνος για μια λύση λογισμικού καθορίζεται από το χρόνο για τον προγραμματισμό του (ανθρωποώρες) το χρόνο που το πρόγραμμα κάνει να εκτελεστεί (χρόνος μηχανής) Κάθε γλώσσα έχει γραφτεί με μια αντιστάθμιση αυτών των δύο χαρακτηριστικών: Java C C++ Perl MATLAB
Χρόνος Ανάπτυξης Λογισμικού Ο χρόνος αυξανεται εκθετικά όσο προχωρούν οι φάσεις ανάπτυξης του προγράμματος Τέτοια μορφή καμπύλης κόστους ισχύει και για διόρθωση σφαλμάτων!
Που εντάσσεται η Python; Γλώσσα υψηλού επιπέδου Ενσωματωμένες δομές δεδομένων υψηλού επιπέδου Αντικειμενοστραφής Διερμηνευόμενη γλώσσα Τα προγράμματα δεν μεταφράζονται σε γλώσσα μηχανής πριν την εκτέλεση τους Πλαίσιο εξαιρέσεων με προς-τα-πίσω ιχνηλάτηση λαθών (δεν υπάρχουν segmentation faults) Αυτόματη διαχείριση μνήμης (όχι malloc ή free) Δυναμική ανάθεση τύπων μεταβλητών και δυναμική δεικτοδότηση μεταβλητών στη μνήμη Τεράστια ενσωματωμένη βιβλιοθήκη με όλων των ειδών λειτουργικότητα Εκτελείται σε όλα τα λειτουργικά συστήματα, είναι δωρεάν (και ανοιχτού κώδικα)
Επιπλέον χαρακτηριστικά... Η Python είναι μοναδική και ως προς το ότι διαθέτει: Επεκτασιμότητα (τόσο εγγενη, όσο και δυνατότητα συνδυσμού με άλλες γλώσσες) Ένα πολύ ενεργό οικοσύστημα ανάπτυξης λογισμικού από τρίτους Ευρεία αποδοχή για την ανάπτυξη εφαρμογών web Πολλές βιβλιοθήκες για επιστημονικό προγραμματισμό (bioinform atics, NLP) Πολλές επιλογές για μεγαλύτερη αποδοτικότητα
Βιβλιογραφία Αναφορές Python Tutorial Python for Everybody by Charles Severance Zed Shaw's excellent book, Learn Python the Hard Way, known affectionately as LPTHW Google's Python Class, available on Google Code Intermediate and Advanced Software Carpentry with Python, an online course by C. Titus Brown Dive Into Python, by Mark Pilgrim
Ασκήσεις Θα πρέπει να παρακολουθείτε όλοι τη σελίδα του μαθήματος στο e-class. Θα ανακοινώνονται στη σελίδα του μαθήματος στο e-class. Θα πρέπει να αποστέλλονται έως τις 11:59 μ.μ. της ημέρομηνίας της προθεσμίας τους. Η πρώτη (μικρή) άσκηση θα ανακοινωθεί την επόμενη βδομάδα.. Οι ασκήσεις θα είναι ατομικές. Θα μπορείτε να εκφράζεται απορίες και να ανοίγετε θεμάτα συζητήσεων online σχετικά (χωρίς να λέει ο ένας στον άλλο τη λύση!). Η βαθμολογία των ασκήσεων θα μετρήσει κατά ένα ποσοστό στον τελικό βαθμό του μαθήματος.
Εγκατάσταση Περιβάλλοντος Ανάπτυξης Λογισμικού Για το μάθημα αυτό, θα χρησιμοποιώ τα εξής εργαλεία (τα οποία προτείνω να χρησιμοποιήσετε και εσείς): Python 3.5.2: Η τελευταία έκδοση της Python Eclipse IDE 4.6.0 : Περιβάλλον ανάπτυξης λογισμικού PyDev for Eclipse 5.2.0 : Προσθήκη (plugin) για το Eclipse IDE (http:/ / www.pydev.org/ ) IDLE: Ενσωματωμένο IDE της Python
Εγκατάσταση PyDev στο Eclipse
IDLE
Ο φλοιός της Python Η Python δεν εκτελείται απευθείας από το λειτουργικό σύστημα: αυτό γίνεται από ένα επιπλέον επίπεδο αφαίρεσης, τον διερμηνευτή Python, που ενεργεί σαν μίνι λειτουργικό σύστημα πάνω από το πραγματικό λειτουργικό σύστημα Δεν υπάρχει ξεχωριστό βήμα «μετάφρασης» (com pilation) όπως στις C/ C++/ Java. Απλώς εκτελείς την εντολή python και ξεκινάς να αποτιμάς τον κώδικα του προγράμματός σου >>>print(1+2) 3 >>>print( Hello + World ) HelloWorld
Χρησιμοποιώντας την Python διαδραστικά Καταρχάς, κάποια βασική ορολογία και σημειολογία: Το κείμενο που γράφουμε στην γλώσσα Python (και σε κάθε γλώσσα προγραμματισμού) αναφέρεται γενικά ως πηγαίος κώδικας >>> σημαίνει ότι ο διερμηνευτής περιμένει για την επόμενη εντολή (ή κώδικα) Το ίδιο και το «...» ως συνέχεια του προηγούμενου κώδικα Ο διαδραστικός φλοιός του Idle IDE απλά στοιχίζει αντί να χρησιμοποιεί το «...» Η στοίχιση μετράει, ακόμη και το TAB αντί του SPACE!!! (Θα το δούμε στη συνέχεια)
C:\ Users\ student> python Python 3.5.2 (v3.5.2:4def2a290 1a5, Jun 25 20 16, 22:0 1:18) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more inform ation. >>> Επόμενο?
Σχόλια Ο κώδικας της Python μπορεί να περιέχει σχόλια που αγνοούνται από το διερμηνευτή Ξεκινούν με το χαρακτήρα # Μπορούν να βρίσκονται σε οποιοδήποτε σημείο της γραμμής Έχουν ισχύ έως το τέλος της γραμμής
Η Python σαν αριθμομηχανή Ο φλοιός διερμηνεύει μία-μία τις εντολές της Python που του δίνουμε Οι βασικές αριθμητικές πράξεις είναι μέρος της Python Οπότε, μπορούμε να χρησιμοποιήσουμε την Python σαν αριθμομηχανή # Python 3: Simple arithmetic >>> 1 / 2 0.5 >>> 2 ** 3 8 >>> 17 / 3 # classic division returns a float 5.666666666666667 >>> 17 // 3 # floor division 5
Η Python σαν αριθμομηχανή... Διαθέτει όλες τις βασικές αριθμητικές πράξεις (*,+,-,/,**,%,//) Όμως, αν δώσεις στην Python ακέραιους θα θεωρήσει ότι θέλεις να σου επιστρέψει ακέραιους (int). Για δεκαδικούς, χρησιμοποιούμε αριθμούς με υποδιαστολή. Η Python εμηνεύει κάθε αριθμό με υποδιαστολή ως float. Ο τύπος float είναι η μόνη προσέγγιση πραγματικών αριθμών Υποστηρίζει τους αριθμητικούς τύπους int, long, float, complex Π.χ. 5, 324324L, 15.3, 3.1+5j
Η Python διαθέτει πολλά άλλα πράγματα... Πέρα από βασική αριθμητική, η Python διαθέτει πολλές έτοιμες συναρτήσεις. Μερικές μαθηματικές, όπως η max και η abs. Αλλά και άλλες χρήσιμες συναρτήσεις, όπως η dir και η help Η dir επιστρέφει τη λίστα από τις συναρτήσεις που είναι διαθέσιμες. Η help επιστρέφει πληροφορία σχετικά με μια συνάρτηση ή ένα module (συλλογή από συναρτήσεις που θα δούμε αργότερα).
Ενσωμετωμένο Εγχειρίδιο
Ας μιλήσουμε στη Python...
C:\ Users\ student>p yt ho n Python 3.5.2 (v3.5.2:4def2a290 1a5, Jun 25 20 16, 22:0 1:18) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more inform ation. >>>x = 1 >>> p rin t x 1 >>> x = x + 1 >>> p rin t x Αυτό είναι ένα καλό τεστ για να διαπιστώσετε 2 αν έχετε εγκαταστήσει σωστά την Python. >>> e xit () Σημειώστε ότι το quit() χρησιμεύει επίσης για να τερματιστεί η διαδραστική σας συνεδρία.
Ένα πιο «γραφικό» παράδειγμα
Στοιχεία της Python Λεξιλόγιο / Λέξεις - Μεταβλητές και Κατειλημμένες Λέξεις Δομή πρότασης - έγκυρα πρότυπα σύνταξης Δομή ιστορίας - δημιουργία ενός προγράμματος για κάποιο σκοπό
Προτάσεις ή Γραμμές x = 2 x = x + 2 print(x) Εντολή εκχώρησης Εκχώρηση με έκφραση Εντολή εκτύπωσης Μεταβλητή Τελεστής Σταθερά Κατειλημμένη Λέξη
Σταθερές Σταθερές τιμές όπως νούμερα, γράμματα και σειρές λέγονται σταθερές - επειδή η τιμή τους δεν αλλάζει Αριθμητικές σταθερές είναι όπως τις περιμένεις Σταθερές συμβολοσειρών, χρησιμοποιούν μονά εισαγωγικά (') ή διπλά εισαγωγικά (") >>> print(123) 123 >>> print(98.6) 98.6 >>> print('hello world ) Hello world
Μεταβλητές Μεταβλητή είναι ένα όνομα που αναφέρεται σε μια τιμή Οι μεταβλητές μας επιτρέπουν να αποθηκεύουμε και να επαναχρησιμοποιούμε τιμές σε διάφορα σημεία του κώδικα Γενικά, οι μεταβλητές θα πρέπει πρώτα να δηλώνονται και μετά να αναφέρονται σε τιμές Στην Python η δήλωση και η εκχώρηση τιμής σε μια μεταβλητή γίνεται με μια εντολή εκχώρησης
Κανόνες Ονομάτων Μεταβλητών Πρέπει να ξεκινάνε με ένα γράμμα ή με κάτω παύλα _ Θα πρέπει να αποτελούνται από γράμματα, αριθμούς και κάτω παύλες Παίζουν ρόλο τα κεφαλαία / μικρά Θα πρέπει να είναι μνημονικές (πεζά γράμματα και οι λέξεις διαχωρίζονται με _) Καλό: spam eggs spam23 _speed Κακό: 23spam # sign var.12 Διαφορετικό: spam Spam SPAM
Κατειλημμένες Λέξεις Δεν μπορείς να χρησιμοποιήσεις κατειλημμένες λέξεις σαν ονόματα μεταβλητών / αναγνωριστικών and del for is raise assert elif from lambda return break else global not try class except if or while continue exec import pass yield def finally in print as with
Εντολές Εκχώρισης (I) Μορφή: μεταβλητή = έκφραση Μια έκφραση είναι μια εγκεκριμένη πρόταση στην Python, η οποία μπορεί να αποτιμηθεί Μέχρι τώρα έχουμε δει μαθηματικές εκφράσεις στο διαδραστικό φλοιό της Python και τις είδαμε να αποτιμώνται σε μοναδικούς αριθμούς Τι κάνει μια εντολή εκχώρισης: 1. Αποτιμά την έκφραση στο δεξιό σκέλος της (και την τοποθετεί σε μια διεύθυνση μνήμης) 2. Αποθηκεύει τη διέυθυνση μνήμης στη μεταβλητή στο αριστερό σκέλος
Εντολές Εκχώρισης (II) Αυτό σημαίνει ότι μια μεταβλητή είναι ένα όνομα και μια διεύθυνση μνήμης. Το όνομα δείχνει στη διεύθυνση μνήμης όπου αποθηκεύεται η τιμη της μεταβλητής Οπότε, οι μεταβλητές στην Python διαφέρουν από τις μαθηματικές μεταβλητές
Ισχυροί Τύποι Μεταβλητών (Strongly-typed language) Παρόλο που τα ονόματα μεταβλητών μπορούν να ξανά-αλλάξουν τύπο, οι πραγματικές τιμές πίσω από τα ονόματα έχουν τύπους. Και η Python δε θα παραστρατήσει ώστε να μετατρέψει τύπους που δεν έχουν «σημασιολογική συνάφεια». Αυτό καθιστά την Python μια δυναμική γλώσσα, αλλά με ισχυρούς τύπους. Σε αντίθεση η Perl, είναι ταυτόχρονα δυναμική γλώσσα με ασθενείς τύπους.
Πρωτότυπα - Python Script Η διαδραστική Python είναι καλή για πειράματα και προγράμματα μεγέθους 3-4 γραμμών. Τα περισσότερα προγράμματα είναι πολύ μεγαλύτερα, οπότε και τα γράφουμε μέσα σε ένα αρχείο (module) και λέμε στη Python να τρέξει τις εντολές που βρίσκονται μέσα στο αρχείο. Κατά μία έννοια δίνουμε στη Python ένα πρωτότυπο / script. Σαν κατάληξη, βάζουμε.py στο τέλος αυτών των αρχείων για να προσδιορίσουμε ότι εμπεριέχουν κώδικα Python.
Διαδραστικά vs. Πρωτότυπα / Script Διαδραστικά > Πληκτρολογείς κατ ευθείαν στη Python μία γραμμή κάθε φορά και αυτή ανταποκρίνεται > Επίσης: python c print( hello ) Πρωτότυπα / Script > Εισάγεις μία ακολουθία εντολών (γραμμών) στο αρχείο χρησιμοποιώντας ένα επεξεργαστή κειμένου και λες στη Python να εκτελέσει τις εντολές που βρίσκονται εντός του αρχείου > python mymodule.py
Στοίχιση Για ένα λεπτό, σοβαρά τώρα; Τα κενά είναι σημαντικά στην Python;" «Που στο καλό πήγαν τα άγκιστρα που ήξερα μέχρι τώρα; Γιατί στοίχιση; Σύντομη απάντηση: γιατί το κάνουμε ούτως ή άλλως. Καλύτερη απάντηση: γιατί κάποιοι από εμάς δεν το κάνουν. Το Python Style Guide (PEP 8) προτείνει 4 κενά και καθόλου tab.
Συνέχιση γραμμής Ένα πρόβλημα με τη σημασία της στοίχισης είναι το πώς θα διακόψουμε μεγάλες εντολές σε πολλαπλές γραμμές. Η Python μας δίνει δύο επιλογές: Τον χαρακτήρα \, ο οποίος σηματοδοτεί το τέλος της γραμμής και λέει στο διερμηνευτή να διαχειριστεί την επόμενη γραμμή σαν συνέχεια της τρέχουσας. Αυτή η επιλογή καλό είναι να αποφεύγεται όσο είναι δυνατό. Οι χαρακτήρες (...), {...} και [...], οι οποίοι δημιουργούν υπονοούμενη συνέχιση γραμμής. Αυτή η επιλογή θα πρέπει να χρησιμοποιείται πάντα, αν γίνεται.
Ροή Προγράμματος Σαν μία συνταγή ή οδηγίες εγκατάστασης, ένα πρόγραμμα είναι μία ακολουθία από βήματα τα οποία πρέπει να γίνουν με τη σειρά. Κάποια βήματα γίνονται υπό όρους - είναι πιθανό να παραβλεφθούν. Μερικές φορές ένα βήμα ή ένα γκρουπ βημάτων μπορεί να επαναληφθούν. Μερικές φορές αποθηκεύουμε μία σειρά βημάτων για να τα χρησιμοποιήσουμε ξανά και ξανά όπου χρειάζεται μέσα στο πρόγραμμα.
Ακολουθούμενα Βήματα x = 2 print(x) x = x + 2 print(x) Πρόγραμμα: x = 2 print x x = x + 2 print x Έξοδος: 2 4 Όταν τρέχει ένα πρόγραμμα, κυλάει από το ένα βήμα στο επόμενο. Σαν προγραμματιστές, ορίζουμε μονοπάτια για να ακολουθήσει το πρόγραμμα.
x = 5 Βήματα Υπό Όρους x < 10? Yes Πρόγραμμα: print( Smaller ) x = 5 Έξοδος: x > 20? No if x < 10 : print('smaller ) if x > 20 : Smaller Finis print('bigger ) print('bigger ) print('finis ) print('finis )
Επαναλαμβανόμενα Βήματα No n = 5 n > 0? Yes print(n) n = n -1 Πρόγραμμα: n = 5 while n > 0 : print(n) n = n 1 print('blastoff! ) Έξοδος: 5 4 3 2 1 Blastoff! print('blastoff ) Οι Βρόγχοι (επαναλαμβανόμενα βήματα) έχουν επαναληπτικές μεταβλητές οι οποίες αλλάζουν κάθε φορά μέσα σε ένα βρόγχο. Συχνά αυτές οι επαναληπτικές μεταβλητές περνούν από μια ακολουθία αριθμών.
Γράφοντας ένα Απλό Πρόγραμμα
name = input('enter file:') handle = open(name, 'r') text = handle.read() words = text.split() counts = dict() for word in words: counts[word] = counts.get(word,0) + 1 bigcount = None bigword = None for word,count in counts.items(): if bigcount is None or count > bigcount: bigword = word bigcount = count print(bigword, bigcount) Μία μικρή ιστορία για το πως μετράμε λέξεις σε ένα αρχείο στην Python python words.py Enter file: words.txt t o 16 python words.py Enter file: clown.txt the 7
name = input('enter file:') handle = open(name, 'r') text = handle.read() words = text.split() counts = dict() for word in words: counts[word] = counts.get(word,0) + 1 bigcount = None bigword = None Ακολουθιακό Επαναλαμβανόμενο Υπό Όρους for word,count in counts.items(): if bigcount is None or count > bigcount: bigword = word bigcount = count print(bigword, bigcount)
Περίληψη Αυτή είναι μία γρήγορη επισκόπηση των βασικών στοιχείων της Python Θα τα συναντήσουμε ξανά κατά την πορεία των μαθημάτων Επικεντρώστε το ενδιαφέρον σας στην ουσία