Работа с массивами в Python: полное руководство

Массивы в Python используются для хранения множества элементов одного типа, которые могут быть доступны по индексу или ключу. Понимание работы с массивами является критически важным для эффективного программирования на Python и может помочь ваши программы стать более эффективными и менее объемными.

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

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

Что такое массивы в Python?

Массив — это структура данных, которая позволяет хранить набор значений одного типа под одним именем. В Python массивы являются частью стандартной библиотеки и представлены модулем array.

Массивы в Python могут быть одномерными и многомерными. Одномерный массив представляет собой список элементов, разделенных запятыми и заключенных в квадратные скобки. Многомерный массив — это массив, элементы которого также являются массивами (также вложенные в квадратные скобки).

Типы элементов массива могут быть различными: целые числа, числа с плавающей запятой, строки и другие.

Массивы в Python — это мощное средство для работы с данными. Они позволяют выполнять быстрые операции над массивами большого размера и обрабатывать данные быстрее, чем при использовании обычных списков.

Пример использования массива в Python:

import array

a = array.array('i', [1, 2, 3, 4, 5])

print(a)

В этом примере мы создаем одномерный массив целых чисел, который состоит из элементов 1, 2, 3, 4 и 5. Код выводит содержимое массива в консоль.

Определение и основные характеристики

Массив — это структура данных в Python, которая позволяет хранить набор значений в одной переменной. В массиве значения могут быть различных типов — числа, строки, другие массивы и т.д.

Основные характеристики:

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

Для работы с массивами в Python используются специальные методы и функции. Одним из основных методов является list(), который позволяет создать пустой массив или массив с начальными значениями. Также существуют функции для работы с элементами массива, например, append() — для добавления элемента в конец массива, pop() — для удаления последнего элемента массива и т.д.

Массивы являются важной и часто используемой структурой данных в программировании, и понимание их принципов и особенностей — необходимая базовая компетенция для Python-разработчика.

Примеры использования массивов

Массивы могут использоваться для хранения и обработки большого количества данных. Ниже представлены несколько примеров использования массивов в Python:

  • Хранение данных: Массивы могут использоваться для хранения различных типов данных, таких как числа, строки, объекты и т.д. Например, можно создать массив, содержащий список имен сотрудников:

«`python

employees = [«Иванов», «Петров», «Сидоров»]

«`

  • Операции с элементами массива: Используя индексы, можно получать и изменять элементы массива. Например, можно изменить второй элемент массива:

«`python

employees[1] = «Новиков»

«`

  • Перебор элементов массива: Можно перебирать элементы массива с помощью цикла for. Например, можно вывести на экран список всех сотрудников:

«`python

for employee in employees:

print(employee)

«`

  • Сортировка элементов массива: Массивы могут быть отсортированы по возрастанию или убыванию значений. Например, можно отсортировать список сотрудников в алфавитном порядке:

«`python

employees.sort()

«`

  • Фильтрация элементов массива: Массивы могут быть отфильтрованы для получения подмассива, соответствующего заданным условиям. Например, можно получить список сотрудников, чьи имена начинаются на букву «И»:

«`python

filtered_employees = [employee for employee in employees if employee.startswith(«И»)]

«`

Использование массивов позволяет более эффективно обрабатывать и хранить данные в Python.

Создание и инициализация массивов в Python

В Python массивы могут быть созданы инициализированы несколькими способами. Один из способов — использование функции array из модуля array.

Инициализация массива с помощью функции array:

Массив создается с помощью функции array и может содержать элементы одного типа, как, например, целые числа, числа с плавающей точкой или символы.

Пример:

from array import array

my_array = array('i', [1, 2, 3, 4, 5])

Вышеуказанный код создает массив с целочисленными элементами и размером 5.

Создание массива с помощью функции list:

Массивы могут быть созданы с помощью функции list. Эта функция создает список элементов, который может быть преобразован в массив с помощью функции array.

Пример:

my_list = [1, 2, 3, 4, 5]

my_array = array('i', my_list)

Вышеуказанный код создает массив из списка с целочисленными элементами.

Создание многомерного массива:

Многомерный массив может быть создан с помощью функции array и вложенных списков.

Пример:

my_array = array('i', [[1, 2, 3], [4, 5, 6], [7, 8, 9]])

Вышеуказанный код создает двумерный массив с целыми числами.

Способы создания массивов

В Python есть несколько способов создания массивов. Вот некоторые из них:

  • Литералы массивов: Можно определить массив с помощью литералов массивов. Литерал массива — это список элементов, разделенных запятыми, заключенных в квадратные скобки. Например: [1, 2, 3, 4].
  • Использование функции array: Функция array используется для создания массивов, и это один из наиболее распространенных способов создания массивов в Python. Этот способ часто используется, когда важно иметь массив с определенными типами данных. Например: array(‘i’, [1, 2, 3, 4]), где ‘i’ обозначает тип данных, используемый в массиве (целочисленные числа).
  • Использование функции linspace: Функция linspace создает массив заданной длины, заполненный равномерно распределенными значениями. Например: linspace(0, 1, 10), где 0 и 1 — начальное и конечное значения, а 10 — количество элементов в массиве.

Это не полный список всех способов создания массивов в Python, но это некоторые из самых распространенных. Важно выбрать метод создания массива, который наиболее соответствует конкретной задаче, так как каждый метод имеет свои особенности.

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

Работа с элементами массива в Python очень важна в любой программе. Для работы с элементами массива используется индексация. Индекс — это порядковый номер элемента в массиве, начинается с нуля. Также, индекс может быть отрицательным числом, в этом случаеся элемент выбирается с конца массива, начиная с -1 и так далее.

Для получения элемента массива используется оператор [] с индексом внутри скобок. Например:

arr = [10, 20, 30, 40, 50]

print(arr[0]) # выведет 10

print(arr[-1]) # выведет 50

Также, можно изменять значения элементов массива. К примеру:

arr[2] = 100

Теперь массив выглядит следующим образом:

[10, 20, 100, 40, 50]

Если нужно добавить элемент в конец массива, то используется метод append(). Например:

arr.append(60)

Теперь массив выглядит следующим образом:

[10, 20, 100, 40, 50, 60]

Также можно использовать циклы for для перебора элементов массива:

for x in arr:

 print(x)

Или же перебор с помощью индексов:

for i in range(len(arr)):

 print(arr[i])

Используя эти методы, можно работать с элементами массива в Python и создавать различные алгоритмы и программы.

Основные операции с массивами в Python

Создание массива. Для создания массива в Python можно использовать несколько способов. Например, можно создать пустой массив и заполнить его позже при помощи методов append() или extend(). Также можно задать массив явно при помощи квадратных скобок [ ] и заполнить его элементами сразу.

Добавление и удаление элементов. Для добавления элемента в конец массива можно использовать метод append(). Если нужно добавить несколько элементов за раз, можно воспользоваться методом extend(). Элементы можно удалять при помощи методов remove() и pop(). Метод remove() удаляет первый встретившийся элемент с заданным значением. Метод pop() удаляет элемент с заданным индексом или последний элемент, если индекс не задан.

Обращение к элементам массива. Чтобы получить доступ к элементу массива, нужно использовать индекс. Индексация начинается с нуля, то есть первый элемент имеет индекс 0, второй — индекс 1 и так далее. Чтобы получить последний элемент массива, можно использовать индекс -1.

Срезы массива. Срезы позволяют получать подмассивы из основного массива. Для этого используются два индекса, разделенных двоеточием. Например, arr[1:4] вернет массив, состоящий из элементов с индексами 1, 2 и 3. Если первый индекс опущен, считается, что он равен нулю. Если второй индекс опущен, считается, что он равен длине массива.

Сортировка массива. Для сортировки массива в Python можно использовать метод sort(). Если нужно отсортировать массив в обратном порядке, можно добавить аргумент reverse=True. Также можно использовать функцию sorted(), которая возвращает новый отсортированный массив, не изменяя оригинальный.

Перебор элементов массива. Для перебора элементов массива в Python можно использовать цикл for. Пример: for element in arr: print(element)

Добавление и удаление элементов

В Python существует несколько способов добавления и удаления элементов в массивы.

Добавление элементов

  • append() — добавляет элемент в конец массива:
  • arr = [1, 2, 3]
    arr.append(4)
    print(arr)
    [1, 2, 3, 4]
  • insert() — добавляет элемент в указанный индекс массива:
  • arr = [1, 2, 3]
    arr.insert(1, 4)
    print(arr)
    [1, 4, 2, 3]
  • extend() — добавляет элементы из другого массива в конец текущего:
  • arr1 = [1, 2]
    arr2 = [3, 4]
    arr1.extend(arr2)
    print(arr1)
    [1, 2, 3, 4]

Удаление элементов

  • remove() — удаляет указанный элемент из массива:
  • arr = [1, 2, 3]
    arr.remove(2)
    print(arr)
    [1, 3]
  • pop() — удаляет последний элемент из массива и возвращает его значение:
  • arr = [1, 2, 3]
    value = arr.pop()
    print(arr)
    [1, 2]
    print(value)
    3
  • del — удаляет элемент по указанному индексу:
  • arr = [1, 2, 3]
    del arr[1]
    print(arr)
    [1, 3]

Сортировка и поиск элементов

Сортировка массива. Используя функции Python, можно отсортировать элементы в массиве в порядке возрастания или убывания. Для этого используют две встроенные функции: sort() и sorted(). Функция sort() используется для модификации исходного массива, а sorted() — чтобы создать новый отсортированный массив, который можно присвоить другому имени переменной. Массив может быть отсортирован по алфавиту, числовым значениям, длине элементов и другим критериям.

Поиск элемента в массиве. Для поиска определенного элемента в массиве, можно использовать встроенную функцию index(). Функция принимает один аргумент — значение, которое нужно найти в массиве, и возвращает индекс первого вхождения этого элемента. Если такого элемента в массиве нет, функция генерирует исключение ValueError. Еще один способ поиска элемента — это использование оператора in. Он возвращает True, если элемент найден в массиве, и False в противном случае. Также существует функция count(), которая позволяет подсчитать количество вхождений определенного элемента в массиве.

Бинарный поиск. Для поиска элемента в отсортированном массиве быстрее, чем простым перебором всех элементов, можно использовать алгоритм бинарного поиска. Он работает следующим образом: сначала определяется середина массива, затем сравнивается значение элемента в середине с искомым значением. Если искомое значение больше, чем значение в середине, поиск продолжается только в верхней половине массива, если меньше — только в нижней половине. Этот алгоритм работает намного быстрее, чем простой поиск, особенно для больших отсортированных массивов.

Реверсирование массива. Можно изменить порядок элементов в массиве, используя метод reverse(). Эта функция меняет порядок элементов в массиве на противоположный. Например, если массив был [1, 2, 3], то после вызова метода reverse() он станет [3, 2, 1].

Практическое применение. Знание методов сортировки и поиска элементов в массивах — важная часть программирования на Python. Эти методы могут быть полезными при работе с большими объемами данных, поиске конкретных элементов в базах данных или реализации пользовательских алгоритмов. Необходимо помнить, что многие задачи могут быть решены с помощью готовых функций Python, но иногда приходится создавать собственные алгоритмы, которые находятся за пределами стандартной библиотеки.

Работа с многомерными массивами

Массивы в Python могут иметь не только одну, но и много измерений, то есть быть многомерными. Это позволяет организовать и удобно хранить данные различных типов и структур. Работа с многомерными массивами в Python осуществляется с помощью модуля NumPy.

В NumPy для работы с массивами используется функция numpy.array(), которая позволяет создавать массивы заданной формы и типа данных. Форма созданного массива определяется числом измерений и их размерами.

Для работы с многомерными массивами в Python используются различные операции, такие как извлечение элементов, изменение формы массива, выполнение математических операций и многое другое. Например, для извлечения элементов из многомерного массива можно использовать индексацию, указывая номер измерения и позицию.

Кроме этого, с помощью функции numpy.reshape() можно изменять форму массива, указывая новый набор размеров измерений. Для выполнения математических операций с многомерными массивами используются различные функции модуля NumPy, такие как numpy.sum(), numpy.mean(), numpy.dot() и другие.

Все функции модуля NumPy для работы с многомерными массивами имеют высокую скорость работы и оптимизированы для работы с большими объемами данных. Благодаря этому, NumPy является одним из наиболее популярных и эффективных инструментов для работы с многомерными массивами в Python.

Примеры задач на массивы в Python

1. Нахождение максимального и минимального значения в массиве

Для нахождения максимального и минимального значения в массиве можно использовать встроенные функции max() и min(). Например:

arr = [10, 5, 20, 15, 30]

max_val = max(arr)

min_val = min(arr)

print("Максимальное значение:", max_val)

print("Минимальное значение:", min_val)

2. Сумма элементов массива

Для нахождения суммы элементов массива можно использовать встроенную функцию sum(). Например:

arr = [10, 5, 20, 15, 30]

sum_val = sum(arr)

print("Сумма элементов:", sum_val)

3. Поиск индекса элемента в массиве

Чтобы найти индекс элемента в массиве, можно использовать метод index(). Например, чтобы найти индекс элемента со значением 15:

arr = [10, 5, 20, 15, 30]

index_val = arr.index(15)

print("Индекс элемента 15:", index_val)

4. Сортировка массива

Для сортировки массива можно использовать метод sort(). Например, чтобы отсортировать массив по возрастанию:

arr = [10, 5, 20, 15, 30]

arr.sort()

print("Отсортированный массив:", arr)

5. Обращение порядка элементов массива

Чтобы обратить порядок элементов массива, можно использовать метод reverse(). Например:

arr = [10, 5, 20, 15, 30]

arr.reverse()

print("Перевернутый массив:", arr)

6. Удаление элемента из массива

Для удаления элемента из массива можно использовать метод remove(). Например, чтобы удалить элемент со значением 20:

arr = [10, 5, 20, 15, 30]

arr.remove(20)

print("Массив после удаления элемента:", arr)

7. Добавление элемента в массив

Чтобы добавить элемент в конец массива, можно использовать метод append(). Например, чтобы добавить элемент со значением 25:

arr = [10, 5, 20, 15, 30]

arr.append(25)

print("Массив после добавления элемента:", arr)

8. Объединение двух массивов

Чтобы объединить два массива в один, можно использовать метод extend(). Например, чтобы объединить массивы arr1 и arr2:

arr1 = [10, 5, 20]

arr2 = [15, 30]

arr1.extend(arr2)

print("Объединенный массив:", arr1)

9. Копирование массива

Чтобы создать копию массива, можно использовать метод copy(). Например:

arr1 = [10, 5, 20]

arr2 = arr1.copy()

print("Копия массива:", arr2)

10. Массовое обновление элементов массива

Чтобы обновить несколько элементов массива за один раз, можно использовать оператор слайсов. Например:

arr = [10, 5, 20, 15, 30]

arr[1:3] = [25, 35]

print("Массив после обновления элементов:", arr)

Этот код заменит элементы с индексами 1 и 2 соответственно на 25 и 35.

Решение задачи на нахождение максимального элемента массива

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

Например, рассмотрим массив из пяти элементов: [30, 10, 40, 20, 50]. Изначально переменная-максимальное значение равна нулю. Пройдя по первому элементу 30, мы обновляем переменную-максимальное значение на 30. Далее, при проходе по элементу 10, мы не обновляем переменную-максимальное значение, так как 30 > 10. При проходе по элементу 40, мы обновляем переменную-максимальное значение на 40. При проходе по элементу 20 и 50, мы не обновляем переменную-максимальное значение, так как 40 > 20 и 50 < 40. В итоге, максимальным элементом массива является 50.

Реализация данного алгоритма может выглядеть следующим образом:

def find_max(arr):

max_val = 0

for i in arr:

if i > max_val:

max_val = i

return max_val

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

Решение задачи на удаление дубликатов из массива

Для удаления дубликатов из массива в Python существует несколько способов. Рассмотрим самые эффективные из них.

Способ №1: использование множества

Один из самых простых и эффективных способов удаления дубликатов из массива — использование множества. Преобразовываем массив в множество и обратно в массив. В результате из массива удаляются все дубликаты:

array = [1, 2, 2, 3, 4, 4, 5]

result = list(set(array))

print(result)

# [1, 2, 3, 4, 5]

Способ №2: использование спискового включения

Используя списковое включение, также можно удалить дубликаты из массива. Создаем новый массив, который заполняется только уникальными значениями из исходного массива:

array = [1, 2, 2, 3, 4, 4, 5]

result = [] [result.append(x) for x in array if x not in result]

print(result)

# [1, 2, 3, 4, 5]

Более компактная запись данной операции:

array = [1, 2, 2, 3, 4, 4, 5]

result = list(dict.fromkeys(array))

print(result)

# [1, 2, 3, 4, 5]

Способ №3: использование библиотеки NumPy

Если Вы устанавливали библиотеку NumPy, то её функционал позволяет удалять дубликаты с помощью функции unique:

import numpy as np

array = [1, 2, 2, 3, 4, 4, 5]

result = np.unique(array)

print(result)

# [1 2 3 4 5]

Используйте один из вышеописанных способов в зависимости от Вашего проекта для удаления дубликатов из массива в Python.

Решение задачи на нахождение среднего арифметического элементов массива

В Python для нахождения среднего арифметического элементов массива стоит использовать встроенные функции языка. Для этого используем функцию sum(), которая позволяет суммировать элементы массива, а также функцию len(), которая вычисляет длину массива.

Пример:

numbers = [1, 2, 3, 4, 5]

average = sum(numbers) / len(numbers)

print("Среднее арифметическое: ", average)

В данном примере создаем массив numbers, затем находим сумму элементов этого массива и делим на количество элементов, получая среднее арифметическое. Результат выводим на экран.

Также можно привести решение данной задачи через цикл for:

numbers = [1, 2, 3, 4, 5]

sum_num = 0

for num in numbers:

sum_num += num

average = sum_num / len(numbers)

print("Среднее арифметическое: ", average)

В данном случае создаем переменную sum_num, которая инициализируется нулем. В цикле for проходим по элементам массива и добавляем значение каждого элемента к переменной sum_num. Далее вычисляем среднее арифметическое и выводим результат на экран.

Полезные библиотеки для работы с массивами в Python

NumPy – это базовая библиотека для научных вычислений в Python. Она предоставляет множество функций для работы с многомерными массивами и матрицами. NumPy имеет большую производительность благодаря оптимизированной реализации на C и Fortran, что позволяет эффективно обрабатывать большие объемы данных.

Pandas – это библиотека для работы с данными, которая основана на NumPy. Она предоставляет инструменты для работы с таблицами и временными рядами, включая группировку, объединение, сортировку, фильтрацию и агрегацию данных. Pandas удобна для обработки данных из различных источников, включая SQL, Excel и CSV.

SciPy – это библиотека для научных и инженерных вычислений в Python. Она предоставляет множество алгоритмов для решения задач, связанных с линейной алгеброй, оптимизацией, численным интегрированием, интерполяцией и т.д. SciPy основана на NumPy, поэтому эффективно работает с многомерными массивами.

Matplotlib – это библиотека для визуализации данных в Python. Она предоставляет инструменты для построения графиков и диаграмм различных типов, включая линейные, столбчатые, круговые, точечные и т.д. Matplotlib может работать с данными, представленными в виде массивов NumPy или таблиц Pandas.

Seaborn – это библиотека для визуализации данных, которая основана на Matplotlib. Она предоставляет инструменты для построения более сложных графиков, включая диаграммы рассеяния, тепловые карты, ящики с усами и т.д. Seaborn имеет более простой и удобный интерфейс, чем Matplotlib, и может работать с данными, хранящимися в таблицах Pandas.

Numpy

Numpy – библиотека для Python, которая предназначена для работы с многомерными массивами и матрицами. С её помощью можно удобно выполнять математические операции над большими объёмами данных, а также обрабатывать массивы и матрицы.

Одним из основных преимуществ Numpy является высокая скорость работы с массивами. Благодаря оптимизированному коду, библиотеку можно использовать для решения задач в научных и инженерных расчётах, обработке изображений, экономических и финансовых анализах и многих других областях.

Существует множество возможностей работы с многомерными массивами с использованием Numpy. Например, можно создавать массивы из списков, использовать функции для генерации массивов и матриц, делать срезы, выполнять математические действия, находить минимальное и максимальное значения массивов, а также многое другое.

ФункцияОписание
numpy.array()Создание массива из списка
numpy.linspace()Генерация последовательности чисел с заданными параметрами
numpy.zeros()Создание массива с нулевыми значениями
numpy.eye()Создание единичной матрицы

Для удобства работы с многомерными массивами в Python часто используется библиотека Numpy. Она позволяет выполнять широкий спектр операций над массивами и матрицами с высокой эффективностью, что делает её незаменимым инструментом для решения задач различной сложности.

Pandas

Pandas — это библиотека для анализа данных в Python. Она используется для работы с табличными данными, такими как SQL таблицы или Excel файлы. Она предоставляет функционал для работы с данными, преобразования их в нужный формат, фильтрации и выборки данных и многое другое.

Основным объектом в Pandas является DataFrame, это двухмерная таблица с метками строк и столбцов. Она работает с данными, которые могут быть различными типами, такими как числа, строки, даты и многое другое. Также в Pandas есть Series, это одномерный массив с метками.

Для работы с данными Pandas имеет ряд методов:

  • .head() — возвращает первые n строк таблицы. Если n не указано, по умолчанию равен 5.
  • .tail() — возвращает последние n строк таблицы. Если n не указано, по умолчанию равен 5.
  • .describe() — возвращает сводную информацию о таблице, включая количество строк, среднее значение, стандартное отклонение, минимум и максимум.
  • .groupby() — позволяет группировать данные по определенному столбцу и только затем выполнять операции над отфильтрованными данными.

Также в Pandas есть много возможностей для фильтрации данных:

  1. Использование операторов сравнения (> , < , == , <=).
  2. Использование метода .isin() — для фильтрации данных в зависимости от их принадлежности к заданному списку значений.
  3. Использование метода .isnull() — для поиска отсутствующих данных.
  4. Использование метода .notnull() — для поиска данных, которые не отсутствуют.

В Pandas также есть инструменты для обработки и изменения данных:

  • .drop() — удаляет столбцы или строки таблицы.
  • .rename() — переименовывает столбцы или строки.
  • .sort_values() — сортирует данные по определенным столбцам.
  • .fillna() — заменяет отсутствующие значения в таблице заданными значениями.

Итак, используя Pandas, можно легко и быстро анализировать, фильтровать и обрабатывать табличные данные в Python.

FAQ

Что такое массивы в Python?

Массивы — это структуры данных, которые содержат элементы одного типа. В Python массивы могут быть созданы с использованием встроенных функций, таких как array(), list() и numpy().

Как создать массив в Python?

Создание массива осуществляется с помощью функции array(), которая принимает два аргумента: тип данных элементов и последовательность значений. Например, можно создать массив из целых чисел: array(‘i’, [1, 2, 3]).

Как производить доступ к элементам массива в Python?

Для доступа к элементам массива нужно использовать индексацию. Индексация начинается с нуля, то есть первый элемент массива имеет индекс 0. Например, чтобы получить третий элемент массива, нужно обратиться к элементу с индексом 2.

Как выполнить операции с массивами в Python?

Python предоставляет множество встроенных методов для работы с массивами, таких как append(), insert(), remove() и другие. Кроме того, можно использовать стандартные операции для списков, такие как срезы и конкатенацию.

Как произвести сортировку массива в Python?

В Python можно отсортировать массив с использованием встроенной функции sorted(). Функция возвращает отсортированный массив, не изменяя исходный. Например, можно отсортировать массив из целых чисел: sorted(array(‘i’, [3, 1, 2])).

Ссылка на основную публикацию
Adblock
detector