Keywords: easytut

Далее: Циклы for Наверх: Курс языка Python для начинающих Назад: Определения функций Содержание
В этой главе

- Переменные, содержащие более одного значения
- Другие особенности списков
- Примеры
- Упражнения

# Списки

# Переменные, содержащие более одного значения

Вы уже видели обычные переменные, содержащие одно значение. Однако другие типы переменных могут содержать более одного значения. Самый простой из них – список. Пример использования списка:

    which_one = input("What month (1-12)? ")
    months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',\
            'August', 'September', 'October', 'November', 'December']
    if 1 <= which_one <= 12:
            print "The month is",months[which_one - 1]

Пример результата:

    What month (1-12)? 3
    The month is March

В этом примере `months` – это список. `months` определяется командой `months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',\ 'August', 'September', 'October', 'November', 'December']` (обратите внимание, можно использовать `\` для переноса длинных строк). `[` и `]` начинают и заканчивают список, а запятая разделяет элементы списка. Список используется в `months[which_one - 1]`. Он состоит из элементов, которые пронумерованы начиная с 0. Другими словами, если вы хотите January, вы напишете `months[0]`. По номеру список выдает величину, находящуюся в этом месте.

Выражение `if 1 <= which_one <= 12:` будет истинно только в том случае, если `which_one` находится в интервале от одного до двенадцати (другими словами, то же, что это означает в алгебре).

Можно представить список как набор контейнеров, например список `demolist = ['life',42, 'the universe', 6,'and',7]` выглядит следующим образом:

номер контейнера | 0 | 1 | 2 | 3 | 4 | 5
demolist | `life' | 42 | `the universe' | 6 | `and' | 7

Каждый контейнер помечен своим номером, поэтому `demolist[0]` дает `‘life’`, `demolist[1]` дает `42`, и т.д. до `demolist[5]`, то есть `7`.

# Другие особенности списков

Следующий пример показывает множество других вещей, которые можно сделать со списками (на этот раз я не заставлю вас это печатать, но, вероятно, вам все равно следует поупражняться, пока вы не привыкните к спискам). Итак:

    demolist = ['life',42, 'the universe', 6,'and',7]
    print 'demolist = ',demolist
    demolist.append('everything')
    print "after 'everything' was appended demolist is now:"
    print demolist
    print 'len(demolist) =', len(demolist)
    print 'demolist.index(42) =',demolist.index(42)
    print 'demolist[1] =', demolist[1]
    #Просмотрим весь список
    c = 0
    while c < len(demolist):
        print 'demolist[',c,']=',demolist[c]
        c = c + 1
    del demolist[2]
    print "After 'the universe' was removed demolist is now:"
    print demolist
    if 'life' in demolist:
        print "'life' was found in demolist"
    else:
        print "'life' was not found in demolist"
    if 'amoeba' in demolist:
        print "'amoeba' was found in demolist"
    if 'amoeba' not in demolist:
        print "'amoeba' was not found in demolist"
    demolist.sort()
    print 'The sorted demolist is ',demolist

Результат:

    demolist =  ['life', 42, 'the universe', 6, 'and', 7]
    after 'everything' was appended demolist is now:
    ['life', 42, 'the universe', 6, 'and', 7, 'everything']
    len(demolist) = 7
    demolist.index(42) = 1
    demolist[1] = 42
    demolist[ 0 ]= life
    demolist[ 1 ]= 42
    demolist[ 2 ]= the universe
    demolist[ 3 ]= 6
    demolist[ 4 ]= and
    demolist[ 5 ]= 7
    demolist[ 6 ]= everything
    After 'the universe' was removed demolist is now:
    ['life', 42, 6, 'and', 7, 'everything']
    'life' was found in demolist
    'amoeba' was not found in demolist
    The sorted demolist is  [6, 7, 42, 'and', 'everything', 'life']

Этот пример использует множество новых функций. Обратите внимание, вы можете выполнить `print` сразу для целого списка. Далее функция `append` используется, чтобы добавить новый элемент в конец списка. `len` считает количество элементов в списке. Корректные индексы списка (числа, которые можно использовать внутри []) находятся в интервале от 0 до `len – 1`. Функция `index` находит позицию, в которой данный элемент встречается в первый раз. Обратите внимание, что `demolist.index(42)` дает 1, а затем `demolist[1]` дает 42. Строка `#Просмотрим весь список` просто напоминание для программистов (также именуемое комментарием). Python игнорирует все строки, которые начинаются с `#`. Далее следуют команды:

    c = 0
    while c < len(demolist):
        print 'demolist[',c,']=',demolist[c]
        c = c + 1

Создается новая переменная `c`, которая сначала содержит 0, а затем каждый раз увеличивается на 1, пока она не дойдет до последнего индекса списка. Тем временем команда `print` выводит каждый элемент списка.

Команда `del` используется для того чтобы удалить данный элемент списка. Несколько следующих команд используют оператор `in`, чтобы проверить, находится ли данный элемент в списке.

Функция `sort` сортирует список. Это бывает полезным, если вам нужно упорядочить список по возрастанию элементов, или по алфавиту. Очевидно, это перемещает элементы списка на другие позиции.

Как видите, для списка применимы следующие операторы:

пример | объяснение
`list[2]` | доступ к элементу с индексом 2
`list[2] = 3` | присвоение элементу с индексом 2 значения 3
`del list[2]` | удаление элемента с индексом 2
`len(list)` | длина списка
`"value" in list` | истинно, если `“value”` является элементом cписка
`"value" not in list` | истинно, если `“value”` не является элементом cписка
`list.sort()` | сортировка списка
`list.index("value")` | позиция, в которой элемент `“value”` встречается впервые
`list.append("value")` | добавление элемента `“value”` в конец списка

Следующий пример демонстрирует боле полезное применение всего этого:

    menu_item = 0
    list = []
    while menu_item != 9:
            print "--------------------"
            print "1. Print the list"
            print "2. Add a name to the list"
            print "3. Remove a name from the list"
            print "4. Change an item in the list"
            print "9. Quit"
            menu_item = input("Pick an item from the menu: ")
            if menu_item == 1:
                    current = 0
                    if len(list) > 0:
                            while current < len(list):
                                    print current,". ",list[current]
                                    current = current + 1
                    else:
                            print "List is empty"
            elif menu_item == 2:
                    name = raw_input("Type in a name to add: ")
                    list.append(name)
            elif menu_item == 3:
                    del_name = raw_input("What name would you like to remove: ")
                    if del_name in list:
                            item_number = list.index(del_name)
                            del list[item_number]
                            #Вышеприведенные команды удаляет первый элемент
                            #с нужным именем. Следующие команды, добавленые
                            #Жеральдом удаляет все элементы с таким именем.
                            #while del_name in list:
                            #       item_number = list.index(del_name)
                            #       del list[item_number]
                    else:
                            print del_name," was not found"
            elif menu_item == 4:
                    old_name = raw_input("What name would you like to change: ")
                    if old_name in list:
                            item_number = list.index(old_name)
                            new_name = raw_input("What is the new name: ")
                            list[item_number] = new_name
                    else:
                            print old_name," was not found"
    print "Goodbye"

А вот часть результата:

    --------------------
    1. Print the list
    2. Add a name to the list
    3. Remove a name from the list
    4. Change an item in the list
    9. Quit

    Pick an item from the menu: 2
    Type in a name to add: Jack

    Pick an item from the menu: 2
    Type in a name to add: Jill

    Pick an item from the menu: 1
    0 .  Jack
    1 .  Jill

    Pick an item from the menu: 3
    What name would you like to remove: Jack

    Pick an item from the menu: 4
    What name would you like to change: Jill
    What is the new name: Jill Peters

    Pick an item from the menu: 1
    0 .  Jill Peters

    Pick an item from the menu: 9
    Goodbye

Это – длинная программа. Давайте разберем ее. Команда `list = []` создает новый пустой список `list` (без элементов). Следующая важная команда: `while menu_item != 9:`. Эта команда начинает цикл, который позволяет создать пользовательское меню. Несколько следующих команд выводят меню и определяют, какую часть программы выполнять.

Следующая часть

    current = 0
    if len(list) > 0:
            while current < len(list):
                    print current,". ",list[current]
                    current = current + 1
    else:
            print "List is empty"

перебирает список и печатает каждое имя. `len(list_name)` считает количество элементов в списке. Если получаем 0, то список пуст.

После нескольких строк идет команда `list.append(name)`. Она использует функцию `append`, чтобы добавить элемент в конец списка. Переместимся на две строки вниз, где находятся команды:

    item_number = list.index(del_name)
    del list[item_number]

Здесь использована функция `index`, чтобы найти индекс для элемента, который надо удалить, этот индекс будет использован при удалении. `del list[item_number]` удаляет элемент.

Следующая часть

    old_name = raw_input("What name would you like to change: ")
    if old_name in list:
            item_number = list.index(old_name)
            new_name = raw_input("What is the new name: ")
            list[item_number] = new_name
    else:
            print old_name," was not found"

использует функцию `index`, чтобы найти `item_number`, а затем записывает `new_name` на место, где находится `old_name`.

Мои поздравления, теперь, изучив списки, вы знаете о языке достаточно, чтобы проделать любые вычисления, которые может компьютер (технически это называется полнота Тюринга). Конечно же, есть и другие конструкции языка, которые предназначены чтобы упростить вам жизнь.

# Примеры

test.py

    ## Программа на проверку знаний

    true = 1
    false = 0

    # Сначала идут вопросы проверки
    # Позже переделаем это, используя файловый ввод-вывод
    def get_questions():
        # обратите внимание, данные записаны как список списков
        return [["What color is the daytime sky on a clear day?","blue"],\
                ["What is the answer to life, the universe and everything?","42"],\
                ["What is a three letter word for mouse trap?","cat"]]

    # Задаем один вопрос.
    # Вопрос идет как аргумент
    # возвращает истинно, если пользователь ответил правильно, иначе ложно
    def check_question(question_and_answer):
        #извлекаем один вопрос и ответ из списка
        question = question_and_answer[0]
        answer = question_and_answer[1]
        # задаем вопрос пользователю
        given_answer = raw_input(question)
        # сравниваем ответ пользователя с правильным
        if answer == given_answer:
            print "Correct"
            return true
        else:
            print "Incorrect, correct was:",answer
            return false

    # Переберем все вопросы
    def run_test(questions):
        if len(questions) == 0:
            print "No questions were given."
            # return – выход из функции
            return
        index = 0
        right = 0
        while index < len(questions):
            #Проверим вопрос
            if check_question(questions[index]):
                right = right + 1
            #следующий вопрос
            index = index + 1
        #обратите внимание на порядок вычисления:
        #сначала умножение, потом деление
        print "You got ",right*100/len(questions),"% right out of",len(questions)

    #задаем вопросы
    run_test(get_questions())

Sample Output:

    What color is the daytime sky on a clear day?green
    Incorrect, correct was: blue
    What is the answer to life, the universe and everything?42
    Correct
    What is a three letter word for mouse trap?cat
    Correct
    You got  66 % right out of 3

# Упражнения

Улучшите программу test.py, чтобы она давала выбор пройти тест, просмотреть список вопросов и ответов и возможность завершения программы досрочно. Добавьте также еще один вопрос “What noise does a truly advanced machine make?” с ответом “ping”.

Далее: Циклы for Наверх: Курс языка Python для начинающих Назад: Определения функций Содержание