Σημειώσεις

Προηγούμενο

Επόμενο

Ανακύκλωση με την εντολή for

Εντολή range()

Η εντολή range(n,m) δημιουργεί μία ακολουθία ακεραίων από τον n έως τον m-1.


>>> range(1,10)
range(1, 10)

Μπορούμε να δημιουργήσουμε μία λίστα που περιέχει την ακολουθία αριθμών την οποία παράγει η range:


>>> list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Αν παραλείψουμε το πρώτο όρισμα τότε αυτό θεωρείται ότι είναι το 0.


>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Η γενική μορφή της συνάρτησης είναι range(start,end,step) και κατασκευάζει την αριθμητική πρόοδο start, start+step, start+2*step,...,start+n*step. Δηλαδή, ως τρίτο όρισμα βάζουμε το βήμα για την ακολουθία των παραγόμενων αριθμών.


>>> list(range(0,10,2))
[0, 2, 4, 6, 8]

Ειδικότερα,

Εντολή for

Έχουμε χρησιμοποιήσει ορισμένες φορές ανακύκλωση όπου μία μεταβλητή (μετρητής) παίρνει τιμές από μια ακολουθία ακεραίων (δηλαδή, παίρνει διαδοχικές διαφορετικές ακέραιες τιμές).

Η εντολή for μπορεί να χρησιμοποιηθεί για να σαρώσουμε επαναληπτικά μία ακολουθία ακεραίων (η μία οποιαδήποτε ακολουθία) οι οποίοι μπορούν να παράγονται από την range. Για παράδειγμα, μπορούμε να τυπώσουμε τα τετράγωνα των ακεραίων από το 1 έως το 10.


for i in range(1,11):
    print('The square of', i, 'is', i**2)

Η μεταβλητή i που εμφανίζεται μετά τη λέξη-κλειδί for λαμβάνει διαδοχικά τις τιμές της ακολουθίας range(1,11) και η εντολή print(i) εκτελείται σε κάθε επανάληψη. Η διαδικασία επαναλαμβάνεται μέχρι να εξαντληθούν οι τιμές της ακολουθίας.

Το συντακτικό της εντολής for είναι


for variable in sequence:
    statements

Ο τελεστής in δίνει στη μεταβλητή variable της τιμές που περιέχονται στην ακολουθία sequence με σειριακό τρόπο (την μία μετά την άλλη). Οι εντολές statements εκτελούνται για κάθε τιμή της variable και η διαδικασία επαναλαμβάνεται μέχρι να εξαντληθούν οι τιμές της ακολουθίας. Εάν θελήσουμε να τερματήσουμε πρόωρα την ανακύκλωση μπορούμε να το κάνουμε με την εντολή break (όπως είδαμε και στην while).

Παράδειγμα.

Για την εύρεση κυβικής ρίζας (τέλειου κύβου, έστω pc) με εξαντλητική απαρίθμηση σαρώσαμε μία σειρά ακεραίων από το 1 έως το πολύ pc.


pc = int(input("Give an integer: "))
for x in range(0,pc+1):
    if x**3 == abs(pc):
	print("The cubic root of",pc,"is",x)
        break

Μία βελτίωση του παραπάνω προγράμματος είναι η ακόλουθη (σκεφτείτε γιατί αυτό μπορεί να θεωρηθεί βελτίωση).


pc = int(input("Give an integer: "))
for x in range(0,abs(pc)+1):
    if x**3 >= abs(pc):
       break

if x**3 != abs(pc):
    print(pc,"is not a perfect cube")
else:
    if pc < 0:
        x = -x
    print("The cubic root of",pc,"is",x)

Δημιουργία λιστών

Παράδειγμα.

Με την βοήθεια της for μπορούμε να δημιουργήσουμε μία λίστα. Για παράδειγμα, δημιουργούμε την λίστα [0,1,2,...99] ως εξής.


L = []
for i in range(100):
    L.append(i)

List comprehension.

Υπάρχει μία πιο συνοπτική σύνταξη για την δημιουργία λίστας. Για παράδειγμα, η παρακάτω εντολή δημιουργεί την λίστα [0,1,2,...99].


L = [i for i in range(100)]

Σάρωση λιστών

Παράδειγμα.

Ας βρούμε το άθροισμα των στοιχείων μίας λίστας (της οποίας τα στοιχεία είναι αριθμοί). Θα δούμε δύο τρόπους με τους οποίους μπορεί να γίνει αυτό.

Ο πρώτος τρόπος προκύπτει από όσα έχουμε ήδη δει.


L = [1,2,3,4,5,6,8,9]
sumL = 0
for i in range(len(L)):
    sumL += L[i]
print(sumL)

Ο δεύτερος τρόπος χρησιμοποιεί το γεγονός ότι η for μπορεί να διατρέξει μία οποιαδήποτε ακολουθία (π.χ., μία λίστα) με την βοήθεια του τελεστή in.


L = [1,2,3,4,5,6,8,9]
sumL = 0
for num in L:
    sumL += num

print(sumL)

Παράδειγμα.

Μία λίστα λέγεται παλινδρομική αν η σειρά των στοιχείων της είναι η ίδια είτε διαβάζεται από αριστερά προς τα δεξιά είτε αντίστροφα. Ας ελέγξουμε αν μία λίστα είναι παλινδρομική.


n = len(L)
flag = True
for i in range(0,n//2):
    if L[i] != L[n-i-1]: 
	flag = False
	break

print(flag)

Οι παρακάτω παρατηρήσεις θα μας βοηθήσουν να κατανοήσουμε το παραπάνω πρόγραμμα.

Άσκηση.

Πώς θα μπορούσαμε να ελέγξουμε αν μία λίστα είναι παλινδρομική με χρήση της μεθόδου reverse;

Παράδειγμα.

Θα διατρέξουμε (σαρώσουμε) τη λίστα colors, θα αφαιρέσουμε τα χρώματα που δεν μας αρέσουν και θα προσθέσουμε ορισμένα που μας αρέσουν.


colors = ['red','green','blue','cyan','magenta','yellow','black']
    
colors1 = colors[:]
for c in colors1:
    yesno = input("Should I keep " + c + "? (y/n) ")
    if yesno == 'n': colors.remove(c)
    
while True:
    newColor = input("Should I add a new color? (color/n) ")
    if newColor != 'n':
       colors.append(newColor)
    else:
       break
    
print("Your new list of colors is\n",colors)

strings ως ακολουθίες χαρακτήρων.

Οι μεταβλητές τύπου string είναι ακολουθίες χαρακτήρων και μπορούμε να γράψουμε εντολές ανακύκλωσης που σαρώνουν τους χαρακτήρες μιας ακολουθίας χαρακτήρων. Θα χρησιμοποιήσουμε την for για να διατρέξουμε την ακολουθία χαρακτήρων (συμβολοσειρά) με την βοήθεια του τελεστή in.

Παράδειγμα.

Ας διατρέξουμε και ας τυπώσουμε έναν-έναν με τη σειρά τους χαρακτήρες μίας συμβολοσειράς.


s = 'Nick Papadakis'
for c in s:
    print(c)

Μπορούμε να πετύχουμε το ίδιο αποτέλεσμα αν διατρέξουμε την συμβολοσειρά χρησιμοποιώντας τους δείκτες για την θέση των χαρακτήρων.


s = 'Nick Papadakis'
for i in range(len(s)):
    print('The',i,'th character is',s[i])

Εμφωλευμένες επαναλήψεις

Παράδειγμα.

Γράψτε ένα πρόγραμμα το οποίο ελέγχει αν δυο λίστες έχουν τουλάχιστον ένα κοινό στοιχείο. Εδώ θα χρειαστεί να ελέγχουμε τα στοιχεία της δεύτερης λίστας, ενώ διατρέχουμε την πρώτη λίστα. Αυτό θα το πετύχουμε με την χρήση δύο εμφωλευμένων for.


L1 = [1,2,3,4,5,6]
L2 = [5,6,7,8,9]

flag = False
for e1 in L1:
    for e2 in L2:
	 if e1 == e2: 
           flag = True
           break

if flag:
   print('Yes')
else:
   print('No')

Η python μας προσφέρει έναν απλό τρόπο για να ελέγχουμε αν ένα στοιχείο υπάρχει σε μία λίστα. Γράφουμε για στοιχείο e σε λίστα L την έκφραση: e in L. Η έκφραση αυτή παίρνει τις τιμές True, False. Το προηγούμενο πρόγραμμα γράφεται με απλούστερο τρόπο ως εξής:


L1 = [1,2,3,4,5,6]
L2 = [5,6,7,8,9]

flag = False
for e in L1:
    if e in L2:
	flag = True
	break

if flag:
   print('Yes')
else:
   print('No')

Παράδειγμα.

Ας υποθέσουμε ότι έχουμε έναν πίνακα με αριθμούς. Μπορούμε να διατρέξουμε τις γραμμές και στήλες του πίνακα με δύο εμφωλευμένες επαναλήψεις for.


matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        print('L[', i, ',', j,'] =', matrix[i][j])

Παράδειγμα.

Μια Πυθαγόρεια τριάδα είναι ένα σύνολο τριών φυσικών αριθμών $a \lt b \lt c$ τέτοιων ώστε $a^2 + b^2 = c^2$. Για παράδειγμα, το σύνολο $\{3, 4, 5\}$ είναι μια Πυθαγόρεια τριάδα γιατί $3^2 + 4^2 = 5^2$. Γράψτε ένα πρόγραμμα το οποίο θα βρίσκει τις Πυθαγόρειες τριάδες για $1 \lt a,b \lt 20$


import math

m = 20
counter = 0
for a in range(1,m+1):
    for b in range(a+1,m+1):
        c2 = a**2 + b**2
        c  = math.sqrt(c2)
        if int(c) == c:
           counter += 1
           c = int(c)
           print(a,b,c)

print("I found",counter,"Pythagorean triads")

Μελέτη

Βιβλιογραφία
  1. J.V. Guttag, Υπολογισμοί και προγραμματισμός με την python, (Κεφάλαιο 3).
  2. Δημήτριος Καρολίδης, Μαθαίνετε εύκολα python (Εκδόσεις Καρολίδη, 2016).
  3. Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016).
  4. Style Guide for Python Code.