|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Лекция 5. СтрокиЛекция 5. Строки
Строка – это список символов. В Python в строках применяются символы из таблицы символов кодировки Юникод (Unicode). Строка может быть оформлена различным способом. Как правило, строки заключают в одинарные (') или двойные (") кавычки: str1 = 'Строка 1' str2 = "Строка 2" Также строка может быть заключена в тройные одинарные или тройные двойные кавычки: str3 = ' ' 'Строка 3' ' ' str4 = " " "Строка 4" " " При оформлении строк следует соблюдать правило: последовательность кавычек, с которой было начато оформление строки, также должна завершать данную строку.
Для создания строки также можно воспользоваться функцией str( ), которая формирует строку на основе объекта, переданного в качестве параметра: str1 = str(8) # '8' str2 = str(3.14) # '3.14' str3 = str([ "First", "Second", "Third" ]) # "[ 'First', 'Second', 'Third' ]" str4 = str({ -7, 'Element', 3.14 }) # "{ -7, 'Element', 3.14 }"
Строка также может быть создана пустой: str0 = str( ) # ' ' str0 = ' ' # ' ' str0 = " " # ' ' str0 = ' ' ' ' ' ' # ' ' str0 = " " " " " " # ' '
Для оформления строк предусмотрено использование специальных символов. Например, одинарные и двойные кавычки выступают в роли символов, обозначающих границы строк. Удобно для обозначения границ строки использовать один вид кавычек, а для внедрения в строку кавычек как символов – другой их вид: str1 = 'Символ \' удобно чередовать с символом " в строке.' # 'Символ \' удобно чередовать с символом " в строке.' str2 = "Символ ' удобно чередовать с символом \" в строке." # 'Символ \' удобно чередовать с символом " в строке.' str3 = ' ' 'Символ ' удобно чередовать с символом " в строке.' ' ' # 'Символ \' удобно чередовать с символом " в строке.' str4 = " " "Символ ' удобно чередовать с символом " в строке." " " # 'Символ \' удобно чередовать с символом " в строке.'
В приведённых примерах для внедрения в строку символа кавычки, который использовался для обозначения границ строки, был использован символ обратного слэша \ – ещё один специальный символ, после которого все символы, следующие в связке с ним, интерпретируются как обозначение определённого символа. Если требуется внедрить обратный слэш в строку в качестве обычного символа, заблокировав связку со следующими за ним символами, его следует продублировать: str5 = 'Это символ кавычки: \'. Это символ обратного слэша: \' # Ошибка (связка \' есть символ ', а не символ конца строки) str5 = 'Это символ кавычки: \'. Это символ обратного слэша: \\' # "Это символ кавычки: '. Это символ обратного слэша: \\"
В случаях, когда создаваемая строка содержит большое количество символов обратного слэша, удобно не переводить в символ (экранировать) каждое его вхождение в строку, а задать для всей строки перевод входящих в неё обратных слэшей в символы, указав литеру r перед началом строки: str6 = r'Это символ кавычки: \'. Это символ обратного слэша: \' # Ошибка (между \ и ' должен быть хотя бы один символ) str6 = r'Это символ кавычки: \'. Это символ обратного слэша: \\' # "Это символ кавычки: \\'. Это символ обратного слэша: \\\\"
В следующей таблице представлены основные варианты использования обратного слэша при создании строк.
Строка может быть составлена из нескольких строк, каждая из которых введена с новой строки. Для этого следует использовать символ + для склеивания (конкатенации) исходных строк, а всю последовательность требуется заключить в круглые скобки: str7 = ('Строка 1. ' + 'Строка 2. ' + 'Строка 3.') # 'Строка 1. Строка 2. Строка 3.'
str7 = ('Строка 1. ' + 'Строка 2. ' + 'Строка 3.') # Ошибка (отсутствуют круглые скобки)
str7 = 'Строка 1. ' + 'Строка 2. ' + 'Строка 3.') # 'Строка 1. Строка 2. Строка 3.' Строки можно сравнивать друг с другом при помощи операций сравнения <, <=, ==, !=, >=, >. Следует отметить, что сравнение строк осуществляется по байтам, а не по символам. Это приводит к тому, что один и тот же символ, записанный в разных кодировках (например, в Unicode и UTF-8) будет представлен различными байтами и их количеством. Как следствие, строки, одинаковые с точки зрения человека, будут восприниматься программой как различные. Чтобы решить данную проблему, можно подключить модуль unicodedata и воспользоваться его функцией normalize, которой в качестве первого параметра следует передать строку "NFKD" (Normalization Form Compatibility Decomposition – разложение в стандартизированном виде совместимости), а в качестве второго – сравниваемую строку. Как результат своей работы данная функция вернёт переданную ей строку, приведённую к кодировке UTF-8. import unicodedata unicodedata.normalize('NFKD', '\u23B7' + '\N{euro sign}') # '⎷?'
Примеры работы операций сравнения строк: 'abc' == 'abc' # True 'abc' != 'abC' # True 'abc' < 'abc' # False 'abc' < 'abC' # False 'abc' <= 'abc' # True 'abc' <= 'abC' # False 'abc' > 'abc' # False 'abc' > 'abC' # True 'abc' >= 'abc' # True 'abc' >= 'abC' # True
Как было показано в приведённых примерах, на результат сравнения оказывают влияние коды символов, переводимые в байтовое представление, которое затем используется в операциях сравнения. При этом код символа может определяться как выбранной для него кодировкой (например, буква 'Ъ' в таблице символов ASCII имеет код 218, а в таблице Unicode – 1066), так и его регистром ('ъ' и 'Ъ' различны). В связи с эти рекомендуется при сравнении строк, которые могут быть представлены в различных кодировках (например, если строки были считаны из разных текстовых файлов), предварительно переводить их символы в кодировку UTF-8 при помощи функции normalize модуля unicodedata с последующим приведением их к единому регистру (верхнему или нижнему): import unicodedata str = '\u0430' + '\u0431' + '\u0412' # 'абВ' unicodedata.normalize('NFKD', str).upper() # 'АБВ'
Как и в случае со списками, каждый символ в строке имеет порядковый номер (индекс), по которому можно получить его значение как элемента списка символов. Нумерация символов в строке начинается нуля : str1 = '123' # '123' str1 [ 0 ] # '1' str1 [ 1 ] # '2' str1 [ 2 ] # '3' str1 [ 3 ] # Ошибка (выход за пределы строки)
Узнать количество символов в строке (её длину) можно при помощи функции len(), в которую данная строка передаётся параметром: len(str) # 3
При работе со строками допускается использовать отрицательные индексы. В этом случае отсчёт производится с конца строки в обратном направлении: str1 [ -1 ] # '3' str1 [ -2 ] # '2' str1 [ -3 ] # '1' str1 [ -4 ] # Ошибка (выход за пределы строки)
Отрицательные индексы удобны при решении ряда задач. Например, всегда можно получить последний элемент строки, не определяя её длину, если обратиться к её элементу с индексом -1: str2 = '0123456789' # '0123456789' str2 [ -1 ] # '9'
Строки позволяют получать не только отдельные свои символы, но и их последовательности. Для этого используется оператор среза «:», по обе стороны которого индексами задаются левая и правая границы выводимой последовательности. Символ, индекс которого указан справа от оператора среза, не включается в результат. str2 [ 0:3 ] # '012'
Если одна из границ диапазона среза не была указана, то в качестве неё используется соответствующая граница исходной строки: str2 [ : ] # '0123456789' str2 [ :3 ] # '012' str2 [ 3: ] # '3456789' str2 [ -3: ] # '789' str2 [ :-3 ] # '0123456'
Из строки может быть извлечена последовательность символов с заданным интервалом между их индексами. Для этого после основного оператора среза «:» используется дополнительный, после которого указывается величина интервала (шаг). Формируемая последовательность начинается с первого символа исходной строки. Каждый последующий символ определяется путём изменения индекса предыдущего символа на величину шага: str2 = 'палиндром' # 'палиндром' str2 [ : :3 ] # 'пир'
Если задать отрицательное значение шага, то отбор символов из строки будет происходить от её конца к началу: str2 = 'скотовод' # 'скотовод' str2 [ : :-3 ] # 'док'
Отрицательный индекс удобно использовать для вывода всех символов строки в обратном порядке: str2 = 'город рос' # 'город рос' str2 [ : :-1 ] # 'сор дорог'
Строки позволяют проверять наличие в них заданной подстроки: str1 # '123' str2 # 'скотовод' '23' in str1 # True '23' in str2 # False 'кот' in str1 # False 'кот' in str2 # True
Также можно проверить отсутствие в строке заданной подстроки: not '23' in str1 # False not '23' in str2 # True not 'кот' in str1 # True not 'кот' in str2 # False
В отличие от элементов списка, символы созданной строки и их последовательности не могут быть изменены путём обращения к ним по индексам: str2 [ 0 ] = 'A' # Ошибка (нельзя изменить строку) str2 [ 0:3 ] = '210' # Ошибка (нельзя изменить строку)
Однако можно создать новую строку и заменить ею значение, хранящееся в переменной: str2 = 'А123456789' # 'А123456789' str2 = '2103456789' # '2103456789'
Из нескольких строк может быть образована новая строка путём их склеивания (конкатенации): str3 = 'Это ' # 'Это ' str4 = 'строка' # 'строка' str3 = str3 + 'новая ' # 'Это новая ' str3 = str3 + str4 # 'Это новая строка'
Строка, а также последовательность её символов (подстрока), могут быть продублированы заданное количество раз: str4 = 'выр ' * 3 # 'выр выр выр ' str4 = 'Вобла ' # 'Вобла ' str4 [ 2:6 ] * 3 # 'бла бла бла ' str4 * 0 # ' '
При помощи оператора += на основе строки может быть создана её копия с добавленными в конец новыми символами, которая заменит текущее значение: str3 = 'АБВ' # 'АБВ' str3 += '!!!‘ # str3 = str3 + '!!!' str3 # 'АБВ!!!'
Оператор *= позволяет создать заданное количество копий строки и записать результат их конкатенации в переменную этой строки: str4 = 'ми ' # 'ми ' str4 *= 3 # str4 = str4 + str4 + str4 str4 # 'ми ми ми '
Пример работы метода join. помощи оператора += на основе строки может быть создана её копия с добавленными в конец новыми символами, которая заменит текущее значение: list1 = [ "C:", "Windows", "System32" ] # [ 'C:', 'Windows', 'System32' ] str5 = ' '.join(list1) # 'C: Windows System32' str5 = '\'.join(list1) # 'C:\Windows\System32' str5 = ''.join(list1) # 'C:WindowsSystem32'
При помощи метода format можно создавать строки, используя строки-шаблоны. Метод format вызывается для строки-шаблона и принимает в качестве параметров значения или хранящие их переменные, которыми будут заменены поля строки-шаблона. str0 = "Роман '{0}' был опубликован в {1} году." # "Роман '{0}' был опубликован в {1} году." str6 = str0.format("1984", 1949) # "Роман '1984' был опубликован в 1949 году."
Дублирование фигурной скобки приводит к образованию соответствующего ей символа строки: "Роман '{{{0}}}' был опубликован в {{1}} году.".format("1984", 1949) # "Роман '{1984}' был опубликован в {1} году."
Возможности форматирования позволяют создавать строки по частям: list1 = [ 1, 2, 3 ] # [ 1, 2, 3 ] set1 = { 3, 4, 5 } # { 3, 4, 5 } num1 = 3 # 3 "В {0} и {1} общий элемент: {2}.".format(list1, sеt1, num1) # "В [1, 2, 3] и {3, 4, 5} общий элемент: 3."
При этом между частями строки могут быть добавлены разделители: str7 = "C:" # 'C:' str8 = "Windows" # 'Windows' str9 = "System32" # 'System32' "{0}\{1}\{2}".format(str7, str8, str9) # 'C:\Windows\System32'
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|