[МУЗЫКА] [МУЗЫКА] В языке Python кортежи предназначены часто для хранения каких-то разнородных данных. Например, в нашей программе это описание человека в виде его роста и имени. Пока у нас всего два элемента в кортеже, помнить о том, что из них что обозначает, несложно. Но если бы у нас была какая-то очень сложная структура, например, описание человека, и в базе данных содержалось бы у вас там десятки полей каких-то, в конце концов, вы запутались бы и забыли, что из этих полей что означает, а если бы вы модифицировали программу, добавляли какие-то новые поля, то это превратилось бы в сущую муку. В других языках программирования, если вы их знаете, возможно, вы встречали что-то похожее на структуру. То есть это некоторый объект, описание формата хранения данных, где у каждого поля есть имя, в отличие от индекса просто целого числа в кортеже. В языке Python нет такого понятия, как структура, возможно, struct в C или в C++, или там record в Pascal'е, если вы знали. В Python'е в чистом виде такого нет, но есть несколько способов сделать что-то очень похожее. Давайте я покажу один из них и немножко расскажу о других способах, возможно, вам они понадобятся в проектах, если так принято там делать, но пока что первый, это class. Подробнее о class'ах мы будем говорить через несколько занятий, а пока что будем пользоваться им чисто как структурой. Пишем слово class и название class'а, то есть мы создаем новый тип объектов, не просто объект, а тип объектов описываем. И здесь принято называть с большой буквы, то есть имена классов с большой буквы, чтобы не путаться, что из этого есть описание структуры объекта, а что из этого есть настоящий объект. В нашей задаче про сортировку людей по росту, собственно, нам нужно было сделать два поля: рост и имя. Они у нас обозначались индексами 0, 1 в кортеже, теперь мы назовем их какими-то осмысленными словами, соответственно, рост и имя. Как теперь добавлять людей в список людей? То есть мы должны создать список из людей. Но в Python'е, напомню, все списки состоят из ссылок, в том числе ссылок на объекты, структуру которых мы сами придумываем. Поэтому вначале создаем пустой список, и давайте решим задачу со вводом, то есть мы считаем количество людей, которое у нас есть, [ЗВУК] и затем будем считывать людей по одному. Каждый человек будет описываться числом (ростом) и строкой (именем) в одной строке. Значит, что мы можем сделать? Мы можем взять его рост, взять его имя, взять нашу исходную считанную строку и посплитить. Здесь (map(int: input (). split() )), вот эту волшебную конструкцию, применять нельзя. Почему? Потому что одна из переменных — это число, а одна — это строка, и к ней мы int если применим, то все сломается, поэтому мы отдельно напишем, что рост пока что хранится как строка, но теперь с помощью функции int превращаем его в число. Итак, в переменных h и n у нас хранится очередной считанный рост и очередное считанное имя. Что мы делаем? Мы создаем переменную типа Man, так называется наш класс, пишется это вот так: Man(), пустые скобки, потому что у нас никаких параметров туда не передается. Об этом мы потом поговорим, пока просто запомните. И что теперь мы можем делать? Мы можем обращаться к полям нашего класса, нашей структуры. Вот они у нас даже подсвечиваются. Разложили аккуратненько информацию о человеке по полям в соответствующие поля и добавили этого человека в конец нашего списка. Теперь у нас есть список людей, каждый из которых описан в виде класса, на самом деле в виде структуры. Что мы можем сделать? Мы можем написать функцию сравнения двух элементов класса, вернее, не сравнения, а возвращающую ключ. Итак, функция [ЗВУК] принимает на вход человека. Она нам понадобится для сортировки, то есть, допустим, мы хотим отсортировать людей, опять же, по росту, в случае одинакового роста — по имени. Но как сравнивать между собой два объекта нашего класса, который мы создали, Python, естественно, не знает. Почему он не знает? Потому что он понятия не имеет, что же мы имели в виду. Нужно как-то его научить это делать, а именно возвращать в качестве ключа сортировки что-нибудь, что Python сравнивать умеет: кортеж. И вот наш кортеж уже будет содержать в себе в нужном порядке поля, по которым должно идти сравнение, то есть сначала рост, а потом имя. Обращение к полям делается через точку, круглые скобки мы пишем, чтобы было понятно, что это кортеж, можно было не написать. Итак, что мы сортируем? Мы сортируем наш список, используя в качестве функций подсчета ключа только что описанную функцию. И давайте печатать людей, если мы напишем звездочку, то у нас напечатается не совсем то, что мы хотим, давайте посмотрим, что. Хотя нет, там придется набирать людей, поэтому сразу напечатаем их как положено. Перебираем всех людей, напомню, что for можно делать не только для range какого-то, но и перебирать элемент чего угодно итерированно. У нас список, мы перебираем элементы списка и аккуратненько печатаем в нужном порядке. [ЗВУК] Вот теперь поехали. Нам придется вводить людей, ну, давайте, введем, надеюсь, все будет хорошо. Итак, первый человек, разделены пробелами, поехали, ничего не сломалось, [ЗВУК] смотрим. Итак, люди упорядочились по возрастанию роста, но здесь мы так и хотели, если бы мы хотели по убыванию, мы бы минус написали, и по именам в случае совпадения роста. Все хорошо. Как видите, решение получилось несколько длиннее, чем это было в прошлой версии с использованием кортежей, но иногда это очень удобно. Как я уже говорил, когда у вас станет очень много полей, когда вы через неделю, допустим, даже или через полгода вернетесь к своей программе, не то что к чужому коду, вы наверняка не сможете вспомнить, как же вы там располагали эти данные, что из этих полей что означают. Конечно, можно написать комментарии, это частично вас спасет, но разумное наименование полей структуры, класса в нашем случае, гораздо лучше. И хотя код получается больше, он становится прозрачнее и понятнее. Код гораздо больше читают, чем пишут, и поэтому в этом случае можно не полениться и сделать все по-человечески, назвать все понятными именами, и тогда в дальнейшем, когда вы будете поддерживать, читать, изменять свой проект, или кто-то будет это делать, или вы будете изменять чужой проект, все будет намного лучше, чем если вы будете использовать кортежи. Как я говорил, в Python'е существует несколько способов реализовывать нечто, похожее на структуры. Вот один из них мы рассмотрели, с использованием классов. Существуют также другие способы, например, словари, которые мы изучим на одном из следующих занятий, хотя это тоже не очень красивый способ. И, наконец, есть достаточно красивый способ, правда, он использует дополнительные библиотеки, структура называется namedtuple, то есть именованный кортеж. Собственно, это отражает примерно то, что должно быть в структуре, именованные поля. В поисковике, если вы поищете named tuple python 3, то найдете хорошее описание и сможете разобраться. Можете попробовать пользоваться им, тестирующая система поддерживает использование этой библиотеки, и выбрать уже, какой из вариантов нравится больше вам. А конечно, на практике вы должны поступать так, как это принято в той компании, где вы будете писать свои программы. [МУЗЫКА] [МУЗЫКА]