[МУЗЫКА] Мы с вами научились создавать список и считывать его с клавиатуры. Теперь давайте посмотрим, как мы можем обратиться к элементам списка. Ведь мы говорили о том, что последовательность — это про удобство хранения, и было бы здорово, если бы к элементу списка или к какой-то другой последовательности мы могли бы обратиться. Здесь у меня уже записан наш список покупок. Давайте его еще раз напечатаем. Стал немножко подлиннее наш список, и мы его видим вот так. Если бы у нас был записан в блокноте или в приложении, мы бы видели, что «хлеб» — это первый элемент, «молоко», потом ниже «сметана»,«сыр», еще «молоко». И Python на самом деле тоже за каждым из этих элементов закрепляет позицию, и список он видит вот так. На самом деле мы уже видели это. Мы, когда говорили про строку, говорили, что строка — это тоже последовательность и каждый символ строки закреплен за конкретным индексом. Все то же самое работает со списком. Давайте попробуем вывести четвертый элемент нашего списка, нашего списка покупок, и попросим вывести четвертый элемент нашей строки, в которой хранится слово Hello. И вот четвертый элемент. Ноль, один, два, три, четыре. Помним, что Python считает с нуля, а мы — с единицы, поэтому в уме корректируем этот момент. Итак, то же самое. Мы это уже умеем делать. Название списка или переменной, в которой хранится наш список, и в квадратных скобочках индекс элемента, его порядковый номер, к которому мы хотим обратиться. Единственная разница — что в строке мы получали отдельный символ, потому что это единица этой последовательности, отдельный символ, а в списке — это отдельный элемент, «молоко». Давайте сделаем наш пример более интерактивным: давайте попросим пользователя вводить какой-то индекс и будем выводить из списка элемент под этим индексом. И не забываем здесь перевести наш ввод в integer, в целое число, потому что индекс — это целое число. То есть, если вы передадите строку, не сработает. Так, только я забыла это напечатать. Давайте добавим print и запускаем. Ну, давайте, например, элемент под индексом 2. «Сметана». Логично: ноль, один, два. Давайте немножко откорректируем нашу программу, потому что, наверное, когда я и вы думаем про второй элемент нашего списка, наверное, мы думаем про молоко, потому что мы все-таки считаем с единицы, а Python думает про третий. Давайте я из нашего введенного числа буду вычитать единицу, чтобы и мы и Python понимали эту переменную одинаково. Теперь я говорю: «Хочу второй элемент списка», думая про молоко. После того как мы вычли единицу, он стал для Python первым, и мы получили «молоко», а не «сметану», как в прошлый раз. Теперь поговорим про распаковку. Звучит страшно, но сейчас разберемся. Мы с вами уже печатали наш список и видели, что, когда мы печатаем список, вывод не очень красивый, ведь мы печатаем и скобки, и кавычки, и все запятые. Очень часто мы хотим, например, распечатать наш список так, чтобы посмотреть, какие там есть переменные или, может быть, перечислить, или, может быть, сделать красивый вывод, например «наш список покупок:». Давайте вот здесь вот добавлю: «Наш список покупок :». И смотрите, вот здесь у меня напечаталось красиво — через пробел, запятую добавим сейчас — потому что я распечатала теперь не список, а распечатала каждый элемент списка как отдельный аргумент функции print. Ведь, как мы помним, отдельные аргументы у нас печатаются через пробел. Или мы можем вот здесь задать аргумент sep, наш именованный параметр, который задает разделитель между аргументами, и поставить запятую. Вот теперь стало еще лучше. Так, еще пробел после запятой поставим. Вот теперь, с точки зрения русского языка, почти безукоризненно. То есть я просто взяла, перечислила все элементы списка как отдельные аргументы, и у меня все хорошо распечаталось. Но выглядит не сильно удобно. Если вы попробуете это ввести с нуля, то есть писать shopping list 0, shopping list 1 и так далее, то вы увидите, что это достаточно трудозатратно. Поэтому у меня эта ячейка уже и подготовлена заранее, а я не пишу ее прямо сейчас вместе с вами. Выглядит не очень удобно. А как мы знаем, если что-то не удобно, скорее всего, в Python есть способ сделать это по-другому. И нам на помощь приходит оператор распаковки. Давайте посмотрим, что это такое. Я ставлю звездочку. Со звездочкой мы уже сталкивались: мы использовали ее как знак для операции умножения, или две звездочки — для операции возведения в степень. Ставлю звездочку перед названием переменной, в которой хранится список, и смотрите: все распечаталось через пробел, как будто бы функция print восприняла наш список как отдельные аргументы. И на самом деле это и произошло. То есть звездочка как будто распаковывает список, она говорит функции print: «Не воспринимай, пожалуйста, это как один объект, а воспринимай каждый элемент этого объекта как отдельный аргумент, как будто бы тебе их перечислили друг за дружкой, как мы сделали вот здесь». И все сработало. Можем здесь точно так же добавить разделитель. [БЕЗ_ЗВУКА] И вывод будет точно такой же, как у этой строки. Позже мы с вами увидим, что звездочку как оператор распаковки некоторого объекта, в котором содержатся другие объекты, можно будет использовать и с другими типами данных. Теперь поговорим про еще один тип данных. Это тоже упорядоченный тип данных, тоже последовательность. И мы уже говорили про то, что он очень похож на список. И это кортеж. У меня уже здесь есть пример. В переменную a я сохраняю кортеж, который состоит из первых нескольких целых чисел: 1, 2, 3, 4, 5. Давайте запустим эту ячейку. Мы видим, как он распечатывается. Очень похоже на список, только вместо квадратных скобок — круглые. Ну, и на этапе создания кортежа по синтаксису он отличается от списка именно скобками: в списке — квадратные, в кортеже — круглые, и внутри них мы точно так же перечисляем элементы. И мы видим, что для Phyton этот тип называется tuple, и опять же, в документации англоязычной ищете это слово, если хотите прочитать что-то про кортежи. Кортеж очень похож на список, с ним работает индексация, работает распаковка, будут работать некоторые другие операции, про которые мы поговорим в следующих видео, но главное отличное кортежа от списка — это то, что он неизменяемый тип данных. И сейчас мы с вами разберемся, как это работает. Возвращаемся к нашему списку покупок. Не кортеж, список. Давайте обратимся к элементу под индексом 2. Я его напечатаю. Вот она «сметана». Ноль, один, два. А теперь давайте попробуем не просто обратиться к этому элементу, а присвоить новое значение. Например, мы передумали покупать сметану и решили купить мороженое. И давайте я его напечатаю. Смотрите. На первом шаге мы создаем наш список, потом я вывожу второй элемент (для нас третий) этого списка — «сметана». Дальше я делаю такую операцию: я обращаюсь к элементу под этим индексом, использую операцию присвоения, когда мы записываем что-то в новую переменную, и говорю: «Пожалуйста, положи в элемент под индексом 2 мороженое». И теперь опять я печатаю элемент под вторым индексом, там теперь мороженое. Давайте напечатаем список полностью. И мы видим, что в списке «сметана» тоже заменилась на «мороженое». Это возможно, потому что список — изменяемый тип данных. Когда он хранится в памяти компьютера, мы можем внести в него изменения и, например, заменить элемент списка, обратившись к нему по индексу. Давайте попробуем то же самое проделать с кортежем. Печатаю второй элемент. Индексация работает, мы можем по индексу обратиться к элементу кортежа — никаких новостей. А теперь пытаюсь этот второй элемент заменить, давайте вместо сметаны покупать кефир, и у меня ошибка. Ошибка звучит так: Это TypeError, ошибка типа данных, обычно это ошибка, когда вы с каким-то типом данных пытались выполнить какую-то операцию, которая с этим типом данных невозможна. И действительно, ошибка так и звучит, что «tuple не поддерживает операцию присвоения». И, соответственно, кортеж — он неизменный. Вот каким мы его создали, так мы с ним и работаем, элемент в нем заменить нельзя. И, на самом деле, мы знаем еще один неизменяемый тип данных, если мы говорим о последовательностях — это строка. В строке, как и в кортеже, мы не можем заменить символ по индексу. Давайте, например, попробуем заменить первую букву на заглавную. Решили мы «черный хлеб» писать теперь с заглавной буквы. Вызываю. Очень похожая ошибка. Она тоже называется TypeError, только вот здесь string, и дальше все то же самое, то, что строка не поддерживает присвоения. Это связано с тем, что строка и кортеж неизменяемые, а список — изменяемый тип данных. И на самом деле числа, вещественные числа и логические переменные — они тоже неизменяемые, но там и менять нечего. То есть мы заменяем одно число на другое, мы просто его перезаписываем. И в следующих видео мы с вами столкнемся еще с другими типами данных, некоторые будут изменяемыми, некоторые — неизменяемыми. Теперь про эти слова мы помним и будем думать, можем ли мы какую-то структуру поменять или нет. Но давайте вернемся к задаче замены элементов кортежа. На самом деле мы можем перехитрить Python и все-таки это сделать. Как я уже говорила раньше, у нас есть функция list, которая может нам создать из каких-то данных список. И я приводила пример по аналогии с тем, как мы превращали строку в целое число или целое число в строку с помощью функций int и str. И как раз из кортежа мы можем сделать список. У меня есть кортеж с моим списком покупок, я хочу в нем заменить элемент. Хочу вместо хлеба теперь покупать батон. Заменить в кортеже я не могу, потому что будет ошибка, поэтому я превращаю мой кортеж список с помощью функции list и как аргумент передаю кортеж. Как я уже сказала, очень похоже на то, что мы делали, например, int строчка два, чтобы получить целое число двойку. Теперь шоппинг-лист — это список. Давайте напечатаем, убедимся, что это так. Теперь список. А в списке я могу заменить элемент. Обращаюсь по индексу и присваиваю «батон». Давайте напечатаем, убедимся, что замена произошла. Все получилось. Естественно, список — изменяемый тип данных, мы ожидали, что все получится, не разочаровались. Но, как я уже сказала, моя задача была в том, чтобы получить кортеж с отредактированным элементом. И, конечно же, у кортежа тоже есть функция, которая может превратить список в кортеж. И, как мы видели, такие функции обычно называются так же, как типы данных. Соответственно — функция tuple. Tuple, и передаю мой список. И печатаю то, что получилось. И, как мы видим, у нас получился кортеж с измененным элементом. То есть мы взяли кортеж, превратили его в список, поменяли элемент, превратили список обратно в кортеж. Давайте проверим тип, то есть мы видим круглые скобки, я практически уверена, что это кортеж, но наверняка. Да, это кортеж, все получилось. Итак, мы с вами поговорили про то, как обратиться к элементу по индексу, поговорили про то, как распечатать список красиво с помощью оператора распаковки. И точно так же, между прочим, можно напечатать и кортеж. Поговорили про то, что такое кортеж. И его главное отличие от списка в том, что он неизменяемый. И поговорили о том, как можно в списке заменить элементы. И почему в строке и в кортеже элементы по индексу заменить нельзя. [БЕЗ_ЗВУКА] [МУЗЫКА]