|
| 1 | +В этом уроке разберёмся, что такое строка и какую роль играют кавычки в коде. |
1 | 2 |
|
2 |
| -В этом уроке мы разберемся, что такое строка и какую роль в коде играют кавычки. |
3 |
| - |
4 |
| -Определить строку довольно просто — это некий набор символов. Представим, что у нас есть такие записи: |
| 3 | +Строка — это просто набор символов, заключённый в кавычки. Посмотрим на примеры: |
5 | 4 |
|
6 | 5 | ```python
|
7 | 6 | 'Hello'
|
|
11 | 10 | ''
|
12 | 11 | ```
|
13 | 12 |
|
14 |
| -Какие из этих вариантов — строки? На самом деле, все пять вариантов подходят: |
| 13 | +Все эти варианты — строки. |
| 14 | + |
| 15 | +- `'Hello'` и `'Goodbye'` — это строки из нескольких символов. |
| 16 | +- `'G'` — строка из одного символа. |
| 17 | +- `' '` — строка, состоящая из одного пробела. |
| 18 | +- `''` — пустая строка, в ней нет ни одного символа. |
15 | 19 |
|
16 |
| -* С `'Hello'` и `'Goodbye'` все очевидно — мы уже работали с подобными конструкциями и называли их строками |
17 |
| -* `'G'` и `' '` — тоже строки, просто в них всего по одному символу |
18 |
| -* `''` — это пустая строка, потому в ней ноль символов |
| 20 | +То есть всё, что находится внутри кавычек, считается строкой: даже если там только пробел или вообще ничего нет. |
19 | 21 |
|
20 |
| -Строкой мы считаем все, что находится внутри кавычек: даже если это пробел, один символ или вообще отсутствие символов. |
| 22 | +## Одинарные и двойные кавычки |
21 | 23 |
|
22 |
| -Выше мы записывали строки в одинарных кавычках, но это не единственный способ. Можно использовать и двойные: |
| 24 | +В Python строки можно записывать как в одинарных, так и в двойных кавычках: |
23 | 25 |
|
24 | 26 | ```python
|
25 |
| -print("Dracarys!") |
| 27 | +print('Hello') |
| 28 | +print("Hello") |
26 | 29 | ```
|
27 | 30 |
|
28 |
| -Теперь представьте, что вы хотите напечатать строчку *Dragon's mother*. Апостроф перед буквой **s** — это такой же символ, как одинарная кавычка. Попробуем: |
| 31 | +Оба варианта работают одинаково. Главное — использовать один и тот же тип кавычек в начале и в конце строки. |
| 32 | + |
| 33 | +Хотя Python поддерживает оба варианта, по умолчанию принято использовать одинарные кавычки `'`, если внутри строки не требуется двойных. Этого стиля придерживается официальный стандарт _PEP8_ и линтер _Ruff_, который мы используем на платформе. Он может автоматически заменить двойные кавычки на одинарные там, где это возможно. |
| 34 | + |
| 35 | +## Проблема с кавычками внутри строки |
| 36 | + |
| 37 | +Представьте, что вы хотите напечатать строку _Dragon's mother_. В ней есть апостроф (_'s_) — это тот же символ, что и одинарная кавычка. Попробуем так: |
29 | 38 |
|
30 | 39 | ```python
|
31 | 40 | print('Dragon's mother')
|
32 | 41 | # SyntaxError: invalid syntax
|
33 | 42 | ```
|
34 | 43 |
|
35 |
| -Такая программа не будет работать. С точки зрения Python строчка началась с одинарной кавычки, а потом закончилась после слова **dragon**. Дальше были символы `s mother` без кавычек — значит, это не строка. А потом была одна открывающая строку кавычка, которая так и не закрылась: `')`. Этот код содержит синтаксическую ошибку — это видно даже по тому, как подсвечен код. |
36 |
| -
|
37 |
| -Чтобы избежать этой ошибки, мы используем двойные кавычки. Такой вариант программы сработает верно: |
| 44 | +Python решит, что строка заканчивается после слова 'Dragon', а остальное не распознает как валидный код — возникнет синтаксическая ошибка. Чтобы избежать этого, обернём строку в двойные кавычки: |
38 | 45 |
|
39 | 46 | ```python
|
40 | 47 | print("Dragon's mother")
|
41 | 48 | ```
|
42 | 49 |
|
43 |
| -Теперь интерпретатор знает, что строка началась с двойной кавычки и закончиться должна тоже на двойной кавычке. А одинарная кавычка внутри стала частью строки. |
| 50 | +Теперь Python понимает, что одинарная кавычка внутри строки — это обычный символ, а сама строка начинается и заканчивается двойными кавычками. |
44 | 51 |
|
45 |
| -Верно и обратное. Если внутри строки мы хотим использовать двойные кавычки, то саму строку надо делать в одинарных. Причем количество кавычек внутри самой строки неважно. |
| 52 | +Если внутри строки нужны двойные кавычки, а снаружи — одинарные, проблем тоже не будет: |
46 | 53 |
|
47 |
| -Теперь представим, что мы хотим создать такую строку: |
| 54 | +```python |
| 55 | +print('He said "No"') |
| 56 | +``` |
| 57 | + |
| 58 | +Иногда в строке встречаются оба типа кавычек: |
48 | 59 |
|
49 | 60 | ```python
|
50 | 61 | Dragon's mother said "No"
|
51 | 62 | ```
|
52 | 63 |
|
53 |
| -В ней есть и одинарные, и двойные кавычки. Нам нужно каким-то образом указать интерпретатору, что кавычки — это один из символов внутри строки, а не начало или конец строки. |
54 |
| - |
55 |
| -Для этого используют **символ экранирования**: `\` — обратный слэш. Если мы поставим `\` перед кавычкой (одинарной или двойной), то интерпретатор распознает кавычку как обычный символ внутри строки, а не начало или конец строки: |
| 64 | +В этом случае, чтобы Python не спутал кавычки внутри строки с внешними, используют символ экранирования — обратный слэш `\`. Он говорит интерпретатору: следующий за ним символ — часть строки, а не управляющий символ. |
56 | 65 |
|
57 | 66 | ```python
|
58 |
| -# Экранируем кавычки вокруг No, чтобы интерпретатор |
59 |
| -# распознал их как часть строки |
60 | 67 | print("Dragon's mother said \"No\"")
|
61 | 68 | # => Dragon's mother said "No"
|
62 | 69 | ```
|
63 | 70 |
|
64 |
| -Обратите внимание, что в примере выше нам не пришлось экранировать одинарную кавычку (апостроф 's), потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками: |
| 71 | +В этом примере мы экранируем двойные кавычки внутри строки, заключённой в двойные кавычки. |
| 72 | + |
| 73 | +Обратите внимание: Python воспринимает `\"` как один символ — кавычку, а не два символа. |
| 74 | +То же самое касается `\'`, `\\`, `\n` и других управляющих последовательностей — они выглядят как два символа в коде, но в строке считаются за один. |
| 75 | + |
| 76 | +То же самое работает и в обратном случае: |
65 | 77 |
|
66 | 78 | ```python
|
67 | 79 | print('Dragon\'s mother said "No"')
|
68 | 80 | # => Dragon's mother said "No"
|
69 | 81 | ```
|
70 | 82 |
|
71 |
| -Если нужно вывести сам обратный слеш, то работает такое же правило. Как и любой другой специальный символ, его надо экранировать: |
| 83 | +## Как вывести обратный слэш |
| 84 | + |
| 85 | +Чтобы вывести сам обратный слэш, его тоже нужно экранировать: |
72 | 86 |
|
73 | 87 | ```python
|
74 | 88 | print("\\")
|
|
0 commit comments