1. Лекция 6
26 октября 2018 г.
Заметили ошибку или есть предложение? Напишите на почту: romansdidnotcrucify@gmail.com
ACHTUNG! WORK IN PROGRESS!
Данная страница ещё не закончена и находится в процессе дополнения и переработки. Почитать уже можно, но не забудьте потом заглянуть, когда будет полная версия.
2. Строки
2.1. Задание строк
Строки в питоне - это такие последовательности (смысл их интуитивно понятен - набор символов).
Задавать строки можно четырьмя способами:
с помощью двойных кавычек: "John";
с помощью одинарных кавычек: 'Doe' (никаких отличий от двойных кавычек);
с помощью тройных кавычек: '''John Doe can be multiline''' - позволяют задать многострочную строку (многострочный строковый литерал), а также использовать в её тексте кавычки, не прибегая к специальным символам в исходном коде;
с помощью преобразования объектов других типов: str(12).
Если вы задаёте строку с помощью двойных кавычек - можете спокойно использовать в её тексте одинарные, и наоборот. Если же вы хотите использовать в тексте строки тот же тип кавычек, которым вы обрамляете строку, вам придётся пользоваться одним из инструментов, описанных ниже.
Кстати, обратите внимание на разницу в выводе (функция print, на самом деле, выводит результат метода __str__, a интерпретатор в выводе использует __repr__):
1 >>> a = '''A multiline string
2 ... is a string that takes multiple
3 ... lines of text
4 ... '''
5 >>> a # Интерпретатор при выводе использует результат работы метода объекта __repr__ - он представляет в виде строки внутреннюю структуру объекта
6 'A multiline string\nis a string that takes multiple\nlines of text\n'
7 >>> print(a.__str__()) # __str__ задаёт строковое представление объекта - этот-то метод объекта (если он есть) и использует print
8 A multiline string
9 is a string that takes multiple
10 lines of text
11
12 >>> print(a.__repr__())
13 'A multiline string\nis a string that takes multiple\nlines of text\n'
14
2.2. Спецсимволы (управляющие символы)
При задании строки можно использовать т.н. управляющие символы - последовательности символов, которые будут интерпретироваться особым образом. В питоне такие последовательности начинаются с символа \ (backslash):
\n - перенос строки;
\t - табуляция;
\r - символ возврата каретки (подробнее здесь);
\', \" - символ - одинарная/двойная кавычка (вне зависимости от того, с помощью каких кавычек вы задаёте строковый литерал).
1 >>> print('There will be a\nhuge fall')
2 There wiil be a
3 huge fall
4 >>> print("We need to explore\t\t\touter space")
5 We need to explore outer space
6 >>> print("I don't want to set the world on fire\rI do!!!") # Символ возврата каретки переносит наш "курсор" - то место, в которое происходит вывод - в начало строки
7 I do!!! want to set the world on fire
8 >>> print("Yep, I'm using \"double quotes\" in a double-quoted string literal")
9 Yep, I'm using "double quotes" in a double-quoted string literal
10
Полную таблицу спецсимволов можно посмотреть здесь
2.3. Коды символов
В разговоре об управляющих символах уместно будет упомянуть функции, позволяющие работать напрямую с кодами символов - ord и chr:
1 >>> ord("a") # Получить номер символа в кодировке (ord вернёт десятичное число)
2 97
3 >>> ord("abc") # Обратите внимание, что ord принимает на вход строку именно из одного символа
4 Traceback (most recent call last):
5 File "<stdin>", line 1, in <module>
6 TypeError: ord() expected a character, but string of length 3 found
7 >>> ord(a) # И именно строку
8 Traceback (most recent call last):
9 File "<stdin>", line 1, in <module>
10 TypeError: ord() expected a character, but string of length 70 found
11 >>> ord("ы") # Символы, не принадлежацие таблице ASCII, кодируются с помощью Юникода
12 1099
13 >>> chr(1099) # chr позволяет по коду символа получить сам символ (символ Юникода тоже)
14 'ы'
15 >>> hex(ord("a")) # Для примера нам потребуются шестнадцатеричные коды символов
16 '0x61'
17 >>> hex(ord("ы"))
18 '0x44b'
19 >>> print("\x61") # \xhh - управляющая последовательность, позволяющая вывести ASCII-символ по его коду
20 a
21 >>> print("\x04\x4b\x61") # Для кириллицы не подойдёт
22 Ka
23 >>> print("\u044b\x61") # Символы юникода задаются с помощью управляющих последовательностей \u и \U (за первой следуют 4 шестнадцатеричные цифры, за второй - 8)
24 ыa
25
В питоне, начиная с третьей версии, по умолчанию строки кодируются в UTF-8 (кстати, по ссылке очень хорошо объяснена предыстория вопроса; почитайте, если плохо понимаете, что есть Юникод и с чем его едят).
2.4. Строка как последовательность
Мы уже знаем, что строка - это последовательность, и, значит, по ней можно пройтись циклом for:
Вопрос.
Что есть элемент этой последовательности?
В кортежах элементом последовательности является элемент кортежа. В строках же элемент последовательности - строка, состоящая из одного (соответствующего) символа:
1 >>> a = "Raxacoricofallapatorius"
2 >>> a[5] # Строка из одного символа
3 'o'
4 >>> a[5:9] # Новая строка из 4 символов
5 'oric'
6 >>> a[8]
7 'c'
8 >>> a[8:9]
9 'c'
10 >>> a[8] is a[8:9] # TODO: В чём принципиальное отличие строки от кортежа, кроме того, что каждый элемент строки - тоже строка? Нужно уточнить
11 True
12 >>> a[8] is 'c'
13 True
14
К слову, напомню, что строки - неизменяемый тип данных:
2.4.1. Операция in
Для строк операция in не осуществляет, как для других последовательностей, поиск первого вхождения элемента (т.е. строки из одного символа). Она осуществляет поиск подстроки в строке:
Поиск подстроки в строке в питоне имеет линейную, а не квадратичную, сложность (спасибо алгоритму Дейкстры).
2.4.2. Операция count
count осуществляет подсчёт количества вхождений подстроки в строку (что тоже является уникальным для строк поведением):
2.5. Методы строк
У строк очень много различных методов, что связано с головными болями, которые разработчики языка имели при работе с ABC/Паскалем:
1 >>> a = "asd aSDFSDv zxcdfg%^ 567567 GFHFG oikpi"
2 >>> dir(a)
3 ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
4