Διάλεξη 26ης/28ης Σεπτεμβρίου 2016

Εντολές διακλάδωσης

Η απλούστερη εντολή διακλάδωσης είναι η εντολή if-else:


if expression:
    statements_true
else:
    statements_false

Εδώ, expression δηλώνει οποιαδήποτε έκφραση η οποία η τιμή της οποίας είναι True ή False, ενώ statements_true και statements_false δηλώνουν μία ή περισσότερες εντολές Python. Παρατηρήστε την άνω και κάτω τελεία που ακολουθεί τόσο την έκφραση expression όσο και τη λέξη else. Επιπλέον, δείτε ότι οι εντολές statements_true και statements_false έχουν μετακινηθεί (κατά μια εσοχή, tab) προς τα δεξιά. Αυτό είναι ένα ιδιαίτερο χαρακτηριστικό της Python, όπου η παρουσία της εσοχής συγκεντρώνει εντολές σε συγκεριμένο μέρος του κώδικα. Για παράδειγμα, οι εντολές


if n%2 == 0:
    an = 1
else:
    an = -1
print('Finished')

αναθέτουν στη μεταβλητή an την τιμή 1 αν ο n είναι άρτιος, -1 διαφορετικά και εκτυπώνουν το μήνυμα Finished. Αντίθετα, οι εντολές


if n%2 == 0:
    an = 1
else:
    an = -1
    print('Finished')

θα τυπώσουν το μήνυμα Finished μόνο αν ο n είναι περιττός, γιατί η παρουσία της εσοχής (tab) πριν την εντολή print την κατατάσσει στην ομάδα εντολών statements_false.

Η έκφραση expression μπορεί να είναι οποιαδήποτε έκφραση της οποίας η τιμή είναι True ή False, όπως για παράδειγμα, n%2 == 0, η οποία έχει την τιμή True αν ο n είναι άρτιος, False διαφορετικά. Ως ακόμα ένα παράδειγμα, οι εντολές


if year%4 == 0 and year%100 != 0 or year%400 == 0:
    print('Is leap')
else:
    print('Is not leap')

θα τυπώσουν το μήνυμα Is leap αν year είναι δίσεκτο έτος, διαφορετικά Is not leap. Υπενθυμίζουμε ότι στην έκφραση year%4 == 0 and year%100 != 0 or year%400 == 0 δεν απαιτούνται παρενθέσεις γιατί ο τελεστής and έχει μεγαλύτερη προτεραιότητα από τον τελεστή or.

Για ελέγχους με περισσότερες διακλαδώσεις μπορούμε να χρησιμοποιήσουμε τη λέξη-κλειδί elif (σύντμηση των λέξεων else-if):


if n%3 == 0:
    print('remainder is 0')
elif n%3 == 1: 
    print('remainder is 1')
else:
    print('remainder is 2')

Οι εντολές ελέγχου if-elif-else μπορούν να φωλιασμένες (nested) δηλαδή επιτρέπεται μια εντολή if-elif-else να είναι μέρος της ομάδας εντολών statements_true ή statements_false ή και των δύο. Για παράδειγμα, οι παρακάτω εντολές επιλέγουν τον μέγιστο των x, y, z :


if x >= y:
    if x >= z:
        print('x is largest')
    else:
        print('z is largest')
else:
    if y >= z:
        print('y is largest')
    else:
        print('z is largest')

Μια κομψότερη, ίσως, λύση η οποία μπορεί εύκολα να γενικευθεί σε μεγαλύτερο πλήθος αριθμών είναι η ακόλουθη:


maxnum = x
if y > maxnum:
    maxnum = y
if z > maxnum:
    maxnum = z
print('largest number is', maxnum)

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

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


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

Ακολουθίες χαρακτήρων και είσοδος δεδομένων

Είδαμε τα αντικείμενα τύπου str χρησιμεύουν για την αναπαράσταση ακολουθιών χαρακτήρων (strings). Οι τιμές τέτοιων αντικειμένων μπορούν να γραφούν είτε με μονά είτε με διπλά εισαγωγικά, όπως 'abc' ή "I am a string". Η συνένωση strings γίνεται με τον τελεστή '+', ενώ ο τελεστής '*' επιτρέπει την συνένωση αντιγράφων ενός string. Η συνάρτηση len επιστρέφει τον αριθμό χαρακτήρων σε ένα string:


>>> s = 'mike'
>>> type(s)
<class 'str'>
>>> s+s
'mikemike'
>>> 3*s
'mikemikemike'
>>> s + ' likes Python'
'mike likes Python'
>>> len(s)
4
>>> len(s + ' plex')
9
>>> len('He said: \"It\'s cold!\"')
21

Μπορούμε να αναφερθούμε σε συγκριμένους χαρακτήρες ενός string χρησιμοποιώντας τον αριθμό της θέσης του (δείκτης, index) στην ακολουθία μέσα σε τετραγωνικές παρενθέσεις, για παράδειγμα name[4] αναφέρεται στον τέταρτο χαρακτήρα της ακολουθίας χαρακτήρων name. ΣΗΜΑΝΤΙΚΟ: Στην Python, η αρίθμηση ξεκινάει από το μηδέν. Επομένως, αν name = 'Alexander', τότε name[4] θα επιστρέψει 'a'. Γενικότερα, ο δείκτης θέσης του τελευταίου χαρακτήρα ενός string με μήκος n είναι n-1. Μπορούμε ακόμα να χρησιμοποιήσουμε αρνητικούς αριθμούς για να αναφερθούμε στη θέση ενός χαρακτήρα, με τη διαφορά ότι σε αυτή την περίπτωση η αρίθμηση των χαρακτήρων γίνεται από το τέλος του string. Για να αναφερθούμε σε ένα εύρος χαρακτήρων χρησιμοποιούμε το συμβολισμό [start:end], με τη σύμβαση ότι [:] αναφέρεται σε όλο το string. Σημειώστε ότι s[start:end] αναφέρεται στους χαρακτήρες του string s που βρίσκονται στις θέσεις start, start+1, …, end-1. Αν το start παραληφθεί εκλαμβάνεται ώς μηδέν ενώ αν παραληφθεί το end τότε εκλαμβάνεται ως ο δείκτης του τελευταίου χαρακτήρα.


>>> s = 'TwentyOnePilots'
>>> s[3]
'n'
>>> s[-2]
't'
>>> s[1:4]
'wen'
>>> s[:5]
'Twent'
>>> s[12:]
'ots'
>>> s[-1]
's'
>>> s[-6:-1]
'Pilot'

Ο συμβολισμός [start:end] είναι στην πραγματικότητα ακόμα πιο ευέλικτος. Μπορούμε να γράψουμε [start:end:step] για να αναφερθούμε στις θέσεις μεταξύ start και end-1 με βήμα step.


>>> s = 'RedHotChiliPeppers'
>>> s[0:10:2]
'RdoCi'
>>> s[:10:2]
'RdoCi'
>>> s[::2]
'RdoCiiepr'
>>> s[::-1]
'sreppePilihCtoHdeR'
>>> s[:]
'RedHotChiliPeppers'
>>> s[-1:-8:-1]
'sreppeP'

Η είσοδος δεδομένων (από το πληκτρολόγιο) γίνεται με τη συνάρτηση input. Το (προαιρετικό) όρισμα της συνάρτησης είναι μια προτροπή (prompt) στο χρήστη να εισαγάγει δεδομένα. Οτιδήποτε εισάγει ο χρήστης αποθηκεύεται ως ακολουθία χαρακτήρων.


>>> name = input('What is your name? ')
What is your name? Barack Obama
>>> print('Hello,', name)
Hello, Barack Obama
>>> age = input('How old are you? ')
How old are you? 42
>>> type(age)
<class 'str'>

Παρατηρήστε ότι ο τύπος της μεταβλητής age είναι str, δηλαδή ακολουθία χαρακτήρων και όχι int που ίσως να περίμενε κάποιος. Παρ' όλα αυτά μπορούμε να μετατρέψουμε τη μεταβλητή age σε ακέραιο γράφοντας int(age) και με αυτό τον τρόπο να μπορεί να συμμετάσχει σε αριθμητικές εκφράσεις:


>>> age = input('How old are you? ')
How old are you? 42
>>> my_age = 25
>>> print('You are', int(age)-my_age, 'years older than I am!')
You are 17 years older than I am!

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


>>> price = float(input('How much for the apples? '))
How much for the apples? 1.79
>>> type(price)
<class 'float'>
>>> kilos = 4.5
>>> cost = price * kilos