Διάλεξη 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
,
όπου
- αν
step
είναι θετικός,n
είναι ο μεγαλύτερος ακέραιος τέτοιος ώστε ο αριθμόςstart + n*step
να είναι μικρότερος από τονstop
- αν
step
είναι αρνητικός ο τελευταίος όρος της ακολουθίας είναι ο μικρότερος ακέραιος της μορφήςstart + n*step
μεγαλύτερος από τονstop
Αν το start
παραληφθεί τότε νοείται ως μηδέν και αν το βήμα step
παραληφθεί νοείται ως ένα. Μερικά
παραδείγματα:
range(1, 10, 2)
είναι η ακολουθία 1, 3, 5, 7, 9range(4)
καιrange(0,4)
παράγουν και οι δυό την ακολουθία 0, 1, 2, 3.range(25, 10, -5)
είναι η ακολουθία 35 30 25 20 15.
Παράδειγμα 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)