|
| 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