Διάλεξη 5ης Οκτωβρίου 2016

Εντολές ανακύκλωσης. Η εντολή for

Η εντολή ανακύκλωσης while που είδαμε στην προηγούμενη διάλεξη εκτελεί κάποιες εντολές όταν ένας μετρητής, η λεγόμενη μεταβλητής της ανακύλωσης, παίρνει τιμές από μια ακολουθία ακεραίων. Για παράδειγμα, οι παρακάτω εντολές τυπώνουν τα τετράγωνα των ακεραίων $1, 2, \ldots, 10$


n = 1
while n <= 10:
    print('The square of', n, 'is', n**2)
    n += 1

ενώ οι εντολές


j = 1
while j < 20:
    print('The cube of', j, 'is', j**3)
    j += 2

τυπώνουν τους κύβους των περιττών ακεραίων στο διάστημα $[1, 20)$. Παρατηρήστε εδώ ότι η μεταβλητή j λαμβάνει διαδοχικά τις τιμές $1, 3, 5, \ldots, 17, 19$.

Η Python έχει και ένα δεύτερο τρόπο για την κατασκευή τέτοιων ακολουθιών ακεραίων και την επαναληπτική εκτέλεση εντολών που εξαρτώνται από τους όρους αυτής της ακολουθίας, την εντολή ανακύκλωσης for. Το συντακτικό της είναι



for variable in sequence:
    statements

Η μεταβλητή που εμφανίζεται μετά τη λέξη-κλειδί for λαμβάνει διαδοχικά τις τιμές της ακολουθίας sequence και οι εντολές statements εκτελούνται. Η διαδικασία επαναλαμβάνεται μέχρι να εξαντληθούν οι τιμές της ακολουθίας ή μια εντολή break τερματίσει πρόωρα την ανακύκλωση. Δείτε επίσης την παρουσία του τελεστή in με τον οποίο ελέγχουμε κατά πόσο η μεταβλητή variable είναι μέλος της ακολουθίας sequence.

Γνωρίζουμε ήδη μεταβλητές τύπου string είναι ακολουθίες χαρακτήρων. Επομένως θα μπορούσαμε να γράψουμε εντολές που τυπώνουν έναν-έναν τους χαρακτήρες μιας ακολουθίας χαρακτήρων ως


s = 'Mississippi'
for c in s:
    print(c)

Θα μπορούσαμε λοιπόν να μετρήσουμε τη συχνότητα εμφάνισης ενός χαρακτήρα μέσα σε μια ακολουθία χαρακτήρων ως εξής:


s = 'Mississippi'
k = 0
for c in s:
    if c == 'i':
        k += 1

if k:
    print('The character i appears in the string', s, k, 'times')
else:
    print('The character i does not appear in the string', s)

Για την κατασκευή ακολουθίας ακεραίων, η Python παρέχει τη συνάρτηση range(start, stop, step), η οποία κατασκευάζει την αριθμητική πρόοδο start, start+step, start+2*step, $\ldots$, start + n*step, όπου

Αν το start παραληφθεί τότε νοείται ως μηδέν και αν το βήμα step παραληφθεί νοείται ως ένα. Μερικά παραδείγματα:

Παράδειγμα 1: Γράψτε ένα πρόγραμμα το οποίο τυπώνει το πλήθος των ακεραίων στο διάστημα $[1, 100]$ οι οποίοι διαιρούνται με το 5 αλλά όχι με το 7.


n = 0
for i in range(1,101):
    if i%5 == 0 and i%7 != 0:
        n += 1
print(n)

Παράδειγμα 2: Γράψτε ένα πρόγραμμα το οποίο τυπώνει όλους τους πρώτους αριθμούς στο διάστημα $[1, 1000]$. Η υλοποίηση παρακάτω είναι πολύ απλοϊκή και ο ενδιαφερόμενος αναγνώστης καλείται να την βελτιώσει, κατά το δυνατόν.


for n in range(1, 1001):
   isprime = True
   for i in range(2, n):
       if n%i == 0:
           isprime = False
           break
   if isprime:
       print(n, 'is prime')

Ως ένα ακόμα παράδειγμα ας σκεφτούμε μια ακολουθία χαρακτήρων η οποία περιέχει αριθμούς, χωρισμένους με κόμματα, όπως η ακολουθία '3.5,2,4.12'. Το παρακάτω πρόγραμμα τυπώνει το άθροισμα των αριθμών που περιέχονται μέσα σε αυτήν.


s = '3.5,2,4.12'
a = 0
i = j = 0

for c in s:
    if c == ',':
        a += float(s[i:j])
        i = j + 1
    j = j + 1

if i < j:
    a += float(s[i:j])
print('The sum of the numbers', s, 'is', a)