Вопросы:
· Массивы и списки.
· Создание, ввод и вывод списков.
· Перебор элементов списка.
Итак, массивом называется группа переменных одного типа (элементов массива), имеющих общее имя и расположенных в оперативной памяти компьютера, непосредственно друг за другом. У каждого элемента массива есть свой уникальный номер, который называется индексом. Именно через индекс можно обратиться к конкретному элементу массива.
Многие из вас уже наверняка поняли, что благодаря массивам, ограничения по количеству данных для программы становятся не такими жёсткими, однако в языке Python нет массивов. Вместо них в языке Python используются списки. Списком в языке Python называется набор элементов, каждый из которых имеет свой уникальный идентификационный номер (индекс). Нумерация элементов списка начинается с 0, а не с 1. Таким образом, второй по счёту элемент списка имеет номер 1, третий – 2 и так далее... Списки хранятся в переменных типа list, что в переводе на русский язык означает «список».
Главное отличие списка от массива состоит в том, что список – это динамическая структура. Практически это означает в отличии от массива количество элементов в списке может изменяться при выполнении программы. Одни элементы списка могут добавляться, другие – удаляться. Таким образом, при объявлении массива нужно продумывать количество выделяемой для него оперативной памяти. Для списков же всё управление оперативной памятью берёт на себя интерпретатор языка.
Рассмотрим, как можно создать список. Прежде всего, для этого можно в квадратных скобках через запятую перечислить значения его элементов.
a = [1, 2, 3, 4, 5]
Также в языке Python можно использовать сложение списков. Список, которой показан в первом случае, можно создать так:
a = [1, 2, 3] + [4, 5].
Сложение списков с одинаковыми элементами можно заменить умножением. Так, например, можно создать список из десяти элементов, в котором будут чередоваться единица и ноль.
a = [1, 0] * 5
Когда требуется задать более сложный список можно использовать специальные выражения-генераторы. Допустим, что нам нужно создать список, заполненный индексами своих элементов. В этом случае можно использовать следующую запись:
a = [i for i in range (10)].
Функция range означает, что значение i будет изменяться от 0 до 9. При этом каждый раз будет создаваться новый элемент списка a, которому будет присваиваться значение i. Для создания этого списка можно было воспользоваться функцией
a = list (range (10)).
Таким образом, был бы создан список, заполненный результирующими данными функции range. Для того, чтобы задать список, заполненный квадратами индексов своих элементов, в предыдущем выражении достаточно заменить i на i ** 2 или i * i. Также изменив это выражение можно задать список, заполненный случайными числами на заданном промежутке. Для этого сперва нужно загрузить функцию randint из модуля random. После чего в качестве значений элементов списков указывать значение функции randint с соответствующими параметрами.
a = [randint (1, 7) for i in range (10)]
Также при создании списков можно использовать критерии отбора значений. Допустим, что нам нужно создать список, который будет содержать все простые числа на заданном промежутке. Для того, чтобы определить, является ли число простым мы можем использовать логическую функцию isSimple из модуля SimpleNum, описанного нами ранее. Для создания заданного списка можно использовать следующее выражение:
a = [i for i in range (20) if isSiple (i)]
После слова if в нём следует критерий отбора. Таким образом в список a попадут лишь те результаты функции range для которых этот критерий выполняется.
Длиной списка называется количество элементов, которые в нём находятся на данный момент. Для того, чтобы определить длину списка, достаточно вызвать функцию len от этого списка. len является сокращением от английского слова «length», что в переводе на русский язык означает «длина».
Мы научились создавать списки, но предположим, что нам нужно задать элементы списка с клавиатуры. Некоторые из вас уже наверняка догадались, что для создания списка из n элементов, значения которых будут заданы с клавиатуры достаточно записать следующую инструкцию.
a = [input () for i in range (n)]
Таким образом, пользователю будет нужно вводить значение каждого элемента списка в новой строке, однако так пользователь может запутаться при вводе. Чтобы этого не случилось, мы должны выводить на экран некоторые подсказки, но тогда этот вариант нам не подходит. Но мы можем поступить иначе. Если нам нужно задать список из n элементов с клавиатуры, создадим сперва пустой список – a. Для этого достаточно после знака равенства указать пустые квадратные скобки.
a = []
Запишем цикл, с параметром i, изменяющимся в диапазоне от 0 до n, не включая последнее. В нём с помощью инструкции print без перехода на следующую строку выведем на экран запрос на ввод элемента списка с индексом i. После чего мы запишем инструкцию добавления к текущему списку a, списка из одного элемента, значение которого задаётся с клавиатуры.
a = []
for i in range (n):
a = a + [input ()]
Возможен и другой вариант ввода списка, когда значения его элементов перечисляются в одну строку, например через пробел. Тогда значения элементов списка вместе с разделителями будут считаны в одну текстовую строку. Мы можем разделить эту строку, используя метод split. Он возвращает части исходной строки, выделенные между заданными разделителями, по умолчанию это пробелы.
s = input ().split ()
Так мы получим список текстовых строк. Для того, чтобы получить список целых чисел, нужно преобразовать все элементы этого списка в целочисленный тип int в генераторе списка.
a = [s[i] for i in range (len (s))]
Хотя генератор списка было использовать не обязательно. Вместо него можно использовать функцию map.
a = list (map (int, s))
Такая запись означает, что будет создан новый список a, из списка s, к каждому из элементов которого будет применена функция int.
Часто нужно вывести элементы списка на экран. Самый простой способ это сделать – вывести список на экран как одну переменную.
print (a)
Тогда на экран будут выведены квадратные скобки, в которых через запятую будут перечислены значения элементов списка.
[1, 2, 3, 4, 5]
Список можно вывести также поэлементно. Для этого можно записать цикл с параметром i, из меняющимся от 0 до длины списка, не включая последнюю. А в цикле записать инструкцию print для вывода на экран элемента списка a[i]. При поэлементном выводе списков нужно использовать разделители, иначе они сольются в одну строку.
for i in range (len (a)):
print (a[i], sep = '')
Однако этот цикл можно переписать иначе. Для этого достаточно вспомнить что в цикле с параметром, для того чтобы указать значения параметра можно использовать список.
for x in a:
print (x, sep = '')
При такой записи параметр x будет поочерёдно принимать значения элементов списка a, по возрастанию индексов. И нам будет достаточно выводить значения самого параметра.
Более быстрый способ – вывести на экран символьную строку, сформированную из элементов списка. Для этого используется противоположный методу split метод join. Он принимает на вход список текстовых строк и соединяет их в одну строку через указанный разделитель. Для этого нужно преобразовать значения элементов списка в строковые.
print (' '.join (str (x) for x in a))
Часто для обработки некоторой информации из списка нужно перебрать его элементы и возможно выполнить над ними некоторый набор операций. Это можно сделать двумя способами. Если значения элементов списка изменять не нужно – достаточно написать для этого цикл с параметром, который принимает значения элементов списка. Если же значения элементов списка будут изменяться, то в цикле лучше перебирать индексы элементов списка, а к самим элементам обращаться уже через их индексы.
Рассмотрим задачу. Написать программу, которая принимает на вход массив из 5 целых чисел, после чего возводит значения всех его элементов в квадрат и выводит получившийся массив на экран.
Начнём написание программы. Объявим пустой список a и с помощью инструкции print выведем на экран запрос на ввод элементов исходного массива. Теперь опишем цикл для добавления элементов в список. Это будет цикл с параметром i, изменяющимся от 1 до 6, не включая последнее. В этом цикле запишем инструкцию print, выводящую на экран запрос на ввод i-того элемента массива a без перехода на следующую строку. Теперь запишем инструкцию присваивания переменной a текущего списка a, соединённого со списком из одного элемента, значение которого пользователь введёт с клавиатуры.
Теперь запишем цикл для возведения элементов массива в квадрат. Это будет цикл с параметром i, изменяющимся от 0 до 4. В теле цикла запишем команду присваивания i-тому элементу списка a, его текущего значения, возведённого в квадрат. Дальше с помощью инструкции print выведем элементы изменённого массива на экран. Для этого в инструкции запишем текстовое сообщение «Изменённый массив:», а также метод join, с пробелом в качестве разделителя соединяющий воедино элементы списка a, преобразованные в строки.
a = []
print ('Исходный массив:')
for i in range (1, 6):
print ('a[', i, '] =', sep = '', end = ' ')
a = a + [int (input ())]
for i in range (0, 5):
a [i] = a[i] ** 2
print ('Изменённый массив:', ' '.join (str (i) for i in a))
Сохраним написанный модуль и запустим его на выполнение. Зададим элементы списка равными 1, 2, 3, 4 и 5 соответственно. Программа вывела новый массив из элементов равных соответственно 1, 4, 9, 16 и 25. Программа работает правильно. Задача решена.
Однако эту же задачу можно решить проще. Удалим из программы цикл изменения массива. Вместо него запишем выражение-генератор, присваивающее переменной a, значение нового, списка состоящего из элементов списка a, возведённых в квадрат.
a = []
print ('Исходный массив:')
for i in range (1, 6):
print ('a[', i, '] =', sep = '', end = ' ')
a = a + [int (input ())]
a = [i ** 2 for i in a]
print ('Изменённый массив:', ' '.join (str (i) for i in a))
Сохраним изменённый модуль и запустим его на выполнение. Зададим те же значения элементов массива, что и в прошлый раз. Результат работы программы тоже совпадает с предыдущим. Изменённая программа работает правильно.
Рассмотрим ещё одну задачу. Написать функцию, вычисляющую среднее арифметическое элементов списка и протестировать её. Средним арифметическим нескольких чисел называется их сумма, делённая на их количество.
Начнём написание функции. Назовём нашу функцию average. Она будет иметь один параметр – список, среднее арифметическое элементов которого нужно вычислить, назовём его a. В теле функции объявим переменную s и присвоим ей значение 0. Напишем цикл для вычисления суммы элементов списка. Это будет цикл с параметром x, принимающим значения элементов списка a. В этом цикле мы будем увеличивать значение переменной s на x. По завершении работы цикла напишем инструкцию возврата, которая вернёт значение суммы элементов списка – s делённую на его длину, вычисленную с помощью функции len.
def average (a):
s = 0
for x in a:
s = s + x
return s / len (a)
Сохраним модуль и запустим его на выполнение. Вызовем нашу функцию для списка из чисел 10, 15, 1, 6 и 3. Их сумма равна 35, а всего их 5. Таким образом, их среднее арифметическое равно 7. Функция работает правильно. Задача решена.
Но и эту задачу можно решить проще. Так как поиск суммы элементов списка – распространённая операция. Для её вычисления есть специальная функция sum. Таким образом всё тело функции можно заменить инструкцией возврата суммы элементов списка a, делённой на его длину.
def average (a):
return sum (a) / len (a)
Сохраним изменённый модуль и запустим его на выполнение. Вызовем функцию для тех же чисел, что и в прошлый раз. Результат её работы не изменился. Функция работает правильно.
Мы узнали:
· Cписок – это набор элементов, которые хранятся под одним именем, каждый из которых имеет уникальный идентификационный номер (индекс).
· Обращение к элементам списков осуществляется через индексы.
· Список – это динамическая структура. Это означает что его длина может изменяться при выполнении программы.