Array.array: примеры (PYTHON)
array.array(typecode: str, initializer: iterable): array objectОсновные сведения о функции array.array
Функция array.array() из модуля array создает объект массива, который хранит однородные данные одного типа в более компактной форме по сравнению с обычными списками. Использование массива эффективно при работе с большими объемами числовых данных, где важна экономия памяти и производительность.
Синтаксис функции: array.array(typecode[, initializer])
Параметры:
- typecode - обязательный строковый параметр, определяющий тип данных элементов массива. Определяет, какие данные могут храниться в массиве и занимаемый ими объем памяти.
- initializer - необязательный параметр, который может быть списком, байтоподобным объектом или итерируемым объектом для инициализации массива.
Возвращаемое значение - объект массива типа array.array, поддерживающий основные операции последовательностей: индексацию, срезы, конкатенацию, повторение.
Основные типовые коды:
'b'- знаковое целое (1 байт)'B'- беззнаковое целое (1 байт)'h'- знаковое короткое целое (2 байта)'i'- знаковое целое (2 или 4 байта)'l'- знаковое длинное целое (4 байта)'f'- вещественное одинарной точности (4 байта)'d'- вещественное двойной точности (8 байта)
Базовые примеры использования array.array
Создание массива целых чисел:
import array
arr1 = array.array('i', [1, 2, 3, 4, 5])
print(arr1)array('i', [1, 2, 3, 4, 5])Создание массива вещественных чисел:
arr2 = array.array('f', [1.5, 2.7, 3.0])
print(arr2)array('f', [1.5, 2.700000047683716, 3.0])Инициализация массива из строки байтов:
arr3 = array.array('b', b'Hello')
print(arr3)array('b', [72, 101, 108, 108, 111])Создание пустого массива с последующим добавлением элементов:
arr4 = array.array('d')
arr4.append(3.14)
arr4.extend([2.71, 1.41])
print(arr4)array('d', [3.14, 2.71, 1.41])Альтернативные структуры данных в Python
В Python существуют несколько структур данных, которые могут использоваться вместо array.array:
- list - стандартный список Python. Более гибкий, может содержать элементы разных типов, но занимает больше памяти. Предпочтительнее для общего использования, когда тип данных неоднороден или нужны различные методы работы с коллекциями.
- numpy.ndarray - массив из библиотеки NumPy. Обеспечивает высокую производительность для числовых операций, поддерживает многомерные массивы и векторные операции. Используется в научных вычислениях и анализе данных.
- collections.deque - двусторонняя очередь. Оптимизирована для быстрых операций добавления/удаления с обоих концов. Подходит для реализации очередей и стеков.
- bytearray - изменяемая последовательность байтов. Специализирована для работы с бинарными данными.
array.array целесообразно использовать при работе с большими объемами однотипных числовых данных, когда важна экономия памяти и не требуются сложные математические операции.
Аналоги array.array в других языках программирования
PHP - функция array():
$arr = array(1, 2, 3, 4, 5);
print_r($arr);Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)JavaScript - массив Array:
let arr = new Array(1, 2, 3, 4, 5);
console.log(arr);[1, 2, 3, 4, 5]
Java - класс ArrayList:
import java.util.ArrayList;
ArrayList list = new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list); [1, 2]
C# - массив Array:
int[] arr = new int[] {1, 2, 3, 4, 5};
Console.WriteLine(string.Join(", ", arr));1, 2, 3, 4, 5
Go - срезы (slices):
package main
import "fmt"
func main() {
arr := []int{1, 2, 3, 4, 5}
fmt.Println(arr)
}[1 2 3 4 5]
Основное отличие Python array.array от аналогов в других языках - строгая типизация элементов при сохранении гомогенности данных, что обеспечивает экономию памяти.
Распространенные ошибки при работе с array.array
Несоответствие типа данных типовому коду:
import array
try:
arr = array.array('i', [1, 2.5, 3])
except TypeError as e:
print(f'Ошибка: {e}')Ошибка: integer argument expected, got float
Использование неверного типового кода:
import array
try:
arr = array.array('x', [1, 2, 3])
except ValueError as e:
print(f'Ошибка: {e}')Ошибка: bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)
Операции с массивами разных типов:
import array
arr1 = array.array('i', [1, 2, 3])
arr2 = array.array('f', [1.0, 2.0, 3.0])
try:
result = arr1 + arr2
except TypeError as e:
print(f'Ошибка: {e}')Ошибка: can only concatenate array (not "array") to array
Изменение размера массива во время итерации:
import array
arr = array.array('i', [1, 2, 3, 4, 5])
try:
for i, val in enumerate(arr):
if val == 3:
arr.pop(i)
except RuntimeError as e:
print(f'Ошибка: {e}')Ошибка: array mutated during iteration
Изменения в array.array в последних версиях Python
В Python 3.3 была добавлена поддержка формата 'u' для Unicode символов, но в Python 3.3 она стала устаревшей и удалена в Python 3.12. В Python 3.4 улучшена производительность операций с массивами. Начиная с Python 3.9, улучшена совместимость с аннотациями типов. В Python 3.11 оптимизирована работа методов массива для повышения производительности. Для типовых кодов 'q' и 'Q' (long long) в 64-битных системах обеспечена корректная работа на различных платформах.
Расширенные примеры работы с array.array
Использование памяти массива через буферный протокол:
import array
arr = array.array('d', [1.0, 2.0, 3.0, 4.0])
# Получение raw буфера
buffer = memoryview(arr)
print(f'Буфер: {buffer.tolist()}')Буфер: [1.0, 2.0, 3.0, 4.0]
Конвертация массива в bytes и обратно:
import array
arr = array.array('B', [65, 66, 67, 68])
bytes_data = arr.tobytes()
print(f'Байты: {bytes_data}')
new_arr = array.array('B')
new_arr.frombytes(bytes_data)
print(f'Восстановленный массив: {new_arr}')Байты: b'ABCD'
Восстановленный массив: array('B', [65, 66, 67, 68])Использование массива для бинарного файла:
import array, tempfile
arr = array.array('i', range(10))
with tempfile.NamedTemporaryFile(mode='wb', delete=False) as f:
arr.tofile(f)
filename = f.name
new_arr = array.array('i')
with open(filename, 'rb') as f:
new_arr.fromfile(f, 10)
print(f'Прочитанный массив: {new_arr.tolist()}')Прочитанный массив: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Массивы для работы с аудиоданными:
import array, math
# Генерация синусоидального сигнала
sample_rate = 44100
frequency = 440
duration = 1
samples = array.array('h')
for i in range(int(sample_rate * duration)):
value = int(32767 * math.sin(2 * math.pi * frequency * i / sample_rate))
samples.append(value)
print(f'Сгенерировано {len(samples)} сэмплов')
print(f'Первые 5 значений: {samples[:5]}')Сгенерировано 44100 сэмплов
Первые 5 значений: array('h', [0, 2057, 4107, 6140, 8140])Массивы с пользовательским типом данных:
import array
# Использование беззнаковых целых для хранения RGB значений
pixels = array.array('B', [255, 0, 0, 0, 255, 0, 0, 0, 255])
print(f'RGB пиксели: {pixels.tolist()}')RGB пиксели: [255, 0, 0, 0, 255, 0, 0, 0, 255]