introduction.md
1> **Источник:** https://python-all.ru/3.0/tutorial/introduction.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Неформальное введение в Python89В следующих примерах ввод и вывод различаются наличием или отсутствием приглашений (`>>>` и `...`): чтобы повторить пример, необходимо ввести всё после приглашения, когда оно появляется; строки, не начинающиеся с приглашения, являются выводом интерпретатора. Обратите внимание, что вторичное приглашение на отдельной строке в примере означает, что нужно ввести пустую строку; это используется для завершения многострочной команды.1011Многие примеры в этом руководстве, даже те, которые вводятся в интерактивном приглашении, содержат комментарии. Комментарии в Python начинаются с символа решётки, `#`, и продолжаются до конца физической строки. Комментарий может находиться в начале строки, после пробелов или кода, но не внутри строкового литерала. Символ решётки внутри строкового литерала – это просто символ решётки. Поскольку комментарии служат для пояснения кода и не интерпретируются Python, их можно опускать при вводе примеров.1213Несколько примеров:1415```python16# это первый комментарий17SPAM = 1 # а это второй комментарий18 # ... и теперь третий!19STRING = "# This is not a comment."20```2122## Использование Python в качестве калькулятора2324Давайте попробуем несколько простых команд Python. Запустите интерпретатор и дождитесь основного приглашения, `>>>`. (Это не должно занять много времени.)2526### Числа2728Интерпретатор работает как простой калькулятор: можно ввести выражение, и он выведет значение. Синтаксис выражений прост: операторы `+`, `-`, `*` и `/` работают так же, как и в большинстве других языков (например, Pascal или C); для группировки можно использовать скобки. Например:2930```python31>>> 2+232433>>> # Это комментарий34... 2+235436>>> 2+2 # и комментарий в той же строке, что и код37438>>> (50-5*6)/4395.040>>> 8/5 # Дробные части не теряются при делении целых чисел411.600000000000000142```4344Примечание: вы можете увидеть не совсем тот же результат; результаты операций с плавающей запятой могут отличаться на разных машинах. Позже мы расскажем подробнее о контроле отображения вывода чисел с плавающей запятой; то, что мы видим здесь, – это наиболее информативный вывод, но его не так легко читать, как вывод, который мы получим с помощью:4546```python47>>> print(8/5)481.649```5051Для ясности в этом руководстве мы будем показывать более простой вывод чисел с плавающей запятой, если только мы специально не обсуждаем форматирование вывода, и объясним позже, почему эти два способа отображения данных с плавающей запятой различаются. Полное обсуждение см. в разделе [*Арифметика с плавающей запятой: проблемы и ограничения*](https://python-all.ru/3.0/tutorial/floatingpoint.html#tut-fp-issues).5253Для целочисленного деления с получением целого результата (без дробной части) существует ещё один оператор `//`:5455```python56>>> # Целочисленное деление возвращает целую часть (пол):57... 7//358259>>> 7//-360-361```6263Знак равенства (`'='`) используется для присваивания значения переменной. После этого результат не отображается до следующего интерактивного приглашения:6465```python66>>> width = 2067>>> height = 5*968>>> width * height6990070```7172Значение можно присвоить нескольким переменным одновременно:7374```python75>>> x = y = z = 0 # Обнуление x, y и z76>>> x77078>>> y79080>>> z81082```8384Переменные должны быть «определены» (им присвоено значение) до использования, иначе возникнет ошибка:8586```python87>>> # попытка обращения к неопределённой переменной88... n89Traceback (most recent call last):90 File "<stdin>", line 1, in <module>91NameError: name 'n' is not defined92```9394Имеется полная поддержка чисел с плавающей запятой; операторы со смешанными типами операндов преобразуют целочисленный операнд в число с плавающей запятой:9596```python97>>> 3 * 3.75 / 1.5987.599>>> 7.0 / 21003.5101```102103Комплексные числа также поддерживаются; мнимые числа записываются с суффиксом `j` или `J`. Комплексные числа с ненулевой действительной частью записываются как `(real+imagj)` или могут быть созданы с помощью функции `complex(real, imag)`.104105```python106>>> 1j * 1J107(-1+0j)108>>> 1j * complex(0, 1)109(-1+0j)110>>> 3+1j*3111(3+3j)112>>> (3+1j)*3113(9+3j)114>>> (1+2j)/(1+1j)115(1.5+0.5j)116```117118Комплексные числа всегда представляются двумя числами с плавающей точкой: действительной и мнимой частью. Чтобы извлечь эти части из комплексного числа *z*, используйте `z.real` и `z.imag`.119120```python121>>> a=1.5+0.5j122>>> a.real1231.5124>>> a.imag1250.5126```127128Функции преобразования в число с плавающей точкой и целое ([`float()`](https://python-all.ru/3.0/library/functions.html#float), [`int()`](https://python-all.ru/3.0/library/functions.html#int)) не работают с комплексными числами – не существует единственного корректного способа преобразовать комплексное число в вещественное. Используйте `abs(z)` для получения модуля (как float) или `z.real` для получения действительной части:129130```python131>>> a=3.0+4.0j132>>> float(a)133Traceback (most recent call last):134 File "<stdin>", line 1, in ?135TypeError: can't convert complex to float; use abs(z)136>>> a.real1373.0138>>> a.imag1394.0140>>> abs(a) # sqrt(a.real**2 + a.imag**2)1415.0142>>>143```144145В интерактивном режиме последнее выведенное выражение присваивается переменной `_`. Это означает, что при использовании Python в качестве настольного калькулятора несколько упрощается продолжение вычислений, например:146147```python148>>> tax = 12.5 / 100149>>> price = 100.50150>>> price * tax15112.5625152>>> price + _153113.0625154>>> round(_, 2)155113.06156>>>157```158159Эту переменную следует рассматривать как доступную только для чтения. Не присваивайте ей значение явно – это создаст независимую локальную переменную с тем же именем, которая будет скрывать встроенную переменную с её магическим поведением.160161### Строки162163Помимо чисел, Python также может работать со строками, которые можно записывать несколькими способами. Их можно заключать в одинарные или двойные кавычки:164165```python166>>> 'spam eggs'167'spam eggs'168>>> 'doesn\'t'169"doesn't"170>>> "doesn't"171"doesn't"172>>> '"Yes," he said.'173'"Yes," he said.'174>>> "\"Yes,\" he said."175'"Yes," he said.'176>>> '"Isn\'t," she said.'177'"Isn\'t," she said.'178```179180Интерпретатор печатает результат строковых операций так же, как они были введены: в кавычках, с экранированием кавычек и других специальных символов обратной косой чертой, чтобы показать точное значение. Строка заключается в двойные кавычки, если она содержит одинарную кавычку и нет двойных; в противном случае она заключается в одинарные кавычки. И снова функция [`print()`](https://python-all.ru/3.0/library/functions.html#print) выдает более читаемый вывод.181182Строковые литералы можно записывать на нескольких строках разными способами. Можно использовать строки продолжения, когда обратная косая черта в конце строки указывает, что следующая строка является логическим продолжением текущей:183184```python185hello = "This is a rather long string containing\n\186several lines of text just as you would do in C.\n\187 Note that whitespace at the beginning of the line is\188 significant."189190print(hello)191```192193Обратите внимание, что символы новой строки по-прежнему должны быть встроены в строку с помощью `\n`; символ новой строки после завершающей обратной косой черты отбрасывается. Этот пример напечатает следующее:194195```python196This is a rather long string containing197several lines of text just as you would do in C.198 Note that whitespace at the beginning of the line is significant.199```200201Однако если мы сделаем строковый литерал «сырой» строкой, то последовательности `\n` не будут преобразованы в новые строки, но обратная косая черта в конце строки и символ новой строки в исходном коде будут включены в строку как данные. Таким образом, пример:202203```python204hello = r"This is a rather long string containing\n\205several lines of text much as you would do in C."206207print(hello)208```209210выведет:211212```python213This is a rather long string containing\n\214several lines of text much as you would do in C.215```216217Или строки могут быть заключены в пару соответствующих тройных кавычек: `"""` или `'''`. Концы строк не нужно экранировать при использовании тройных кавычек, но они будут включены в строку.218219```python220print("""221Usage: thingy [OPTIONS]222 -h Display this usage message223 -H hostname Hostname to connect to224""")225```226227выдаёт следующий результат:228229```python230Usage: thingy [OPTIONS]231 -h Display this usage message232 -H hostname Hostname to connect to233```234235Строки можно объединять (склеивать) оператором `+` и повторять оператором `*`:236237```python238>>> word = 'Help' + 'A'239>>> word240'HelpA'241>>> '<' + word*5 + '>'242'<HelpAHelpAHelpAHelpAHelpA>'243```244245Два строковых литерала, расположенные рядом, автоматически конкатенируются; первую строку выше можно было бы записать как `word = 'Help' 'A'`; это работает только с двумя литералами, но не с произвольными строковыми выражениями:246247```python248>>> 'str' 'ing' # <- Это нормально249'string'250>>> 'str'.strip() + 'ing' # <- Это нормально251'string'252>>> 'str'.strip() 'ing' # <- Это недопустимо253 File "<stdin>", line 1, in ?254 'str'.strip() 'ing'255 ^256SyntaxError: invalid syntax257```258259Строки можно индексировать (обращаться по индексу); как и в C, первый символ строки имеет индекс 0. Отдельного типа для символов нет; символ – это просто строка длины 1. Как и в языке программирования Icon, подстроки можно задавать с помощью *нотации среза*: два индекса, разделённые двоеточием.260261```python262>>> word[4]263'A'264>>> word[0:2]265'He'266>>> word[2:4]267'lp'268```269270Индексы среза имеют полезные значения по умолчанию: опущенный первый индекс по умолчанию равен нулю, а опущенный второй – длине строки, из которой берётся срез.271272```python273>>> word[:2] # Первые два символа274'He'275>>> word[2:] # Всё, кроме первых двух символов276'lpA'277```278279В отличие от строк C, строки Python нельзя изменить. Присваивание значения по индексу в строке приводит к ошибке:280281```python282>>> word[0] = 'x'283Traceback (most recent call last):284 File "<stdin>", line 1, in ?285TypeError: 'str' object doesn't support item assignment286>>> word[:1] = 'Splat'287Traceback (most recent call last):288 File "<stdin>", line 1, in ?289TypeError: 'str' object doesn't support slice assignment290```291292Однако создать новую строку с объединённым содержимым легко и эффективно:293294```python295>>> 'x' + word[1:]296'xelpA'297>>> 'Splat' + word[4]298'SplatA'299```300301Вот полезное инвариантное свойство операций со срезами: `s[:i] + s[i:]` равно `s`.302303```python304>>> word[:2] + word[2:]305'HelpA'306>>> word[:3] + word[3:]307'HelpA'308```309310Вырожденные индексы срезов обрабатываются корректно: слишком большой индекс заменяется длиной строки, а верхняя граница, меньшая нижней, возвращает пустую строку.311312```python313>>> word[1:100]314'elpA'315>>> word[10:]316''317>>> word[2:1]318''319```320321Индексы могут быть отрицательными числами для отсчёта справа. Например:322323```python324>>> word[-1] # Последний символ325'A'326>>> word[-2] # Предпоследний символ327'p'328>>> word[-2:] # Последние два символа329'pA'330>>> word[:-2] # Все, кроме последних двух символов331'Hel'332```333334Но обратите внимание, что -0 – это на самом деле то же самое, что и 0, поэтому отсчёт справа не работает!335336```python337>>> word[-0] # (поскольку -0 равно 0)338'H'339```340341Отрицательные индексы срезов, выходящие за диапазон, усекаются, но не пытайтесь делать это с одноэлементными (не срезовыми) индексами:342343```python344>>> word[-100:]345'HelpA'346>>> word[-10] # ошибка347Traceback (most recent call last):348 File "<stdin>", line 1, in ?349IndexError: string index out of range350```351352Один из способов запомнить, как работают срезы – представлять индексы *между* символами, причём левый край первого символа имеет номер 0. Тогда правый край последнего символа строки из *n* символов имеет индекс *n*, например:353354```python355 +---+---+---+---+---+356 | H | e | l | p | A |357 +---+---+---+---+---+358 0 1 2 3 4 5359-5 -4 -3 -2 -1360```361362Первая строка чисел показывает положение индексов 0...5 в строке; вторая строка – соответствующие отрицательные индексы. Срез от *i* до *j* состоит из всех символов между границами, обозначенными *i* и *j* соответственно.363364Для неотрицательных индексов длина среза равна разности индексов, если оба находятся в пределах границ. Например, длина `word[1:3]` равна 2.365366Встроенная функция [`len()`](https://python-all.ru/3.0/library/functions.html#len) возвращает длину строки:367368```python369>>> s = 'supercalifragilisticexpialidocious'370>>> len(s)37134372```373374> **См. также**375>376> **[*Типы последовательностей – str, bytes, bytearray, list, tuple, range*](https://python-all.ru/3.0/library/stdtypes.html#typesseq)**377>378> Строки – это пример379>380> *типов-последовательностей*381>382> и поддерживают общие операции, характерные для таких типов.383>384> **[*Методы строк*](https://python-all.ru/3.0/library/stdtypes.html#string-methods)**385>386> Строки поддерживают множество методов для базовых преобразований и поиска.387>388> **[*Форматирование строк*](https://python-all.ru/3.0/library/string.html#string-formatting)**389>390> Информация о форматировании строк с помощью391>392> [`str.format()`](https://python-all.ru/3.0/library/stdtypes.html#str.format)393>394> описана здесь.395>396> **[*Устаревшие операции форматирования строк*](https://python-all.ru/3.0/library/stdtypes.html#old-string-formatting)**397>398> Старые операции форматирования, которые выполняются, когда строки и строки Unicode являются левым операндом оператора399>400> `%`401>402> , подробнее описаны здесь.403404### О Unicode405406Начиная с Python 3.0 все строки поддерживают Unicode (см. [http://www.unicode.org/](https://python-all.ru/3.0/tutorial/introduction.html)).407408Преимущество Unicode в том, что он предоставляет одно числовое значение (ordinal) для каждого символа любого письма, используемого в современных и древних текстах. Раньше для символов письменности было доступно только 256 возможных значений. Тексты обычно были привязаны к кодовой странице, которая сопоставляла значения символам. Это приводило к большой путанице, особенно в вопросах интернационализации (обычно записывается как `i18n` – `'i'` + 18 символов + `'n'`) программного обеспечения. Unicode решает эти проблемы, определяя единую кодовую страницу для всех письменностей.409410Если нужно включить в строку специальные символы, это можно сделать с помощью кодировки *Unicode-Escape* языка Python. Следующий пример показывает, как:411412```python413>>> 'Hello\u0020World !'414'Hello World !'415```416417Последовательность экранирования `\u0020` указывает на вставку символа Unicode с порядковым значением 0x0020 (символ пробела) в указанной позиции.418419Остальные символы интерпретируются с использованием их порядковых значений непосредственно как коды Unicode. Для строковых литералов в стандартной кодировке Latin-1, используемой во многих западных странах, удобно, что младшие 256 символов Unicode совпадают с 256 символами Latin-1.420421Помимо этих стандартных кодировок, Python предоставляет целый набор других способов создания строк Unicode на основе известной кодировки.422423Для преобразования строки в последовательность байтов с использованием определённой кодировки строковые объекты предоставляют метод `encode()`, который принимает один аргумент – имя кодировки. Рекомендуется использовать строчные имена кодировок.424425```python426>>> "Äpfel".encode('utf-8')427b'\xc3\x84pfel'428```429430### Списки431432Python поддерживает несколько *составных* типов данных, используемых для группировки других значений. Наиболее универсальным является *список*, который можно записать как список значений (элементов), разделённых запятыми, в квадратных скобках. Элементы списка не обязательно должны быть одного типа.433434```python435>>> a = ['spam', 'eggs', 100, 1234]436>>> a437['spam', 'eggs', 100, 1234]438```439440Как и индексы строк, индексы списков начинаются с 0, а списки можно срезать, объединять и так далее:441442```python443>>> a[0]444'spam'445>>> a[3]4461234447>>> a[-2]448100449>>> a[1:-1]450['eggs', 100]451>>> a[:2] + ['bacon', 2*2]452['spam', 'eggs', 'bacon', 4]453>>> 3*a[:3] + ['Boo!']454['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']455```456457В отличие от строк, которые являются *неизменяемыми*, можно изменять отдельные элементы списка:458459```python460>>> a461['spam', 'eggs', 100, 1234]462>>> a[2] = a[2] + 23463>>> a464['spam', 'eggs', 123, 1234]465```466467Присваивание срезам также возможно, и это может даже изменить размер списка или полностью его очистить:468469```python470>>> # Заменить некоторые элементы:471... a[0:2] = [1, 12]472>>> a473[1, 12, 123, 1234]474>>> # Удалить некоторые:475... a[0:2] = []476>>> a477[123, 1234]478>>> # Вставить некоторые:479... a[1:1] = ['bletch', 'xyzzy']480>>> a481[123, 'bletch', 'xyzzy', 1234]482>>> # Вставить (копию) себя в начало483>>> a[:0] = a484>>> a485[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]486>>> # Очистить список: заменить все элементы пустым списком487>>> a[:] = []488>>> a489[]490```491492Встроенная функция [`len()`](https://python-all.ru/3.0/library/functions.html#len) применима также и к спискам:493494```python495>>> a = ['a', 'b', 'c', 'd']496>>> len(a)4974498```499500Списки можно вкладывать друг в друга (создавать списки, содержащие другие списки), например:501502```python503>>> q = [2, 3]504>>> p = [1, q, 4]505>>> len(p)5063507>>> p[1]508[2, 3]509>>> p[1][0]5102511```512513Можно добавить элемент в конец списка:514515```python516>>> p[1].append('xtra')517>>> p518[1, [2, 3, 'xtra'], 4]519>>> q520[2, 3, 'xtra']521```522523Обратите внимание, что в последнем примере `p[1]` и `q` на самом деле ссылаются на один и тот же объект! Мы вернёмся к *семантике объектов* позже.524525## Первые шаги к программированию526527Конечно, с помощью Python можно решать и более сложные задачи, чем сложение двух и двух. Например, можно вывести начальную подпоследовательность ряда *Фибоначчи* следующим образом:528529```python530>>> # ряд Фибоначчи:531... # сумма двух элементов определяет следующий532... a, b = 0, 1533>>> while b < 10:534... print(b)535... a, b = b, a+b536...537153815392540354155428543```544545В этом примере представлено несколько новых возможностей.546547- В первой строке используется *множественное присваивание*: переменные `a` и `b` одновременно получают новые значения 0 и 1. В последней строке этот приём используется снова; это демонстрирует, что сначала вычисляются все выражения в правой части, и только потом выполняются присваивания. Выражения в правой части вычисляются слева направо.548- Цикл [`while`](https://python-all.ru/3.0/reference/compound_stmts.html#while) выполняется, пока условие (в примере: `b < 10`) остаётся истинным. В Python, как и в C, любое целое ненулевое значение – истина, ноль – ложь. Условием может быть также строка, список или любая последовательность: всё, что имеет ненулевую длину, – истина, пустые последовательности – ложь. Проверка в примере – это простое сравнение. Стандартные операторы сравнения записываются так же, как в C: `<` (меньше), `>` (больше), `==` (равно), `<=` (меньше или равно), `>=` (больше или равно) и `!=` (не равно).549- *Тело* цикла *выделяется отступом*: отступы – это способ группировки операторов в Python. В Python (пока!) нет интеллектуального ввода строк, поэтому для каждой строки с отступом требуется вводить табуляцию или пробелы. На практике более сложный ввод для Python готовится в текстовом редакторе; большинство текстовых редакторов имеют функцию автоотступа. При интерактивном вводе составного оператора после него должна следовать пустая строка для указания завершения (поскольку синтаксический анализатор не может угадать, когда введена последняя строка). Обратите внимание, что каждая строка в пределах базового блока должна иметь одинаковый отступ.550- Функция [`print()`](https://python-all.ru/3.0/library/functions.html#print) выводит значение переданного ей выражения (или выражений). Она отличается от простой записи выражения, которое нужно вывести (как это делалось ранее в примерах с калькулятором), способом обработки нескольких выражений, чисел с плавающей точкой и строк. Строки выводятся без кавычек, а между элементами вставляется пробел, что позволяет красиво форматировать вывод, например:551552 ```python553 >>> i = 256*256554 >>> print('The value of i is', i)555 The value of i is 65536556 ```557558 Ключевое слово *end* можно использовать для подавления перевода строки после вывода или для завершения вывода другой строкой:559560 ```python561 >>> a, b = 0, 1562 >>> while b < 1000:563 ... print(b, end=' ')564 ... a, b = b, a+b565 ...566 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987567 ```568