next up previous contents
Далее: Циклы 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”.


next up previous contents
Далее: Циклы for Наверх: Курс языка Python для начинающих Назад: Определения функций   Содержание
Джош Коглиати jjc@honors.montana.edu Версия Wikibooks: Курс языка Python Для начинающих на Wikibooks