Классических массивов по умолчанию в Python нет: их функции выполняют списки. Однако при необходимости функция создания массивов может быть вызвана. Поэтому утверждать, что массивы в Python отсутствуют, не совсем корректно — они всё же есть, просто добавляются путем импорта особой функции, о чём мы и будем говорить далее.
Главное различие между ними заключается в том, что списки могут хранить разнородные данные, а массивы — только данные одного типа. Например, только строки или только числа, причем отдельно целые и отдельно с плавающей запятой. Поэтому вот такой список в Python:
list = ['element1', 'element2', 'element3']
одновременно выполняет и функции массива. Как видим, элементы списка располагаются внутри квадратных скобок и перечисляются через запятую. Здесь мы взяли для примера строки. Рассмотрим еще один пример:
>>> different = ['55', 'string', '32.5', ['list_in_list', '55', 'string', '32.5']]
>>> print(different)
['55', 'string', '32.5', ['list_in_list', '55', 'string', '32.5']]
Это тоже список с функциями массива, поскольку все элементы здесь оформлены в виде строк. А теперь давайте напишем следующее:
>>> different2 = [55, 'string', 32.5, ['list_in_list', '55', 'string', '32*8']]
>>> print(different2)
[55, 'string', 32.5, ['list_in_list', '55', 'string', '32*8']]
Такой список уже не является классическим массивом, поскольку он объединяет разнородные элементы: целое число, строку, число с плавающей запятой и список. То есть получается, списки включают в себя функции массивов, но их собственные функции шире.
Здесь и возникает логичный вопрос: а зачем вызывать отдельный модуль для создания массивов, если можно пользоваться списками, которые включают в себя обе функции? На это есть всего одна, но веская причина: вызываемые массивы отличаются большей компактностью и меньшим потреблением памяти. Это полезно при работе с ресурсоемкими приложениями и при выполнении низкоуровневых операций.
Далее мы не будем рассматривать классические списки (lists
), по которым написаны отдельные статьи, а сосредоточимся на работе с вызываемыми массивами. Они импортируются при помощи модуля array
. Важное замечание: функция array
позволяет создавать массивы только из целочисленных значений и чисел с плавающей запятой. Также пока поддерживаются символы Unicode, но поддержку Юникода планируется убрать в следующих версиях Python (начиная с 4.0). Поэтому сосредоточимся на значениях int
и float
.
Итак, функция array
делает доступными массивы в программе на Python. Вызывается она по-разному, удобнее сделать так (минимизирует число последующих ошибок):
from array import *
Разумеется, эта команда, как и другие общие инструкции, должна быть указана в «шапке» кода, то есть в самом верху.
Чтобы создать массив, воспользуйтесь следующим шаблоном:
array_name = array(typecode,[ ])
Рассмотрим каждый элемент массива подробнее:
array_name
— имя (можно задать любое, помня о правилах создания переменных в Python);array
— собственно функция;typecode
— тип хранимых данных (для целочисленных значений обычно указывают i
, а для чисел с плавающей запятой чаще используют d
);[ ]
— здесь через запятую перечисляются элементы массива.Теперь попробуем создать простейший массив:
>>> from array import *
>>> integers = array('i',[1,2,3,4,5])
>>> print(integers)
array('i', [1, 2, 3, 4, 5])
Получилось. Давайте создадим массив с числами с плавающей запятой:
>>> from array import *
>>> floats = array('d',[3.5,7.2,5.3,9.5,4.0])
>>> print(floats)
array('d', [3.5, 7.2, 5.3, 9.5, 4.0])
А что будет, если в первом примере мы заменим целое число на число с плавающей запятой?
>>> integers = array('i',[1,2,3,4,5.2])
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
integers = array('i',[1,2,3,4,5.2])
TypeError: integer argument expected, got float
Предсказуемая ошибка, интерпретатор пишет, что ожидает целочисленный аргумент. С другой стороны:
>>> floats = array('d',[3.5,7.2,5.3,9.5,4])
>>> print(floats)
array('d', [3.5, 7.2, 5.3, 9.5, 4.0])
Здесь мы представили последнее число в виде целого, однако ошибки не случилось: интерпретатор смог привести его к нужному виду в выводе.
клауд
С массивами, как и со списками, можно выполнять различные операции.
len()
позволяет подсчитать количество элементов:>>> integers = array('i',[1,2,3,4,5])
>>> print(len(integers))
5
print(array[number])
:>>> floats = array('d',[3.5,7.2,5.3,9.5,4.0])
>>> print(floats[0])
3.5
>>> print(floats[4])
4.0
>>> print(floats[1])
7.2
Обратите внимание, что нумерация в Python всегда начинается с нуля, поэтому, чтобы вызвать первый элемент, мы вводим print(floats[0])
. Соответственно, пятый элемент идет под номером 4. А что будет, если попробовать вызвать элемент за границами массива?
>>> print(floats[5])
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
print(floats[5])
IndexError: array index out of range
Интерпретатор выдает сообщение об ошибке и пишет, что индекс как раз и находится за пределами. Иногда может потребоваться отрицательная индексация. В этом случае отсчет начинается с последнего элемента, который получает индекс -1:
>>> print(floats[-1])
4.0
>>> print(floats[-2])
9.5
>>> print(floats[-5])
3.5
При отрицательной индексации модуль 5 у нас отрабатывается корректно, поскольку нумерация в этом случае начинается не с нуля.
for
:>>> floats = array('d',[3.5,7.2,5.3,9.5,4.0])
>>> for d in floats:
print(d)
3.5
7.2
5.3
9.5
4.0
>>> floats[1] = 8.2
>>> print(floats)
array('d', [3.5, 8.2, 5.3, 9.5, 4.0])
Значение второго элемента было 7.2, но мы присвоили ему новое — 8.2.
append()
:>>> integers = array('i',[1,2,3,4,5])
>>> integers.append(6)
>>> print(integers)
array('i', [1, 2, 3, 4, 5, 6])
Главное, чтобы добавляемый элемент относился к тому же типу данных, что и уже имеющиеся в массиве, иначе интерпретатор выдаст такую ошибку:
>>> integers.append(7.0)
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
integers.append(7.0)
TypeError: integer argument expected, got float
В типе ошибки указано, что вместо ожидаемого целочисленного значения было введено число с плавающей запятой. С другой стороны, преобразование введенного целого числа в число с плавающей запятой здесь снова возможно (но всё же так поступать не совсем корректно):
>>> floats = array('d',[3.5,7.2,5.3,9.5,4.0])
>>> floats.append(8)
>>> print(floats)
array('d', [3.5, 7.2, 5.3, 9.5, 4.0, 8.0])
extend()
. Вводим далее в интерпретаторе:>>> floats.extend([4.5,5.7,6.9])
>>> print(floats)
array('d', [3.5, 7.2, 5.3, 9.5, 4.0, 8.0, 4.5, 5.7, 6.9])
insert()
. Делается это так (используем всё тот же измененный массив с floats
из примера выше):>>> floats.insert(1,2.3)
>>> print(floats)
array('d', [3.5, 2.3, 7.2, 5.3, 9.5, 4.0, 8.0, 4.5, 5.7, 6.9])
Мы вставили число 2.3 на вторую позицию (помним про нумерацию, которая начинается с нуля, поэтому вторая позиция будет под номером 1).
remove()
:>>> floats.remove(7.2)
>>> print(floats)
array('d', [3.5, 2.3, 5.3, 9.5, 4.0, 8.0, 4.5, 5.7, 6.9])
А вот, что произойдет, если в массиве несколько элементов с одинаковым значением:
>>> integers = array('i',[11,12,13,14,15,11,11])
>>> integers.remove(11)
>>> print(integers)
array('i', [12, 13, 14, 15, 11, 11])
Удалилось только первое значение 11, а остальные остались в массиве. Для удаления элемента на конкретной позиции предназначен метод pop()
:
>>> integers = array('i',[11,12,13,14,15,11,11])
>>> integers.pop(5)
11
>>> print(integers)
array('i', [11, 12, 13, 14, 15, 11])
Число 11 на шестой позиции было удалено из массива.
Выгодные тарифы на облачные серверы
Сегодня мы познакомились с массивами в Python, научились создавать их и выполнять различные операции с ними. Также выяснили, в чём преимущество вызываемых массивов перед стандартными списками, которые часто выполняют в Python функции обеих этих структур.