[МУЗЫКА] [МУЗЫКА] Сегодня кроме вещественных чисел мы посмотрим еще на некоторые методы работы со строками, что в Python с ними можно делать и подробнее о том, как они устроены внутри. Мы уже умеем считывать строки, умеем их выводить, склеивать и умножать на число, то есть какие-то основные операции мы умеем делать. И в первую очередь сегодня мы научимся делать срезы. Для определения длин объектов в Python существует функция len — от слова length, длина. И в Python 3 она означает количество символов, хранящихся в строке. Вообще говоря, это не совпадает с количеством байт, которые хранятся. Почему? Потому что в Python 3 все символы хранятся в кодировке utf-8. Возможно, если вы когда-то писали на Python 2, то там все было по-другому. И если вы читаете про какие-то мучения в работе со строками, то, скорее всего, это относится как раз ко второй версии языка. Что такое utf-8, как оно появилось? Когда-то давным-давно вся информация по сети передавалась по телеграфным линиям, которые были достаточно медленными, и там экономили каждый бит. Раньше использовалось шесть или семь бит для кодирования одного символа. Это было в Америке, соответственно, они использовали английский алфавит, цифры, знаки препинания, какие-то, возможно, дополнительные некоторые символы. И возможно, когда вы работали с русским языком, то сталкивались с проблемой кодировки, что у вас битая кодировка. Это были расширения этого семибитного стандарта до восьми бит, до одного байта. Там в оставшиеся 128 мест пытались впихать какие-то национальные языки. Это мог быть русский, кириллица, могли быть какие-то европейские языки. Но тем не менее, например, китайские иероглифы закодировать, конечно, нельзя было, потому что их гораздо больше, чем 128. И тогда придумали способ хранить почти любые символы, правда, кроме удобства получили и массу неудобств. Теперь каждый символ кодируется разным количеством байт. Ну и читать их достаточно сложно, как один из примеров, или получать доступ к одному определенному символу. Тем не менее, в Python принято решение использовать utf-8 для всех строк, и мы можем не бояться, что у нас какие-то символы неправильно закодируются. Конечно, у вас могут возникнуть потом в процессе проблемы с чтением символов другой кодировки, но вы их решите, а в нашем курсе таких проблем нет, как и русских символов теста. Итак, доступ к конкретному символу в строке в Python реализован следующим образом. У нас пишутся названия строки и затем в квадратных скобках арифметическое выражение: номер символа, к которому мы хотим получить доступ. Это может быть как конкретное число какое-то, константа, переменная или даже реально сложное арифметическое выражение. Мы можем посмотреть на этот символ, но не можем его изменить. В Python строка — неизменяемый объект, и какой-то кусочек, какой-то один символ вы поменять не можете. Ну и для удобства доступа существует также отрицательная нумерация символа в строке. На примере вы можете увидеть положительную нумерацию слева направо и отрицательную справа налево. Положительная нумерация начинается с нуля и идет соответственно до len от этой строки минус один. То есть если в строке шесть символов, как в нашем примере, то нумерация от нуля до пяти. Отрицательная нумерация от −1 до −6. Для чего это сделано? Чисто ради удобства. Чтобы, например, узнать, какой был предпоследний символ: −2-й. Такой будет индекс у этого символа. Кроме простого среза с одним параметром, существуют и более сложные срезы, которые позволяют получить подстроки нашей строки. Это новые объекты, сама строка при этом не меняется, то есть этот объект остается, как был. В результате операции применения среза получается новый объект, содержащий не все символы из нашей строки. Если у нас два параметра, они разделяются в квадратных скобках двоеточием, то это будет срез с i-того по j-тый символ, так это называется, если параметры i и j. Это все символы, начиная с позиции № i и заканчивая позицией № j, не включая ее. Правая граница в Python почти всегда не включается. Нумерация при этом может быть произвольная, то есть вы можете, например, в качестве i использовать положительное число, в качестве j использовать отрицательное число. Это будет нумерация справа налево. Если вдруг окажется, что ни один символ не попадает в срез, то ошибки не будет, просто у вас получится пустая строка. Кроме срезов с двумя параметрами, существует еще срез с тремя параметрами. Это задает не только левую и правую границу, но и шаг, то есть с каким шагом брать символы. Например, если шаг равен двум, то это значит, что у нас будет браться каждый второй символ, начиная с i-того. Также в срезах можно пропускать некоторые значения. Например, мы можем сразу написать s, квадратная скобка открывается, двоеточие и −1. Такой пример будет означать, что все символы кроме предпоследнего. То есть, если вы пропустили какой-то из первых двух параметров, то это означает соответственно «с начала» или «до конца». В принципе, можно пропустить оба параметра, тогда вы создадите копию вашей строки. Это будет новый объект, содержащий все абсолютно то же самое, что и ваша строка. Третий параметр пропускать нельзя, если вы хотите, чтобы он был равен единице, то просто ничего не пишете, не делаете третьего параметра, не ставите второго двоеточия. По умолчанию он равен единице. Если вы возьмете его отрицательным, то у вас будут перечисляться символы справа налево, то есть каждый раз у вас будет переход к предыдущему символу. При этом левая граница, то что первый параметр должен быть больше, чем правая граница. То есть движение осуществляется справа налево, и опять же второй параметр не включается. Если хотите идти до начала строки, оставляйте пустое место, то есть пишете: двоеточие, двоеточие. При этом старайтесь не писать каких-то очевидных вещей, например, указывать в качестве третьего параметра единицу, это только запутает того, кто будет читать ваш код, вас, например, если вы вдруг захотите его перечитать. Ну и вообще, нужно стараться то, что у нас есть по умолчанию, не писать явно, потому что будет казаться, что вы хотели сделать что-то умное, и когда вы задумаетесь об этом, потеряете время, вместо того чтобы понимать, всё просто и четко написано, не содержащее ничего лишнего. В практических заданиях вам нужно будет потренироваться делать различные срезы. Кроме того, на скринкастах мы рассмотрим еще методы работы со строками, которые позволяют искать, заменять и подсчитывать вхождение подстрок в строку. [МУЗЫКА] [МУЗЫКА]