python sort что это

list sort() в Python

Автор: Кольцов Д · Опубликовано 26.11.2020 · Обновлено 26.11.2020

Метод sort() сортирует элементы данного списка в определенном порядке возрастания или убывания.

В качестве альтернативы вы также можете использовать встроенную функцию sorted() для той же цели.

Примечание: Самое простое различие между sort() и sorted(): sort() изменяет список напрямую и не возвращает никакого значения, а sorted() не изменяет список и возвращает отсортированный список.

Параметры

По умолчанию команда не требует дополнительных параметров. Однако у него есть два необязательных параметра:

Возвращаемое значение

Метод в Python не возвращает никакого значения. Скорее, он меняет исходный список.

Если вы хотите, чтобы функция возвращала отсортированный список, а не изменяла исходный список, используйте sorted().

Пример 1: Сортировка заданного списка

Сортировать по убыванию

Функция принимает обратный параметр в качестве необязательного аргумента.

Установка reverse = True сортирует список в порядке убывания.

В качестве альтернативы для sorted() вы можете использовать следующий код.

Пример 2: Отсортировать список в порядке убывания

Сортировать с помощью настраиваемой функции с помощью клавиши

Если вам нужна собственная реализация для сортировки, метод sort() также принимает ключевую функцию в качестве необязательного параметра.

По результатам ключевой функции вы можете отсортировать данный список.

В качестве альтернативы для сортировки:

Здесь len ‒ это встроенная функция Python для подсчета длины элемента.

Список сортируется по длине каждого элемента от наименьшего количества к наибольшему.

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

Пример 3: Отсортировать список с помощью ключа

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

Мы можем отсортировать список следующим образом:

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

Во втором случае возвращается возраст (int), который сортируется в порядке возрастания.

В третьем случае функция возвращает зарплату (int) и сортируется в порядке убывания с помощью reverse = True.

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

Источник

Поводом опубликовать пост стало то, что при детальном изучении списков (массивов) в Python я не смог найти в сети ни одного простого описания метода сортировки элементов с использованием ключа: list.sort(key=. ).

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

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

sortList = [‘a’, ‘сс’, ‘bbb’]

то получим на выходе:

Для изменения принципа сортировки используется ключевое слово key, которое стало доступным начиная с версии Python 2.4.

Предположим, нам хотелось бы отсортировать наш список двумя способами: 1. в алфавитном порядке; 2. по длине строки. Первый способ, впрочем, уже работает как сортировка по умолчанию, однако мы можем добиться таких же результатов и с помощью параметра key:

sortList = [‘a’, ‘cc’, ‘bbb’]

# Создаем «внешнюю» функцию, которая будет сортировать список в алфавитном порядке:
def sortByAlphabet(inputStr):
return inputStr[0] # Ключом является первый символ в каждой строке, сортируем по нему

# Вторая функция, сортирующая список по длине строки:
def sortByLength(inputStr):
return len(inputStr) # Ключом является длина каждой строки, сортируем по длине

print u’Исходный список: ‘, sortList # >>> [‘a’, ‘cc’, ‘bbb’]

sortList.sort(key=sortByAlphabet) # Каждый элемент массива передается в качестве параметра функции
print u’Отсортировано в алфавитном порядке: ‘, sortList # >>> [‘a’, ‘bbb’, ‘cc’]

sortList.sort(key=sortByLength) # Каждый элемент массива передается в качестве параметра функции
print u’Отсортировано по длине строки: ‘, sortList # >>> [‘a’, ‘cc’, ‘bbb’]

# Теперь отсортируем по длине строки, но в обратном порядке:
sortList.sort(key=sortByLength, reverse=True) # В обратном порядке
print u’Отсортировано по длине строки, в обратном порядке: ‘, sortList # >>> [‘bbb’, ‘cc’, ‘a’]

— либо такой же вариант, но с параметром key (аналогично описанному выше):

newList = sorted(sortList, key=sortByLength)

Источник

Объяснение алгоритмов сортировки с примерами на Python

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В этой статье будут рассмотрены популярные алгоритмы, принципы их работы и реализация на Python. А ещё сравним, как быстро они сортируют элементы в списке.

В качестве общего примера возьмём сортировку чисел в порядке возрастания. Но эти методы можно легко адаптировать под ваши потребности.

Пузырьковая сортировка

Этот простой алгоритм выполняет итерации по списку, сравнивая элементы попарно и меняя их местами, пока более крупные элементы не «всплывут» в начало списка, а более мелкие не останутся на «дне».

Алгоритм

Сначала сравниваются первые два элемента списка. Если первый элемент больше, они меняются местами. Если они уже в нужном порядке, оставляем их как есть. Затем переходим к следующей паре элементов, сравниваем их значения и меняем местами при необходимости. Этот процесс продолжается до последней пары элементов в списке.

При достижении конца списка процесс повторяется заново для каждого элемента. Это крайне неэффективно, если в массиве нужно сделать, например, только один обмен. Алгоритм повторяется n² раз, даже если список уже отсортирован.

27–29 декабря, Онлайн, Беcплатно

Для оптимизации алгоритма нужно знать, когда его остановить, то есть когда список отсортирован.

Реализация

Время сортировки

Если взять самый худший случай (изначально список отсортирован по убыванию), затраты времени будут равны O(n²), где n — количество элементов списка.

Сортировка выборкой

Этот алгоритм сегментирует список на две части: отсортированную и неотсортированную. Наименьший элемент удаляется из второго списка и добавляется в первый.

Алгоритм

На практике не нужно создавать новый список для отсортированных элементов. В качестве него используется крайняя левая часть списка. Находится наименьший элемент и меняется с первым местами.

Теперь, когда нам известно, что первый элемент списка отсортирован, находим наименьший элемент из оставшихся и меняем местами со вторым. Повторяем это до тех пор, пока не останется последний элемент в списке.

Реализация

По мере увеличения значения i нужно проверять меньше элементов.

Время сортировки

Затраты времени на сортировку выборкой в среднем составляют O(n²), где n — количество элементов списка.

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

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

Алгоритм

Переходя к другим элементам несортированного сегмента, перемещаем более крупные элементы в отсортированном сегменте вверх по списку, пока не встретим элемент меньше x или не дойдём до конца списка. В первом случае x помещается на правильную позицию.

Реализация

Время сортировки

Время сортировки вставками в среднем равно O(n²), где n — количество элементов списка.

Пирамидальная сортировка

Также известна как сортировка кучей. Этот популярный алгоритм, как и сортировки вставками или выборкой, сегментирует список на две части: отсортированную и неотсортированную. Алгоритм преобразует второй сегмент списка в структуру данных «куча» (heap), чтобы можно было эффективно определить самый большой элемент.

Алгоритм

Сначала преобразуем список в Max Heap — бинарное дерево, где самый большой элемент является вершиной дерева. Затем помещаем этот элемент в конец списка. После перестраиваем Max Heap и снова помещаем новый наибольший элемент уже перед последним элементом в списке.

Этот процесс построения кучи повторяется, пока все вершины дерева не будут удалены.

Реализация

Создадим вспомогательную функцию heapify() для реализации этого алгоритма:

Время сортировки

В среднем время сортировки кучей составляет O(n log n), что уже значительно быстрее предыдущих алгоритмов.

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

Этот алгоритм относится к алгоритмам «разделяй и властвуй». Он разбивает список на две части, каждую из них он разбивает ещё на две и т. д. Список разбивается пополам, пока не останутся единичные элементы.

Соседние элементы становятся отсортированными парами. Затем эти пары объединяются и сортируются с другими парами. Этот процесс продолжается до тех пор, пока не отсортируются все элементы.

Алгоритм

Список рекурсивно разделяется пополам, пока в итоге не получатся списки размером в один элемент. Массив из одного элемента считается упорядоченным. Соседние элементы сравниваются и соединяются вместе. Это происходит до тех пор, пока не получится полный отсортированный список.

Сортировка осуществляется путём сравнения наименьших элементов каждого подмассива. Первые элементы каждого подмассива сравниваются первыми. Наименьший элемент перемещается в результирующий массив. Счётчики результирующего массива и подмассива, откуда был взят элемент, увеличиваются на 1.

Реализация

Время сортировки

В среднем время сортировки слиянием составляет O(n log n).

Быстрая сортировка

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

Алгоритм

Быстрая сортировка начинается с разбиения списка и выбора одного из элементов в качестве опорного. А всё остальное передвигаем так, чтобы этот элемент встал на своё место. Все элементы меньше него перемещаются влево, а равные и большие элементы перемещаются вправо.

Реализация

Существует много вариаций данного метода. Способ разбиения массива, рассмотренный здесь, соответствует схеме Хоара (создателя данного алгоритма).

Время выполнения

В среднем время выполнения быстрой сортировки составляет O(n log n).

Обратите внимание, что алгоритм быстрой сортировки будет работать медленно, если опорный элемент равен наименьшему или наибольшему элементам списка. При таких условиях, в отличие от сортировок кучей и слиянием, обе из которых имеют в худшем случае время сортировки O(n log n), быстрая сортировка в худшем случае будет выполняться O(n²).

Встроенные функции сортировки на Python

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

Отсортировать содержимое списка можно с помощью стандартного метода sort() :

Или можно использовать функцию sorted() для создания нового отсортированного списка, оставив входной список нетронутым:

Оба эти метода сортируют в порядке возрастания, но можно изменить порядок, установив для флага reverse значение True :

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

Функции в Python реализуют алгоритм Tim Sort, основанный на сортировке слиянием и сортировке вставкой.

Сравнение скоростей сортировок

Для сравнения сгенерируем массив из 5000 чисел от 0 до 1000. Затем определим время, необходимое для завершения каждого алгоритма. Повторим каждый метод 10 раз, чтобы можно было более точно установить, насколько каждый из них производителен.

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

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

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

Лучше понять эти алгоритмы вам поможет их визуализация.

Источник

Сортировка списков в Python

Что такое метод sort() в Python?

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

В этом примере у нас есть список чисел, и мы можем использовать метод sort() для сортировки списка в порядке возрастания.

Выполним наш код и получим следующий результат:

Однако если список уже отсортирован, то мы получим None.

Значением key выступает функция, которая будет вызываться для каждого элемента в списке.

От редакции Pythonist. О функциях и их аргументах у нас есть отдельная статья — «Функции и их аргументы в Python 3».

В следующем примере давайте используем функцию len() в качестве значения аргумента key. Таким образом, key=len скажет компьютеру отсортировать список имен по длине, от наименьшего к наибольшему.

Вот, что мы получим:

Аргумент reverse может иметь логическое значение: True (Истина) или False (Ложь).

В следующем примере reverse=True укажет компьютеру отсортировать список в обратном алфавитном порядке.

Марк Лутц «Изучаем Python»

Скачивайте книгу у нас в телеграм

Как использовать метод sorted() в Python

Этот метод превращает итерируемый объект в отсортированный список. Итерируемыми объектами могут быть списки, строки и кортежи.

Одно из ключевых различий между sort() и sorted() заключается в том, что sorted() вернет новый список, а sort() сортирует уже имеющийся.

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

Метод sorted() для других типов данных

Еще одно ключевое различие между sorted() и sort() заключается в том, что метод sorted() принимает любые итерируемые объекты (списки, строки, кортежи и т.д.), тогда как метод sort() работает только со списками.

Мы также можем использовать метод sorted() и для кортежей.

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

Мы можем использовать метод sorted() для сортировки этих данных по возрасту учащегося. Аргумент key будет иметь значение лямбда-функции, которая сообщает компьютеру о сортировке по возрасту в порядке возрастания.

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

Таким образом, мы получаем следующий код:

Мы можем изменить этот пример. Давайте отсортируем кортежи по названиям музыкальных инструментов. Более того, давайте используем reverse=True для сортировки инструментов в обратном алфавитном порядке.

Заключение

Метод sort() работает только со списками и сортирует уже имеющийся список. Данный метод ничего не возвращает.

А метод sorted() работает с любыми итерируемыми объектами и возвращает новый отсортированный список. В качестве итерируемых объектов могут выступать списки, строки, кортежи и другие.

Значением аргумента key может быть функция. Она будет вызываться для каждого элемента в списке. По этой функции, собственно, и будет проводиться сортировка.

Надеемся, эта статья была для вас полезна. Успехов в написании кода!

Источник

Sort () и Sorted () в Python

Сортировка — это метод переупорядочения элементов или данных в порядке возрастания или убывания. В программировании на Python мы можем очень легко выполнять сортировку с помощью методов sort () и sorted ().

Методы sorted () и sort () упорядочивают элементы в порядке возрастания или убывания. Даже оба выполняют одинаковые операции, но все же они разные.

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

Sorted ()

Синтаксис функции sorted ():

Мы собираемся реализовать сортировку как строковых, так и целочисленных данных, используя встроенный метод sorted ().

Функция sorted () будет принимать итерируемые и возвращать отсортированные итерируемые элементы, которые по умолчанию будут располагаться в порядке возрастания. По умолчанию функция sorted () упорядочивает элементы в порядке возрастания, поскольку обратное = False.

Sorting Numbers

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В ячейке номер [4] : мы создали числовой список номеров имен.

В ячейке номер [5] : мы вызвали функцию sorted () и передали ей числовой список (числа). Взамен мы получили отсортированный список, который также является новым списком. Новый список означает, что исходный список, который мы передали в sorted () в качестве параметра, не изменился. По номеру ячейки [6] мы подтверждаем, что исходный список не изменился даже после применения sorted ().

Функция sorted () имеет следующие свойства:

Мы также можем присвоить результаты sorted () обратно новой переменной, как показано ниже:

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В ячейке номер [13] : мы создали числовой список номеров имен. Мы вызвали функцию sorted () и передали ей числовой список (числа).

Затем мы присвоили результат функции sorted () новой переменной sort_results для дальнейшего использования.

Примените sorted () к кортежам и наборам

Функция sorted () также работает с кортежами и наборами для сортировки элементов.

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В ячейке номер [15] : мы создали кортеж (num_tuple) и установили (num_sets).

В ячейке номер [18] : мы вызвали функцию сортировки и присвоили возвращаемые результаты новым переменным (tuple_sorted и set_sorted). Затем мы распечатали результаты и получили отсортированные данные. Но результаты находятся в формате списка, а не в кортежах и задают формат, поскольку мы передали параметры, потому что по умолчанию сортированный возвращает результаты в формате списка. Итак, если мы хотим получить результаты в том же формате (наборы и кортежи), мы должны использовать приведение.

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В ячейке номер [22] : мы видим из вывода, что теперь результат в формате кортежа и установлен так, как мы ожидали, потому что при вызове функции sorted () мы также применили оператор приведения, который преобразует список обратно в требуемый формат.

Сортировочная строка

Теперь мы собираемся применить функцию sorted () к списку строк, как показано ниже. Вы увидите, что перед передачей строки в функцию sorted () мы используем метод split (), параметром формата которого по умолчанию является пробел (разделенный пробелом). Причина в том, чтобы получить всю строку в виде списка, но разбить всю строку, когда появится пробел. Если мы не сделаем так, как показано ниже, вся строка будет разделена по символам и не будет получать нужный результат.

Итак, если мы не используем метод split () во время строки sorted (), мы получим результаты, как показано ниже:

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

Вы можете видеть, что вся строка, когда мы передаем ее в функцию sorted (), возвращает список символов. Теперь результаты не соответствуют нашим требованиям.

Итак, чтобы решить эту проблему, мы должны разделить строку (), как показано ниже. Здесь мы разделяем строку пробелом, потому что у нас есть главный символ пробела, который разделяет строки. Но это не ограничение; вы можете использовать любой модуль форматирования внутри метода split () в соответствии с положением вашей строки.

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В ячейке номер [27] : мы инициализируем строку, а затем разделяем эту строку из пространства в качестве разделителя форматирования. И мы получаем список каждой строки всей строки вместо символов строки.

В ячейке номер [28] : мы вызываем функцию sorted () и передаем ей str_value_list в качестве параметра.

В ячейке номер [29] : Наконец, мы печатаем отсортированный список строк, возвращаемый функцией sorted (). В ячейке [30] мы снова печатаем исходный список, чтобы подтвердить, что исходный список не был изменен функцией sorted ().

Sorting with the reverse = True Argument

Теперь мы изменим параметр по умолчанию функции sorted () с False на True. Когда мы меняем значение обратного с False на True, тогда функция sorted () сортирует данные в порядке убывания.

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В ячейке [3] : Мы создали целочисленный список номеров имен.

В ячейке [4] : мы передаем список (числа) в функцию sorted (). Вместе с тем, мы изменили обратное = True. Поскольку reverse = True, мы получили данные в порядке убывания.

В ячейке [5] : мы печатаем исходный список, чтобы убедиться, что исходный список не изменился.

Сортировка регистра имеет значение

Python использует код Unicode для определения первого символа строки перед сортировкой по убыванию или возрастанию. Таким образом, функция sorted () будет обрабатывать строчные и прописные символы по-разному, даже если такие же символы, как A или значение, будут отличаться, как показано ниже:

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

Итак, чтобы понять это, мы снова напишем небольшую программу сортировки строк.

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В ячейке [6] : Мы создали список имен строк, в котором все первые символы заглавны.

В ячейке [7] : Когда мы отсортировали names_case, мы получили желаемый результат.

В ячейке [8] : когда мы меняем первый символ Harman на harman и Apple на apple и снова сортируем список, мы получили неожиданный результат, потому что результат показывает, что строка с яблоком находится на 3-й позиции в списке, что на самом деле должно быть в позиции 1 в индексе списка. Это сделано из-за кода Unicode, который python использовал для проверки их значения.

В ячейке [11] : мы печатаем имя первого символа с его значением.

sorted () с использованием ключевого параметра

Функция sorted () имеет более мощную функцию, которая является ключевым аргументом. Этот ключ ожидает функцию, и каждый элемент в списке должен пройти к этому ключу перед генерацией окончательного вывода.

Мы можем понять это из этого базового примера сортировки строк. Ранее мы обнаружили, что python использует метод Unicode для определения первого значения символа, а затем, в соответствии с этим, сортирует элементы. Мы можем преодолеть это, используя ключевые функции, и наш результат будет соответствовать нашим ожиданиям.

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

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

Sort () Function

Синтаксис функции sort ():

Основное различие между функциями sort () и sorted ():

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

В ячейке [18] мы видим, что метод sort () является частью списка, а не встроенным методом. Метод sort () также не работает с кортежами и наборами. Метод sort () работает только со списком, поскольку он является частью класса списка.

Мы создали новый список и вызвали метод sort () при вызове sorted (), но мы получили ошибку, потому что, как мы говорили ранее, это не встроенный метод.

python sort что это. Смотреть фото python sort что это. Смотреть картинку python sort что это. Картинка про python sort что это. Фото python sort что это

Мы можем вызвать это, только используя список с оператором точки, как показано выше в синтаксисе.

Итак, мы снова вызываем метод sort () со списком (числами). И наши данные располагаются в порядке возрастания, как по умолчанию reverse = False. Но когда мы распечатали исходный список в ячейке с номером [28], мы обнаружили, что исходный список также изменился, потому что метод sort () не возвращает итерацию.

Заключение

Итак, мы изучили методы sort () и sorted (). Мы также видели, что метод sort () не является встроенным методом, потому что это класс списка и может обращаться только к объекту списка. Но метод sorted () является встроенным и также может работать с кортежем и наборами.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *