Keywords: easytut

Далее: Логические выражения Наверх: Курс языка Python для начинающих Назад: Списки Содержание

# Циклы for

Новое упражнение по работе с клавиатурой на компьютере:

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

и уже знакомый результат:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

Результат уже очень знаком, но программа выглядит по-другому. В первой строке используется функция `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`. Часто она используется следующим образом: `for variable in list`. При этом `list` проходится, начиная с первого элемента до последнего. Когда `for` перебирает `list`, он присваивает каждый элемент списка в переменную `variable`. Это позволяет использовать `variable` в каждой итерации цикла. Еще один пример (можете его не печатать):

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

Результат:

    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

Как было сказано выше, цикл пробегает весь список и присваивает каждый элемент списка в переменную. (Помните, если вы не хотите, чтобы после выполнения команды `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. Затем мы удаляем первый элемент, чтобы мы не подумали по ошибке, что он совпадает с `prev`. Затем начинается цикл for. В нем проверяется, совпадает ли каждый элемент списка с предыдущим. Если да, то мы нашли дубликат. Далее меняем значение переменной prev, чтобы на следующей итерации цикла она содержала элемент, предыдущий относительно рассматриваемого. Разумеется, мы находим два элемента 7. (Обратите внимание, что `\t` используется для вывода знака табуляции).

Другое использование цикла for – это сделать что-либо определенное количество раз. Ниже приводится программа для вычисления первых девяти чисел Фибоначчи:

    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` предоставляют простой способ перебрать все элементы списка или сделать что-либо определенное количество раз.

Далее: Логические выражения Наверх: Курс языка Python для начинающих Назад: Списки Содержание