Хранение данных

Предположим, что вы разработали компьютерную игру под названием "Враждебный пользователь", в которой игроки состязаются с замысловатым и недружественным компьютерным интерфейсом. Теперь вам необходимо написать программу, которая отслеживает ежемесячные объемы продаж этой игры в течение пятилетнего периода. Или, скажем, вам нужно провести инвентаризацию торговых карт героев-хакеров.
Очень скоро вы придете к выводу, что для накопления и обработки информации вам требуется нечто большее, чем простые базовые типы данных.
 

Списки (массивы)

Для того чтобы было удобно работать с большим количеством данных, группе ячеек дают общее имя. Такую группу ячеек называют массивом.
 
Массив – это группа ячеек памяти одинакового типа, расположенных рядом и имеющих общее имя. Каждая ячейка в группе имеет уникальный номер.

При работе с массивами надо научиться решать три задачи:
• выделять память нужного размера под массив;
• записывать данные в нужную ячейку;
• читать данные из ячейки.

 

Массивы в языке Python

В языке Python как таковых массивов нет. Вместо этого для хранения группы однотипных (но и не только однотипных) объектов используют списки - объекты типа list. Отличие списков от массивов заключается в том, что список - это динамическая структура, размер которого можно изменять во время выполнения программы (удалять, добавлять элементы) не задумываясь над операциями по управлению памятью (это делает транслятор).
В дальнейшем, разбирая работу со списками, будем использовать слово "массив", так как чаще всего списки используются именно в роли массива (хранят однотипные данные).
 
Создание массива
При создании массива в памяти выделяется место (определенное число ячеек).
1) Массивы можно создать простым перечислением элементов:
A = [1, 4, 7, 12, 5]
print (type(A)) 
Программа выведет
<class 'list'>
То есть массив - это объект типа list (в переводе с англ. список).

2) Массивы можно составить из данных любых типов - целых или вещественных чисел, символьных строк 
A = ["Вася", "Петя", "Федя"]

Некоторые способы работы с массивами
3) Массивы можно "складывать".
A = [1, 5] + [25, 7]

4) Сложение одинаковых массивов можно заменить умножением. Таким образом, легко создать массив, заполненный одинаковыми значениями, например:
A = [0]*10 # создали массив из 10 элементов и заполнили его нулями

5) Массив всегда "знает" свой размер. Для определения размера массива используется функция len(). Часто размер массива хранят в отдельной переменной, чтобы была возможность легко изменить программу для работы с другим размером массива.

Пример
N = 10          # в переменной N храним размер массива
A = [0] * N     # создаем массив размера N
print(len(A))   # выводим размер массива
Размер массива можно задавать с клавиатуры.

Работа с элементами массива

Большая часть пользы от массивов определяется тем фактом, что к его элементам можно обращаться индивидуально.
Способ, который позволяет это делать, заключается в использовании индекса для нумерации элементов.
 
Индекс - это значение, которое указывает на конкретный элемент массива.

Для обращения к элементу массива необходимо указать имя массива и в квадратных скобках его индекс. Например, записать в элемент массива с индексом 1 значение 100 можно таким образом: A[1] = 100.


Надо запомнить!
НУМЕРАЦИЯ МАССИВОВ В PYTHON НАЧИНАЕТСЯ С НУЛЯ!
(Это является обязательным условием - вы должны начинать с нуля. Это особенно важно запомнить.)
 
Пример
 
x = (A[3] + 5) * A[1] # прочитать значения A[3] и A[1]
A[0] = x + 6          # записать новое значение в A[0]

Разберем программу работы с элементами массива.
i = 1
A = [0] * 5  # создаем массив из 5 элементов 
A[0] = 23    # в каждый из 5 элементов массива (индексы от 0 до 4)
A[1] = 12    # записываем определенное значение
A[2] = 7  
A[3] = 43
A[4] = 51
A[2] = A[i] + 2*A[i-1] + A[2*i] # изменим значение элемента с индексом 2, на результат выражения
                                # т.к i=1, то подставляя значение переменной i в выражение получим
                                # следующее выражение  A[2] = A[1] + 2*A[0] + A[2];
print(A[2] + A[4])


В результате выполнения данной программы на экране появится значение суммы элементов массива с индексом 2 и с индексом 4 равное 116. Как видно из примера, мы можем обращаться к любому элементу массива. А также вычислять необходимый номер элемента по различным формулам (например, как в программе A[i-1] или A[2*i]). В данных случаях индексы элементов будут вычислены и зависят от значения i.

В Python для массивов можно использовать отрицательные значения индексов, при этом отсчет ведется с конца массива. Например:
A[-1] - последний элемент массива
A[-2] - предпоследний элемент
и т.д.

Разберем программу.
N = 5
A = [0] * N 
x = 1
print(A[x - 3])   # обращение к элементу A[-2]
print(A[x - 3 + len(A)])   # обращаемся к элементу A[3]
                           # это тот же самый элемент, что и  A[-2]
A[x + 4] = A[x] + A[2 * (x + 1)]  # после подстановки х в выражения и вычислений 
                                  # получаем следующую строку A[5] = A[1] + A[4]
                                  # A[5] такого элемента не существует
                                  # ошибка - выход за границы массива

Так как массив объявлен из 5 элементов, значит элементы будут иметь нумерацию от -5 до 4. Видим, что программа в 6-й строке обращается к несуществующему элементу: A[5].
Получается, что программа вышла за границы массива.
 
Выход за границы массива - это обращение к элементу с индексом, который не существует в массиве.

В таких случая программа обычно завершается аварийно с ошибкой run-time error.

Перебор элементов массива

При работе с массивами обычно приходится работать сразу со всеми элементами массива.
 
Перебор элементов: просматриваем все элементы массива и, если нужно, выполняем с каждым из них некоторую операцию.

Для этого используется чаще всего цикл с переменной, которая изменяется от 0 до N-1, где N количество элементом массива.
Под N будем считать текущий размер массива, то есть  N = len(A).
...
for i in range(N):
     # здесь работаем с A[i] 
...
В указанном цикле переменная i будет принимать значения 0, 1, 2, ..., N-1.  Таким образом, на каждом шаге цикла мы обращаемся к конкретному элементу массива с номером i.
Таким образом, достаточно описать, что нужно сделать с одним элементом массива A[i] и эти действия поместить внутрь такого цикла.

Напишем программу, которая заполняет массив первыми N натуральными числами, то есть, по окончанию программы элементы массива должны стать равными
A[0] = 1
A[1] = 2
A[2] = 3
...
A[N - 1] = N
Нетрудно заметить закономерность: значение элемента массива должно быть больше на 1, чем индекс элемента.

Цикл будет выглядеть следующим образом
for i in range(N):
     A[i] = i + 1 

Генераторы списков

Язык Python позволяет решать многие задачи кратко и надёжно. Перечислим основные возможности по заполнению массива. 1) Создание и заполнение массива можно записать следующим образом:
A = [i for i in range(N)]   # При N = 5, массив A = [0,1,2,3,4]
A = [i*i for i in range(N)] # При N = 5, массив A = [0,1,4,9,16]
for i in range(N) - перебирает все значения i от 0 до N-1.

В очередной элемент массива будет записано значение, которое стоит перед словом for, в первом случае i, во втором - i*i.

Тот же результат получим при использовании следующей записи:
A = list(range(N))   # при N = 5, массив A = [0,1,2,3,4]

2) Можно записывать в массив не все значения, а только те, что удовлетворяют определенному условию.
 
Пример
Заполнение массива всеми четными числами в диапазоне от 0 до 9.
A = [i for i in range(10)
           if i % 2 == 0]
print(*A)    # массив A = [0,2,4,6,8]
В данном случае нужно понимать, что длина массива будет меньше 10. 

3) Заполнение массива с клавиатуры элементами, которые расположены по одному в строке, можно оформить двумя способами.
 
N = 5
A = [0]*5
for i in range(N):
    A[i] = int(input())
A = [int(input()) for i in range(N)]
# при каждом повторении цикла,  
# введенная строка преобразуется 
# в целое число (с помощью int)
# и это число добавляется к массиву


4) Заполнение массива с клавиатуры элементами, которые все расположены в одной строке немного сложнее. Необходимо считать строку, разбить ее на элементы, а затем каждый элемент преобразовать в целое число
s = input().split() 
A = [int(i) for i in s] 
или так
A = list(map(int, input().split())) # встроенная функция list() 
                                    # преобразует последовательность 
                                    # в изменяемый список

Вывод массива

Выводить массив на экран можно также разными способами.
 
Стандартный способ, используемый во многих языках программирования. Такой цикл можно записать короче. В значение х на каждом шаге цикла заносится очередной элемент массива. В языке Python можно написать и так.
for i in range(len(A)):
    print(A[i], end=" ")
for x in A:
    print(x, end=" ")
print(*A)
# знак * перед именем
# массива означает, что 
# нужно преобразовать 
# массив в набор отдельных значений