Differences between revisions 1 and 2
Revision 1 as of 2018-10-30 20:02:01
Size: 646
Comment:
Revision 2 as of 2018-10-31 05:18:14
Size: 11829
Comment:
Deletions are marked like this. Additions are marked like this.
Line 19: Line 19:
== Задание строк ==

Строки в питоне - это такие последовательности (смысл их интуитивно понятен - набор символов).

'''Задавать строки можно четырьмя способами:'''
  1. с помощью '''двойных кавычек''': `"John"`;
  2. с помощью '''одинарных кавычек''': `'Doe'` (никаких отличий от двойных кавычек);
  3. с помощью '''тройных кавычек''': `'''John Doe can be multiline'''` - позволяют задать многострочную строку (многострочный строковый литерал), а также использовать в её тексте кавычки, не прибегая к специальным символам в исходном коде;
  4. с помощью '''преобразования''' объектов других типов: '''str(12)'''.

'''Если вы задаёте строку с помощью двойных кавычек - можете спокойно использовать в её тексте одинарные, и наоборот. Если же вы хотите использовать в тексте строки тот же тип кавычек, которым вы обрамляете строку, вам придётся пользоваться одним из инструментов, описанных ниже.'''

'''Кстати, обратите внимание на разницу в выводе (функция `print`, на самом деле, выводит результат метода `__str__`, a интерпретатор в выводе использует `__repr__`):'''

{{{#!highlight pycon
>>> a = '''A multiline string
... is a string that takes multiple
... lines of text
... '''
>>> a # Интерпретатор при выводе использует результат работы метода объекта __repr__ - он представляет в виде строки внутреннюю структуру объекта
'A multiline string\nis a string that takes multiple\nlines of text\n'
>>> print(a.__str__()) # __str__ задаёт строковое представление объекта - этот-то метод объекта (если он есть) и использует print
A multiline string
is a string that takes multiple
lines of text

>>> print(a.__repr__())
'A multiline string\nis a string that takes multiple\nlines of text\n'
}}}

== Спецсимволы (управляющие символы) ==

'''При задании строки можно использовать т.н. управляющие символы - последовательности символов, которые будут интерпретироваться особым образом. В питоне такие последовательности начинаются с символа `\` (backslash):'''
  1. `\n` - перенос строки;
  2. `\t` - табуляция;
  3. `\r` - символ возврата каретки (подробнее [[https://en.wikipedia.org/wiki/Newline | здесь]]);
  4. `\'`, `\"` - символ - одинарная/двойная кавычка (вне зависимости от того, с помощью каких кавычек вы задаёте строковый литерал).

{{{#!highlight pycon
>>> print('There will be a\nhuge fall')
There wiil be a
huge fall
>>> print("We need to explore\t\t\touter space")
We need to explore outer space
>>> print("I don't want to set the world on fire\rI do!!!") # Символ возврата каретки переносит наш "курсор" - то место, в которое происходит вывод - в начало строки
I do!!! want to set the world on fire
>>> print("Yep, I'm using \"double quotes\" in a double-quoted string literal")
Yep, I'm using "double quotes" in a double-quoted string literal
}}}

'''Полную таблицу спецсимволов можно посмотреть [[https://docs.python.org/3/reference/lexical_analysis.html#index-18 | здесь]]'''

== Коды символов ==

В разговоре об управляющих символах уместно будет упомянуть функции, позволяющие работать напрямую с кодами символов - '''`ord` и `chr`''':

{{{#!highlight pycon
>>> ord("a") # Получить номер символа в кодировке (ord вернёт десятичное число)
97
>>> ord("abc") # Обратите внимание, что ord принимает на вход строку именно из одного символа
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 3 found
>>> ord(a) # И именно строку
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 70 found
>>> ord("ы") # Символы, не принадлежацие таблице ASCII, кодируются с помощью Юникода
1099
>>> chr(1099) # chr позволяет по коду символа получить сам символ (символ Юникода тоже)
'ы'
>>> hex(ord("a")) # Для примера нам потребуются шестнадцатеричные коды символов
'0x61'
>>> hex(ord("ы"))
'0x44b'
>>> print("\x61") # \xhh - управляющая последовательность, позволяющая вывести ASCII-символ по его коду
a
>>> print("\x04\x4b\x61") # Для кириллицы не подойдёт
Ka
>>> print("\u044b\x61") # Символы юникода задаются с помощью управляющих последовательностей \u и \U (за первой следуют 4 шестнадцатеричные цифры, за второй - 8)
ыa
}}}

'''В питоне, начиная с третьей версии, по умолчанию строки [[https://docs.python.org/3/howto/unicode.html#the-string-type | кодируются в UTF-8]]''' (кстати, по ссылке очень хорошо объяснена предыстория вопроса; почитайте, если плохо понимаете, что есть Юникод и с чем его едят).

== Строка как последовательность ==

Мы уже знаем, что строка - это последовательность, и, значит, по ней можно пройтись циклом `for`:

{{{#!highlight pycon
>>> for i in "QWERTY":
... print(i)
...
Q
W
E
R
T
Y
}}}

Вопрос.

  '''''Что есть элемент этой последовательности?'''''

В кортежах элементом последовательности является элемент кортежа. '''В строках же элемент последовательности - строка, состоящая из одного (соответствующего) символа:'''

{{{#!highlight pycon
>>> a = "Raxacoricofallapatorius"
>>> a[5] # Строка из одного символа
'o'
>>> a[5:9] # Новая строка из 4 символов
'oric'
>>> a[8]
'c'
>>> a[8:9]
'c'
>>> a[8] is a[8:9] # TODO: В чём принципиальное отличие строки от кортежа, кроме того, что каждый элемент строки - тоже строка? Нужно уточнить
True
>>> a[8] is 'c'
True
}}}

К слову, напомню, что '''строки - неизменяемый тип данных:'''

{{{#!highlight pycon
>>> a[6] = "v"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
}}}

=== Операция in ===

'''Для строк операция `in` не осуществляет, как для других последовательностей, поиск первого вхождения элемента (т.е. строки из одного символа). Она осуществляет поиск подстроки в строке:'''

{{{#!highlight pycon
>>> a
'Raxacoricofallapatorius'
>>> "o" in a # Это мы уже видели на примере других последовательностей
True
>>> "fall" in a # А вот это - нечто новое
True
>>> "gravity fall" in a
False
}}}

Поиск подстроки в строке в питоне имеет линейную, а не квадратичную, сложность (спасибо [[https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B5%D0%B9%D0%BA%D1%81%D1%82%D1%80%D1%8B | алгоритму Дейкстры]]).

=== Операция count ===

'''`count` осуществляет подсчёт количества вхождений подстроки в строку (что тоже является уникальным для строк поведением):'''

{{{#!highlight pycon
>>> a.count("co") # Потому что вместо подсчёта вхождений одного элемента последовательности мы считаем количество вхождений целой подпоследовательности
2
}}}

== Методы строк ==

У строк очень много различных методов, что связано с головными болями, которые разработчики языка имели при работе с ABC/Паскалем:

{{{#!highlight pycon
>>> a = "asd aSDFSDv zxcdfg%^ 567567 GFHFG oikpi"
>>> dir(a)
['__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']
}}}

1. Лекция 6

26 октября 2018 г.

Заметили ошибку или есть предложение? Напишите на почту: romansdidnotcrucify@gmail.com

/!\ ACHTUNG! WORK IN PROGRESS! /!\

Данная страница ещё не закончена и находится в процессе дополнения и переработки. Почитать уже можно, но не забудьте потом заглянуть, когда будет полная версия.

2. Строки

2.1. Задание строк

Строки в питоне - это такие последовательности (смысл их интуитивно понятен - набор символов).

Задавать строки можно четырьмя способами:

  1. с помощью двойных кавычек: "John";

  2. с помощью одинарных кавычек: 'Doe' (никаких отличий от двойных кавычек);

  3. с помощью тройных кавычек: '''John Doe can be multiline''' - позволяют задать многострочную строку (многострочный строковый литерал), а также использовать в её тексте кавычки, не прибегая к специальным символам в исходном коде;

  4. с помощью преобразования объектов других типов: 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):

  1. \n - перенос строки;

  2. \t - табуляция;

  3. \r - символ возврата каретки (подробнее здесь);

  4. \', \" - символ - одинарная/двойная кавычка (вне зависимости от того, с помощью каких кавычек вы задаёте строковый литерал).

   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 >>> for i in "QWERTY":
   2 ...     print(i)
   3 ...
   4 Q
   5 W
   6 E
   7 R
   8 T
   9 Y
  10 

Вопрос.

  • Что есть элемент этой последовательности?

В кортежах элементом последовательности является элемент кортежа. В строках же элемент последовательности - строка, состоящая из одного (соответствующего) символа:

   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 

К слову, напомню, что строки - неизменяемый тип данных:

   1 >>> a[6] = "v"
   2 Traceback (most recent call last):
   3   File "<stdin>", line 1, in <module>
   4 TypeError: 'str' object does not support item assignment

2.4.1. Операция in

Для строк операция in не осуществляет, как для других последовательностей, поиск первого вхождения элемента (т.е. строки из одного символа). Она осуществляет поиск подстроки в строке:

   1 >>> a
   2 'Raxacoricofallapatorius'
   3 >>> "o" in a    # Это мы уже видели на примере других последовательностей
   4 True
   5 >>> "fall" in a    # А вот это - нечто новое
   6 True
   7 >>> "gravity fall" in a
   8 False
   9 

Поиск подстроки в строке в питоне имеет линейную, а не квадратичную, сложность (спасибо алгоритму Дейкстры).

2.4.2. Операция count

count осуществляет подсчёт количества вхождений подстроки в строку (что тоже является уникальным для строк поведением):

   1 >>> a.count("co")    # Потому что вместо подсчёта вхождений одного элемента последовательности мы считаем количество вхождений целой подпоследовательности
   2 2
   3 

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 


LecturesCMC/PythonIntro2018/06_Strings/Conspect (last edited 2018-11-01 03:50:03 by RomanKrivonogov)