# Βρόγχοι For

Ξεκινάμε το κεφάλαιο όπως πάντα με μια άσκηση πληκτρολόγησης:

    onetoten = range(1,11)
    for count in onetoten:
            print count

και το πάντα επίκαιρο αποτέλεσμα:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

Το αποτέλεσμα φαίνεται τρομαχτικά οικείο αλλά ο κώδικας είναι διαφορετικός. Η πρώτη γραμμή έχει την συνάρτηση `range`. Η συνάρτηση `range` χρησιμοποιεί δυο παραμέτρους, μια για την αρχή και μια για το τέλος `range(start,finish)`. Η παράμετρος `start` είναι ο πρώτος αριθμός που δημιουργείται. Η παράμετρος `finish` είναι ένας αριθμός μεγαλύτερος από τον τελευταίο. Προσέξτε ότι το πρόγραμμα θα μπορούσε να γραφτεί με ακόμη πιο σύντομο τρόπο:

    for count in range(1,11):
            print count

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

    >>> range(1,10)
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> range(-32, -20)
    [-32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21]
    >>> range(5,21)
    [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
    >>> range(21,5)
    []

Η γραμμή `for count in onetoten:` χρησιμοποιεί την δομή ελέγχου `for`. Μια δομή ελέγχου όπως η `for` μοιάζει με την `for variable in list:`. Η εντολή `list` διατρέχει τον κατάλογο από το πρώτο στοιχείο και φτάνει μέχρι το τελευταίο. Καθώς η `for` ``περνάει'' από το κάθε στοιχείο το ``κρατάει'' στην μεταβλητή `variable`. Αυτό επιτρέπει στην `variable` να χρησιμοποιείται κάθε φορά που τρέχει ο βρόγχος for. Να άλλο ένα παράδειγμα (δεν είναι ανάγκη να το πληκτρολογήσετε):

    demolist = ['life',42, 'the universe', 6,'and',7,'everything']
    for item in demolist:
        print "The Current item is:",
        print item

The output is:

    The Current item is: life
    The Current item is: 42
    The Current item is: the universe
    The Current item is: 6
    The Current item is: and
    The Current item is: 7
    The Current item is: everything

Προσέξτε πώς ο βρόγχος for διατρέχει τον κατάλογο και ορίζει στοιχεία σ' αυτόν. (Σημειώστε πως αν δεν θέλετε την εντολή `print` να ``κατεβαίνει'' στην επόμενη γραμμή μπορείτε να βάλετε ένα κόμμα στο τέλος κάθε εντολής (π.χ. αν θέλετε να εμφανίσετε και κάτι άλλο στην ίδια γραμμή)). Τελικά, σε τι μας χρησιμεύει ο βρόγχος `for`; Μια πρώτη χρήση είναι να διατρέχει έναν κατάλογο και να κάνει ...κάτι σε κάθε στοιχείο που συναντά. Να ένας γρήγορος τρόπος να προσθέσουμε όλα τα στοιχεία μεταξύ τους:

    list = [2,4,6,8]
    sum = 0
    for num in list:
            sum = sum + num
    print "The sum is: ",sum

με το απλό αποτέλεσμα:

    The sum is:  20

Θα μπορούσαμε να γράψουμε ένα πρόγραμμα που θα εντοπίζει αν υπάρχουν όμοια μεταξύ τους στοιχεία μέσα στον καταλογο, όπως το παρακάτω:

    list = [4, 5, 7, 8, 9, 1,0,7,10]
    list.sort()
    prev = list[0]
    del list[0]
    for item in list:
            if prev == item:
                    print "Duplicate of ",prev," Found"
            prev = item

και επιβεβαιωνόμαστε με το αποτέλεσμα:

    Duplicate of  7  Found

Ωραία, αλλά πως δουλεύει; Να μια ``ειδική έκδοση'' που θα σας βοηθήσει να καταλάβετε (δεν είναι απαραίτητο να το πληκτρολογήσετε):

    l = [4, 5, 7, 8, 9, 1,0,7,10]
    print "l = [4, 5, 7, 8, 9, 1,0,7,10]","\tl:",l
    l.sort()
    print "l.sort()","\tl:",l
    prev = l[0]
    print "prev = l[0]","\tprev:",prev
    del l[0]
    print "del l[0]","\tl:",l
    for item in l:
            if prev == item:
                    print "Duplicate of ",prev," Found"
            print "if prev == item:","\tprev:",prev,"\titem:",item
            prev = item
            print "prev = item","\t\tprev:",prev,"\titem:",item

με αποτέλεσμα:

    l = [4, 5, 7, 8, 9, 1,0,7,10]   l: [4, 5, 7, 8, 9, 1, 0, 7, 10]
    l.sort()        l: [0, 1, 4, 5, 7, 7, 8, 9, 10]
    prev = l[0]     prev: 0
    del l[0]        l: [1, 4, 5, 7, 7, 8, 9, 10]
    if prev == item:        prev: 0         item: 1
    prev = item             prev: 1         item: 1
    if prev == item:        prev: 1         item: 4
    prev = item             prev: 4         item: 4
    if prev == item:        prev: 4         item: 5
    prev = item             prev: 5         item: 5
    if prev == item:        prev: 5         item: 7
    prev = item             prev: 7         item: 7
    Duplicate of  7  Found
    if prev == item:        prev: 7         item: 7
    prev = item             prev: 7         item: 7
    if prev == item:        prev: 7         item: 8
    prev = item             prev: 8         item: 8
    if prev == item:        prev: 8         item: 9
    prev = item             prev: 9         item: 9
    if prev == item:        prev: 9         item: 10
    prev = item             prev: 10        item: 10

Ο λόγος για τον οποίο έβαλα τόσες εντολές `print` ήταν για να μπορείτε να βλέπετε τι συμβαίνει σε κάθε γραμμή. (Παρεπιπτώντως αν δεν μπορείτε να βρείτε τι δεν πάει καλά με ένα πρόγραμμα, βάλτε όπου μπορείτε δηλώσεις print για να δείτε τι συμβαίνει). Αρχικά το πρόγραμμα ξεκινάει με εναν καταλογο (που τόσο καλά ξέρουμε, ε;). Μετά την ταξινομεί, έτσι αν υπάρχουν όμοια μεταξύ τους στοιχεία είναι δίπλα - δίπλα. Μετά ξεκινάει μια μεταβλητή με όνομα prev. Ύστερα το πρώτο στοιχείο του καταλογου διαγράφεται έτσι ώστε να είμαστε σίγουροι ότι το πρώτο στοιχείο δεν είναι κάποιο διπλό. Έπειτα εκκινείται ο βρόγχος for. Κάθε στοιχείο ελέγχεται για να διαπιστωθεί αν είναι όμοιο με το προηγούμενο. Αν είναι διπλό θα έχει βρεθεί. Η τιμή της μεταβλητής prev αλλάζει και έτσι την επόμενη φορά που ο βρόγχος εκτελείται η τιμή της prev είναι η τιμή του προηγούμενου στοιχείου στο τρέχον. Εϊμαστε βέβαιοι πως το 7 βρέθηκε να είναι διπλό. (Σημειώστε εδώ πως το `\t` χρησιμοποιείται για να δημιουργήσει ένα στηλοθέτη όπως το tab.)

Η άλλη χρήση των βρόγχων είναι το να κάνουν κάτι για ένα αριθμό επαναλήψεων. Παρακάτω έχουμε ένα παράδειγμα που θα μας εμφανίσει τους πρώτους έντεκα αριθμούς της ακολουθίας Fibonacci:

    a = 1
    b = 1
    for c in range(1,10):
            print a,
            n = a + b
            a = b
            b = n

και το εκπληκτικό αποτέλεσμα:

    1 1 2 3 5 8 13 21 34

Ό,τι γίνεται με τους βρόγχους `for` μπορεί να γίνει και με τους βρόγχους `while` αλλά οι βρόγχοι `for` αποτελούν έναν εύκολο τρόπο για να ``διατρέξουμε'' τα στοιχεία ενος καταλογου ή να κάνουμε κάτι για έναν συγκεκριμένο αριθμό επαναλήψεων.