Γλώσσες Προγραμματισμού Εφαρμογών - ΜΕΠΒ20 Διάλεξη 2 Τύποι, Υπό Όρους Εκτέλεση Παπαϊωάννου Αθανάσιος Π.Μ.Σ. «Εφαρμοσμένη Πληροφορική» Χειμερινό Εξάμηνο 20 16-20 17
Αριθμητικές Εκφράσεις Τελεστής Πράξη + Πρόσθεση - Αφαίρεση * Πολλαπλασιασμός / Διαίρεση ** Δύναμη % Υπόλοιπο
Κανόνες Προτεραιότητας Τελεστών Υψηλότερη προτεραιότητα σε χαμηλότερη προτεραιότητα: Οι παρενθέσεις πάντα αποτιμώνται πρώτες Η (ύψωση σε δύναμη) Πολλαπλασιασμός, Διαίρεση και Υπόλοιπο Πρόσθεση και Αφαίρεση Αριστερά προς δεξιά Παρένθεση Δύναμη Πολλ/ σμός Πρόσθεση Αριστερά προς Δεξιά
1 + 2 ** 3 / 4 * 5 >>> x = 1 + 2 ** 3 / 4 * 5 >>> print(x) 11 >>> Παρένθεση Δύναμη Πολλ/ σμός Πρόσθεση Αριστερά προς Δεξιά 1 + 8 / 4 * 5 1 + 2 * 5 1 + 10 11
Τι σημαίνει Τύπος? Στη Python οι μεταβλητές, οι κύριες λέξεις και οι σταθερές έχουν έναν τύπο type Η Python γνωρίζει τη διαφορά μεταξύ ενός ακεραίου και μίας σειράς Για παράδειγμα το + σημαίνει πρόσθεση εαν κάτι είναι αριθμός και συνένωση αν κάτι είναι σειρά >>> ddd = 1 + 4 >>> print(ddd) 5 >>> eee = 'hello ' + 'there' >>> print(eee) hello there συνένωση = βάζω μαζί
Ο Τύπος Έχει Σημασία Η Python γνωρίζει τι τύπος είναι καθετί Κάποιες πράξεις δεν είναι εφικτές Δεν μπορείς να προσθέσεις 1 σε μία σειρά Μπορούμε να ρωτήσουμε την Python τι τύπος είναι κάτι χρησιμοποιώντας την εντολή type() >>> eee = 'hello ' + 'there' >>> eee = eee + 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects >>> type(eee) <type 'str'> >>> type('hello') <type 'str'> >>> type(1) <type 'int'> >>>
Διάφοροι Τύποι Αριθμών Οι αριθμοί έχουν δύο κύριους τύπους Οι ακέραιοι είναι οι αριθμοί χωρίς δεκαδικά ψηφία: -14, -2, 0, 1, 10 0, 40 1233 Οι αριθμοί με κινητή υποδιαστολή έχουν δεκαδικά μέρη: -2.5, 0.0, 98.6, 14.0 Υπάρχουν και άλλοι τύποι αριθμών - υπάρχουν παραλλαγές στους αριθμούς με κινητή υποδιαστολή και στους ακεραίους >>> xx = 1 >>> type (xx) <class 'int'> >>> temp = 98.6 >>> type(temp) <class 'float'> >>> type(1) <class 'int'> >>> type(1.0) <class 'float'> >>>
Μετατροπές Τύπου Όταν βάζεις έναν ακέραιο και έναν αριθμό με δεκαδικά ψηφία σε μία έκφραση, ο ακέραιος εμμέσως μετατρέπεται σε αριθμό με δεκαδικά ψηφία Αυτό μπορείς να το ελέγξεις με τις ενσωματωμένες εντολές int() και float() >>> print( float(99) / 100 ) 0.99 >>> i = 42 >>> type(i) <class 'int'> >>> f = float(i) >>> print( f ) 42.0 >>> type(f) <class 'float'> >>> print(1 + 2 * float(3) / 4 5) -2.5 >>>
Μετατροπές Σειρών Μπορείς επίσης να χρησιμοποιήσεις την int() και την float() για μετατροπές μεταξύ σειρών και ακεραίων Θα πάρετε ένα μήνυμα λάθους αν η σειρά δεν περιέχει αριθμητικούς χαρακτήρες >>> sval = '123' >>> type(sval) <class 'str'> >>> print(sval + 1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' >>> ival = int(sval) >>> type(ival) <class 'int'> >>> print ival + 1 124 >>> nsv = 'hello bob' >>> niv = int(nsv) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int()
Εισαγωγή από τον Χρήστη Μπορούμε να αναθέσουμε στη Python να παγώσει το πρόγραμμα και να διαβάσει δεδομένα από τον χρήστη χρησιμοποιώντας την nam = input( Who are you? ) Print('Welcome', nam) εντολή input() Η εντολή input() επιστρέφει σειρά Who are you? Chuck Welcome Chuck
Μετατρέποντας την Είσοδο του Χρήστη Αν θέλουμε να διαβάσουμε έναν αριθμό από τον χρήστη, πρέπει να τον μετατρέψουμε από σειρά σε αριθμό χρησιμοποιώντας μία εντολή inp = input( Europe floor? ) usf = int(inp) + 1 print 'US floor', usf μετατροπής τύπου Αργότερα θα ασχοληθούμε με τη μη ορθή είσοδο Europe floor? 0 US floor 1 δεδομένων
Booleans: Ένας νέος τύπος Μπορούν να πάρουν δύο τιμές True, False. Έχουν 3 τελεστές: not, and, or. Το not αλλάζει το True σε False και το αντίστροφο. Το and επιστρέφει False εκτός κι αν όλοι οι τελεστέοι είναι True. Το or επιστρέφει True εκτός κι αν όλοι οι τελεστέοι είναι False. Η Python ορίζει τον τύπο bool για τις εκφράσεις Boolean Η bool(x) μπορεί να χρησιμοποιηθεί για μετατροπή του x σε Boolean
Πώς αποτιμούμε εκφράσεις Boolean Μπορούμε να χρησιμοποιήσουμε τους τελεστές: <,>,<=,>=,!=, == Είναι όλοι συγκριτικοί τελεστές που επιστρέφουν True ή False. == είναι ο τελεστής ισότητας.!= είναι ο τελεστής διαφορετικότητας.
Εκφράσεις Boolean Μπορούμε να συνδυάσουμε λογικούς τελεστές (and, or, not) και συκγριτικούς τελεστές (<,>,κλπ) και αριθμητικούς τελεστές (+,-,*, κλπ). 5+7<4*3 or 1-2 >2-4 and 15==4 είναι νόμιμη έκφραση. Οι αριθμητικές εκφράσεις αποτιμώνται πρώτες, μετά οι συγκριτικές και μετά οι λογικές. Το False αναπαρίσταται στον υπολογιστή ως 0, και το True αναπαρίσταται ως 1. Μπορεί να οδηγήσει σε περίεργα αποτελέσματα αν κάποιος το χρησιμοποιήσει αυτό αριθμητικά.
Τελεστές Σύγκρισης Οι Boolean εκφράσεις κάνουν μία ερώτηση και παράγουν ένα αποτέλεσμα Ναι ή ένα Όχι που χρησιμοποιούμε για να ελέγξουμε τη ροή του προγράμματος Οι Boolean εκφράσεις χρησιμοποιούν τελεστές σύγκρισης οι οποίοι αξιολογούν σε - Αληθές / Ψευδές - Ναι / Όχι Οι τελεστές σύγκρισης κοιτούν τις μεταβλητές αλλά δεν τις αλλάζουν Python Σημασία < Μικρότερο Από <= Μικρότερο / Ίσο Από == Ίσο με >= Μεγαλύτερο / Ίσο Από > Μεγαλύτερο Από!= Άνισο με Να Θυμάστε: = χρησιμοποιείτε για εκχώρηση.
Παράκαμψη Αποτίμησης Boolean Η Python εξακολουθεί την αποτίμηση μιας έκφρασης boolean μόνο εφόσον η απάντηση δεν είναι ξεκάθαρη. Θα σταματήσει όταν η απάντηση είναι ξεκάθαρη. Αυτό, σε συνδυασμό με τη φύση της αναπαράστασης μιας έκφρασης boolean μπορεί να οδηγήσει σε παράξενη συμπεριφορά. Το να βασίζεται κανείς σε αυτή τη συμπεριφορά αποτελεί κακό προγραμματιστικό στυλ.
Συμβουλή στυλ για τους boolean Αν είστε αβέβαιοι για την προτεραιότητα, χρησιμοποιήστε παρενθέσεις. Βοηθούν στην αναγνωσιμότητα. Επίσης, χρησιμοποιήστε παρενθέσεις για πολύπλοκες εκφράσεις. Απλοποιήστε όσο γίνεται τις εκφράσεις Boolean. Απαλλαχτείτε από διπλές αρνήσεις, κλπ.
Χρησιμοποίηση Μεταβλητών Boolean Κάποιες φορές θέλουμε να κάνουμε τον κώδικά μας να εκτελείται κατά περίπτωση. Χρησιμοποιούμε εκφράσεις boolean για να εκτελούμε επιλεκτικά μπλοκ κώδικα με εντολές if.
Δομή Εντολής If Η γενική μορφή μιας εντολή if είναι: if συνθήκη: μπλοκ Η συνθήκη είναι μια έκφραση boolean. Το μπλοκ είναι μια ακολουθία από εντολές. Παράδειγμα: if grade >= 5: print ( pass )
x = 5 X < 10? Yes Βήματα Υπό Όρους Πρόγραμμα: No print 'Smaller' x = 5 Έξοδος: if x < 10 : X > 20? Yes print ('Smaller ) Smaller Finis No print 'Bigger' if x > 20 : print ('Bigger ) print 'Finis' print ('Finis )
Μονόδρομες Αποφάσεις x = 5 print 'Before 5' if x == 5 : print('is 5 ) print('is Still 5 ) print('third 5 ) print 'Afterwards 5 print 'Before 6 if x == 6 : print('is 6 ) print('is Still 6 ) print('third 6 ) print 'Afterwards 6' Before 5 Is 5 Is Still 5 Third 5 Afterwards 5 Before 6 Afterwards 6 X == 5? Yes No print 'Is 5' print 'Still 5' print 'Third 5'
αύξηση / διατήρηση μετά το if ή το for μείωση για να δείξουμε το τέλος του μπλοκ x = 5 if x > 2 : print('bigger than 2 ) print('still bigger ) Print('Done with 2 ) for i in range(5) : print(i) if i > 2 : print('bigger than 2 ) print('done with i', i) print('all Done )
Γενική Μορφή Εντολής if if συνθήκη1: μπλοκ elif συνθήκη2: μπλοκ elif συνθήκη3: μπλοκ else: μπλοκ Η Python αποτιμά τις συνθήκες με τη σειρά. Εκτελεί το μπλοκ της πρώτης συνθήκης (και μόνο της πρώτης) που είναι true. Το τελικό else είναι προαιρετικό.
Πολλαπλοί Δρόμοι x < 2 yes print 'small' if x < 2 : print('small ) elif x < 10 : print('medium ) else : print('large ) print 'All done' no x < 10 no print 'LARGE' yes print 'Medium' print 'All Done'
Πολλαπλοί Δρόμοι x = 0 x < 2 yes print 'small' x = 0 if x < 2 : print('small ) elif x < 10 : print('medium ) else : print('large ) print('all done ) no x < 10 no print 'LARGE' yes print 'Medium' print 'All Done'
Παζλ Πολλαπλών Δρόμων Ποιο δεν θα εκτυπωθεί ποτέ? if x < 2 : print('below 2 ) elif x >= 2 : print('two or more ) else : print('something else ) if x < 2 : print 'Below 2' elif x < 20 : print 'Below 20' elif x < 10 : print 'Below 10' else : print 'Something else'
Η Δομή try / except Περιτριγυρίζεις ένα επικίνδυνο τμήμα του κώδικα με το try και except Αν ο κώδικας μέσα στο try δουλεύει - το except δεν εκτελείται Αν ο κώδικας μέσα στο try δεν δουλεύει - μεταπηδάει στο τμήμα except
$ cat notry.py astr = 'Hello Bob' istr = int(astr) print 'First', istr astr = '123' istr = int(astr) print 'Second', istr $ python notry.py Traceback (most recent call last): File "notry.py", line 2, in <m odule> istr = int(astr)valueerror: invalid literal for int() with base 10 : 'Hello Bob' Ολοκληρώθηκε
Το πρόγραμμα σταματά εδώ $ cat notry.py astr = 'Hello Bob' istr = int(astr) print 'First', istr astr = '123 istr = int(astr) print 'Second', istr $ python notry.py Traceback (most recent call last): File "notry.py", line 2, in <m odule> istr = int(astr)valueerror: invalid literal for int() with base 10 : 'Hello Bob' Ολοκληρώθηκε
$ cat tryexcept.py astr = 'Hello Bob' try: istr = int(astr) except: istr = -1 print 'First', istr astr = '123' try: istr = int(astr) except: istr = -1 print 'Second', istr Όταν η πρώτη συζήτηση αποτυγχάνει - πέφτει στο except: και το πρόγραμμα συνεχίζει. $ python tryexcept.py First -1 Second 123 Όταν η δεύτερη συζήτηση επιτυγχάνει - δεν εκτελείται η συνθήκη except: και το πρόγραμμα συνεχίζει.
try / except astr = 'Bob' astr = 'Bob' try: print 'Hello' istr = int(astr) print 'There' except: istr = -1 print 'Done', istr print 'Hello' istr = int(astr) print 'There' print 'Done', istr istr = -1 Δίχτυ Ασφαλείας
Δείγμα try / except rawstr = input('enter a number:') try: ival = int(rawstr) except: ival = -1 if ival > 0 : print 'Nice work' else: print 'Not a number' $ python trynum.py Enter a number:42 Nice work $ python trynum.py Enter a number:forty-two Not a number $
Πρωτότυπα (Modules) Μερικές φορές θέλουμε να χρησιμοποιήσουμε τον κώδικα άλλων. Η να κάνουμε τον κώδικά μας διαθέσιμο για τους άλλους. Θα ήταν βολικό να ομαδοποιούσαμε κάποιες εντολές ή συναρτήσεις σε κάποιο αρχείο. Τα Modules μας επιτρέπουν να το κάνουμε αυτό. Ένα Module είναι ένα αρχείο με σχετικές μεταξύ τους συναρτήσεις, εντολές και μεταβλητές.
Χρησιμοποίηση modules Για να χρησιμοποιήσουμε ένα module, πρέπει προηγουμένως να εκτελέσουμε import module. Το import module καλεί την python να εκτελέσει κάθε εντολή του module. Συνήθως αυτό είναι δηλώσεις συναρτήσεων που εκτελούνται πολύ γρήγορα. Αλλά μπορεί να εκτελεστούν και κομμάτια κώδικα που δεν χρειαζόμαστε μέσα στο module. Για να χρησιμοποιήσει κανείς μια συνάρτηση που έχει οριστεί σε ένα module χρησιμοποιούμε: module_name.function_name() Μπορούμε επίσης να εκτελέσουμε ένα module, δηλ. python module. Σε αυτή την περίπτωση μπορούμε να χρησιμοποιήσουμε μόνο του το function_name() μέσα στο module
name Επιπρόσθετα στις μεταβλητές που ορίζονται σε ένα module, κάθε module έχει μια μεταβλητή που ονομάζεται name. Όταν κάνουμε import ένα module που ονομάζεται module_m, τότε module_m. name == module_m Αλλά αν εκτελούμε το module, τότε name == main Θυμηθείτε ότι όταν εκτελούμε το module, δε χρειαζόμαστε το όνομα του module σαν πρόθεμα στην κλήση συναρτήσεων του module.
Άλλος τρόπος που κάνουμε import from module_name import fn_name1(), fn_name2() Θα κάνει import τις συναρτήσεις fn_name1 και fn_name2 Αυτές μπορούν να χρησιμοποιηθούν απευθείας με το όνομά τους, π.χ. fn_name1() Μπορούμε επίσης να χρησιμοποιήσουμε τον * για να κάνουμε import όλες τις συναρτήσεις ενός module: from module_name import * Τί γίνεται όταν δύο module έχουν συναρτήσεις με το ίδιο όνομα; Ο πιο πρόσφατος ορισμός θα είναι αυτός που θα αναφερόμαστε σε κάθε χρήση της συνάρτησης.
Μέθοδοι ενός Module Είδαμε ότι τα modules μπορούν να έχουν τις δικές τους συναρτήσεις. Το ίδιο ισχύει και για τις μεταβλητές και τις τιμές. Οι μεταβλητές έχουν τιμές τις οποίες μπορεί κανείς να μεταβάλει με κάποιο τρόπο. Αυτός ο τρόπος είναι οι μέθοδοι. Αυτές καλούνται με value.fn_name() για μια τιμή value Και αν αναθέσαμε μια τιμή σε μια μεταβλητή variable_name με variable_name.fn_name() Μπορούμε να καλέσουμε help(module) για να μάθουμε ποιες μεθόδους έχει διαθέσιμεςένα module ή ένας τύπος μεταβλητής.
Εντοπισμός Modules Ο διερμηνευτής Python ψάχνει για modules με τη σειρά στα παρακάτω: Τον τρέχον κατάλογο εκτέλεσης Αν το module δε βρεθεί, τότε ψάχνει κάθε κατάλογο στην μεταβλητή περιβάλλοντος PYTHONPATH Αν και πάλι δε βρεθεί, ψάχνει στους καταλόγους όπου βρίσκονται οι βιβλιοθήκες της python Η μεταβλητή sys.path περιέχει όλα τα μονοπάτια αναζήτησης module
Περίληψη Βασικοί τύποι εκφράσεων: αριθμοί, συμβολοσειρές, boolean Μετατροπή τύπων Δομή if Δομή try / except Python modules