Массивы. Основы

Массивы (списки). Введение

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

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

Массивы (списки). Введение

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

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


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

В языке Python как таковых массивов нет. Вместо этого для хранения группы однотипных (но и не только однотипных) объектов используют списки - объекты типа list

Отличие списков от массивов заключается в том, что список - это динамическая структура, размер которого можно изменять во время выполнения программы (удалять, добавлять элементы) не задумываясь над операциями по управлению памятью (это делает транслятор) 
В дальнейшем, разбирая работу со списками, будем использовать слово "массив", так как чаще всего списки используются именно в роли массива (хранят однотипные данные)


Создание массива

При создании массива в памяти выделяется место (определенное число ячеек)
1) Массивы можно создать простым перечислением элементов:
A = [1, 4, 7, 12, 5]
print (type(A)) 
Программа выведет
<class 'list'>
То есть массив - это объект типа list

2) Массивы можно составить из данных любых типов - целых или вещественных чисел, символьных строк 
A = ["Вася", "Петя", "Федя"]
3) Массивы можно "складывать"
A = [1, 5] + [25, 7]
3) Сложение одинаковых массивов можно заменить умножением. Таким образом, легко создать массив, заполненный одинаковыми значениями, например:
A = [0]*10 #создали массив из 10 элементов и заполнили его нулями
4) Массив всегда "знает" свой размер. Для определения размера массива используется функция len. Часто размер массива хранят в отдельной переменной, чтобы была возможность легко изменить программу для работы с другим размером массива. Пример:
N = 10          #в переменной N храним размер массива
A = [0] * N       #создаем массив размера N
print(len(A))  #выводим размер массива
Размер массива можно задавать с клавиатуры.

Обращение к элементу массива

Обращение к элементу массива

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

ЗАПОМНИТЕ!
НУМЕРАЦИЯ МАССИВОВ В PYTHON НАЧИНАЕТСЯ С НУЛЯ!

(Это является обязательным — вы должны начинать с нуля. Это особенно важно запомнить)

Примеры обращения к массиву A:
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)