introduction.md
1> **Источник:** https://python-all.ru/3.1/tutorial/introduction.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 3. Неформальное введение в Python89В следующих примерах ввод и вывод различаются наличием или отсутствием приглашений (`>>>` и `...`): чтобы повторить пример, необходимо ввести всё после приглашения, когда оно появляется; строки, не начинающиеся с приглашения, являются выводом интерпретатора. Обратите внимание, что вторичное приглашение на отдельной строке в примере означает, что нужно ввести пустую строку; это используется для завершения многострочной команды.1011Многие примеры в этом руководстве, даже те, которые вводятся в интерактивном приглашении, содержат комментарии. Комментарии в Python начинаются с символа решётки, `#`, и продолжаются до конца физической строки. Комментарий может находиться в начале строки, после пробелов или кода, но не внутри строкового литерала. Символ решётки внутри строкового литерала – это просто символ решётки. Поскольку комментарии служат для пояснения кода и не интерпретируются Python, их можно опускать при вводе примеров.1213Несколько примеров:1415```python16# это первый комментарий17SPAM = 1 # а это второй комментарий18 # ... и теперь третий!19STRING = "# This is not a comment."20```2122## 3.1. Использование Python в качестве калькулятора2324Давайте попробуем несколько простых команд Python. Запустите интерпретатор и дождитесь основного приглашения, `>>>`. (Это не должно занять много времени.)2526### 3.1.1. Числа2728Интерпретатор работает как простой калькулятор: можно ввести выражение, и он выведет значение. Синтаксис выражений прост: операторы `+`, `-`, `*` и `/` работают так же, как и в большинстве других языков (например, Pascal или C); для группировки можно использовать скобки. Например:2930```python31>>> 2+232433>>> # Это комментарий34... 2+235436>>> 2+2 # и комментарий в той же строке, что и код37438>>> (50-5*6)/4395.040>>> 8/5 # Дробные части не теряются при делении целых чисел411.642```4344Примечание: вы можете увидеть не совсем тот же результат; результаты операций с плавающей точкой могут отличаться на разных машинах. Подробнее о контроле отображения чисел с плавающей точкой мы расскажем позже. См. также [*Арифметика с плавающей точкой: проблемы и ограничения*](https://python-all.ru/3.1/tutorial/floatingpoint.html#tut-fp-issues) для полного обсуждения некоторых тонкостей чисел с плавающей точкой и их представления.4546Для целочисленного деления с получением целого результата (без дробной части) существует ещё один оператор `//`:4748```python49>>> # Целочисленное деление возвращает целую часть (пол):50... 7//351252>>> 7//-353-354```5556Знак равенства (`'='`) используется для присваивания значения переменной. После этого результат не отображается до следующего интерактивного приглашения:5758```python59>>> width = 2060>>> height = 5*961>>> width * height6290063```6465Значение можно присвоить нескольким переменным одновременно:6667```python68>>> x = y = z = 0 # Обнуление x, y и z69>>> x70071>>> y72073>>> z74075```7677Переменные должны быть «определены» (им присвоено значение) до использования, иначе возникнет ошибка:7879```python80>>> # попытка обращения к неопределённой переменной81... n82Traceback (most recent call last):83 File "<stdin>", line 1, in <module>84NameError: name 'n' is not defined85```8687Имеется полная поддержка чисел с плавающей запятой; операторы со смешанными типами операндов преобразуют целочисленный операнд в число с плавающей запятой:8889```python90>>> 3 * 3.75 / 1.5917.592>>> 7.0 / 2933.594```9596Комплексные числа также поддерживаются; мнимые числа записываются с суффиксом `j` или `J`. Комплексные числа с ненулевой действительной частью записываются как `(real+imagj)` или могут быть созданы с помощью функции `complex(real, imag)`.9798```python99>>> 1j * 1J100(-1+0j)101>>> 1j * complex(0, 1)102(-1+0j)103>>> 3+1j*3104(3+3j)105>>> (3+1j)*3106(9+3j)107>>> (1+2j)/(1+1j)108(1.5+0.5j)109```110111Комплексные числа всегда представляются двумя числами с плавающей точкой: действительной и мнимой частью. Чтобы извлечь эти части из комплексного числа *z*, используйте `z.real` и `z.imag`.112113```python114>>> a=1.5+0.5j115>>> a.real1161.5117>>> a.imag1180.5119```120121Функции преобразования в число с плавающей точкой и целое ([`float()`](https://python-all.ru/3.1/library/functions.html#float), [`int()`](https://python-all.ru/3.1/library/functions.html#int)) не работают с комплексными числами – не существует единственного корректного способа преобразовать комплексное число в вещественное. Используйте `abs(z)` для получения модуля (как float) или `z.real` для получения действительной части:122123```python124>>> a=3.0+4.0j125>>> float(a)126Traceback (most recent call last):127 File "<stdin>", line 1, in ?128TypeError: can't convert complex to float; use abs(z)129>>> a.real1303.0131>>> a.imag1324.0133>>> abs(a) # sqrt(a.real**2 + a.imag**2)1345.0135```136137В интерактивном режиме последнее выведенное выражение присваивается переменной `_`. Это означает, что при использовании Python в качестве настольного калькулятора несколько упрощается продолжение вычислений, например:138139```python140>>> tax = 12.5 / 100141>>> price = 100.50142>>> price * tax14312.5625144>>> price + _145113.0625146>>> round(_, 2)147113.06148```149150Эту переменную следует рассматривать как доступную только для чтения. Не присваивайте ей значение явно – это создаст независимую локальную переменную с тем же именем, которая будет скрывать встроенную переменную с её магическим поведением.151152### 3.1.2. Строки153154Помимо чисел, Python также может работать со строками, которые можно записывать несколькими способами. Их можно заключать в одинарные или двойные кавычки:155156```python157>>> 'spam eggs'158'spam eggs'159>>> 'doesn\'t'160"doesn't"161>>> "doesn't"162"doesn't"163>>> '"Yes," he said.'164'"Yes," he said.'165>>> "\"Yes,\" he said."166'"Yes," he said.'167>>> '"Isn\'t," she said.'168'"Isn\'t," she said.'169```170171Интерпретатор выводит результат строковых операций так же, как они были введены: в кавычках, причём кавычки и другие специальные символы экранируются обратной косой чертой, чтобы показать точное значение. Строка заключается в двойные кавычки, если она содержит одинарную кавычку и не содержит двойных, и в одинарные в противном случае. Функция [`print()`](https://python-all.ru/3.1/library/functions.html#print) выводит такие входные строки в более читаемом виде.172173Строковые литералы можно записывать на нескольких строках разными способами. Можно использовать строки продолжения, когда обратная косая черта в конце строки указывает, что следующая строка является логическим продолжением текущей:174175```python176hello = "This is a rather long string containing\n\177several lines of text just as you would do in C.\n\178 Note that whitespace at the beginning of the line is\179 significant."180181print(hello)182```183184Обратите внимание, что символы новой строки всё равно нужно вставлять в строку с помощью `\n` – символ новой строки после завершающей обратной косой черты отбрасывается. Этот пример выведет следующее:185186```text187This is a rather long string containing188several lines of text just as you would do in C.189 Note that whitespace at the beginning of the line is significant.190```191192Или строки можно заключать в пару соответствующих тройных кавычек: `"""` или `'''`. При использовании тройных кавычек концы строк не нужно экранировать, но они будут включены в строку. Поэтому в следующем примере используется один escape, чтобы избежать нежелательной начальной пустой строки.193194```python195print("""\196Usage: thingy [OPTIONS]197 -h Display this usage message198 -H hostname Hostname to connect to199""")200```201202выдаёт следующий результат:203204```text205Usage: thingy [OPTIONS]206 -h Display this usage message207 -H hostname Hostname to connect to208```209210Если сделать строковый литерал «сырым» (raw), последовательности `\n` не преобразуются в символы новой строки, но обратная косая черта в конце строки и символ новой строки в исходном коде включаются в строку как данные. Таким образом, пример:211212```python213hello = r"This is a rather long string containing\n\214several lines of text much as you would do in C."215216print(hello)217```218219выведет:220221```text222This is a rather long string containing\n\223several lines of text much as you would do in C.224```225226Строки можно объединять (склеивать) оператором `+` и повторять оператором `*`:227228```python229>>> word = 'Help' + 'A'230>>> word231'HelpA'232>>> '<' + word*5 + '>'233'<HelpAHelpAHelpAHelpAHelpA>'234```235236Два строковых литерала, расположенные рядом, автоматически конкатенируются; первую строку выше можно было бы записать как `word = 'Help' 'A'`; это работает только с двумя литералами, но не с произвольными строковыми выражениями:237238```python239>>> 'str' 'ing' # <- Это нормально240'string'241>>> 'str'.strip() + 'ing' # <- Это нормально242'string'243>>> 'str'.strip() 'ing' # <- Это недопустимо244 File "<stdin>", line 1, in ?245 'str'.strip() 'ing'246 ^247SyntaxError: invalid syntax248```249250Строки можно индексировать (обращаться по индексу); как и в C, первый символ строки имеет индекс 0. Отдельного типа для символов нет; символ – это просто строка длины 1. Как и в языке программирования Icon, подстроки можно задавать с помощью *нотации среза*: два индекса, разделённые двоеточием.251252```python253>>> word[4]254'A'255>>> word[0:2]256'He'257>>> word[2:4]258'lp'259```260261Индексы среза имеют полезные значения по умолчанию: опущенный первый индекс по умолчанию равен нулю, а опущенный второй – длине строки, из которой берётся срез.262263```python264>>> word[:2] # Первые два символа265'He'266>>> word[2:] # Всё, кроме первых двух символов267'lpA'268```269270В отличие от строк C, строки Python нельзя изменить. Присваивание значения по индексу в строке приводит к ошибке:271272```python273>>> word[0] = 'x'274Traceback (most recent call last):275 File "<stdin>", line 1, in ?276TypeError: 'str' object does not support item assignment277>>> word[:1] = 'Splat'278Traceback (most recent call last):279 File "<stdin>", line 1, in ?280TypeError: 'str' object does not support slice assignment281```282283Однако создать новую строку с объединённым содержимым легко и эффективно:284285```python286>>> 'x' + word[1:]287'xelpA'288>>> 'Splat' + word[4]289'SplatA'290```291292Вот полезное инвариантное свойство операций со срезами: `s[:i] + s[i:]` равно `s`.293294```python295>>> word[:2] + word[2:]296'HelpA'297>>> word[:3] + word[3:]298'HelpA'299```300301Вырожденные индексы срезов обрабатываются корректно: слишком большой индекс заменяется длиной строки, а верхняя граница, меньшая нижней, возвращает пустую строку.302303```python304>>> word[1:100]305'elpA'306>>> word[10:]307''308>>> word[2:1]309''310```311312Индексы могут быть отрицательными числами для отсчёта справа. Например:313314```python315>>> word[-1] # Последний символ316'A'317>>> word[-2] # Предпоследний символ318'p'319>>> word[-2:] # Последние два символа320'pA'321>>> word[:-2] # Все, кроме последних двух символов322'Hel'323```324325Но обратите внимание, что -0 – это на самом деле то же самое, что и 0, поэтому отсчёт справа не работает!326327```python328>>> word[-0] # (поскольку -0 равно 0)329'H'330```331332Отрицательные индексы срезов, выходящие за диапазон, усекаются, но не пытайтесь делать это с одноэлементными (не срезовыми) индексами:333334```python335>>> word[-100:]336'HelpA'337>>> word[-10] # ошибка338Traceback (most recent call last):339 File "<stdin>", line 1, in ?340IndexError: string index out of range341```342343Один из способов запомнить, как работают срезы – представлять индексы *между* символами, причём левый край первого символа имеет номер 0. Тогда правый край последнего символа строки из *n* символов имеет индекс *n*, например:344345```python346 +---+---+---+---+---+347 | H | e | l | p | A |348 +---+---+---+---+---+349 0 1 2 3 4 5350-5 -4 -3 -2 -1351```352353Первая строка чисел показывает положение индексов 0...5 в строке; вторая строка – соответствующие отрицательные индексы. Срез от *i* до *j* состоит из всех символов между границами, обозначенными *i* и *j* соответственно.354355Для неотрицательных индексов длина среза равна разности индексов, если оба находятся в пределах границ. Например, длина `word[1:3]` равна 2.356357Встроенная функция [`len()`](https://python-all.ru/3.1/library/functions.html#len) возвращает длину строки:358359```python360>>> s = 'supercalifragilisticexpialidocious'361>>> len(s)36234363```364365> **См. также**366>367> **[*Типы последовательностей – str, bytes, bytearray, list, tuple, range*](https://python-all.ru/3.1/library/stdtypes.html#typesseq)**368>369> Строки – это пример370>371> *типов-последовательностей*372>373> и поддерживают общие операции, характерные для таких типов.374>375> **[*Методы строк*](https://python-all.ru/3.1/library/stdtypes.html#string-methods)**376>377> Строки поддерживают множество методов для базовых преобразований и поиска.378>379> **[*Форматирование строк*](https://python-all.ru/3.1/library/string.html#string-formatting)**380>381> Информация о форматировании строк с помощью382>383> [`str.format()`](https://python-all.ru/3.1/library/stdtypes.html#str.format)384>385> описана здесь.386>387> **[*Устаревшие операции форматирования строк*](https://python-all.ru/3.1/library/stdtypes.html#old-string-formatting)**388>389> Старые операции форматирования, которые выполняются, когда строки и строки Unicode являются левым операндом оператора390>391> `%`392>393> , подробнее описаны здесь.394395### 3.1.3. О Unicode396397Начиная с Python 3.0 все строки поддерживают Unicode (см. [http://www.unicode.org/](https://python-all.ru/3.1/tutorial/introduction.html)).398399Преимущество Unicode в том, что он предоставляет одно числовое значение (ordinal) для каждого символа любого письма, используемого в современных и древних текстах. Раньше для символов письменности было доступно только 256 возможных значений. Тексты обычно были привязаны к кодовой странице, которая сопоставляла значения символам. Это приводило к большой путанице, особенно в вопросах интернационализации (обычно записывается как `i18n` – `'i'` + 18 символов + `'n'`) программного обеспечения. Unicode решает эти проблемы, определяя единую кодовую страницу для всех письменностей.400401Если нужно включить в строку специальные символы, это можно сделать с помощью кодировки *Unicode-Escape* языка Python. Следующий пример показывает, как:402403```python404>>> 'Hello\u0020World !'405'Hello World !'406```407408Последовательность экранирования `\u0020` указывает на вставку символа Unicode с порядковым значением 0x0020 (символ пробела) в указанной позиции.409410Остальные символы интерпретируются с использованием их порядковых значений непосредственно как коды Unicode. Для строковых литералов в стандартной кодировке Latin-1, используемой во многих западных странах, удобно, что младшие 256 символов Unicode совпадают с 256 символами Latin-1.411412Помимо этих стандартных кодировок, Python предоставляет целый набор других способов создания строк Unicode на основе известной кодировки.413414Для преобразования строки в последовательность байтов с использованием определённой кодировки строковые объекты предоставляют метод `encode()`, который принимает один аргумент – имя кодировки. Рекомендуется использовать строчные имена кодировок.415416```python417>>> "Äpfel".encode('utf-8')418b'\xc3\x84pfel'419```420421### 3.1.4. Списки422423Python поддерживает несколько *составных* типов данных, используемых для группировки других значений. Наиболее универсальным является *список*, который можно записать как список значений (элементов), разделённых запятыми, в квадратных скобках. Элементы списка не обязательно должны быть одного типа.424425```python426>>> a = ['spam', 'eggs', 100, 1234]427>>> a428['spam', 'eggs', 100, 1234]429```430431Как и индексы строк, индексы списков начинаются с 0, а списки можно срезать, объединять и так далее:432433```python434>>> a[0]435'spam'436>>> a[3]4371234438>>> a[-2]439100440>>> a[1:-1]441['eggs', 100]442>>> a[:2] + ['bacon', 2*2]443['spam', 'eggs', 'bacon', 4]444>>> 3*a[:3] + ['Boo!']445['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']446```447448В отличие от строк, которые являются *неизменяемыми*, можно изменять отдельные элементы списка:449450```python451>>> a452['spam', 'eggs', 100, 1234]453>>> a[2] = a[2] + 23454>>> a455['spam', 'eggs', 123, 1234]456```457458Присваивание срезам также возможно, и это может даже изменить размер списка или полностью его очистить:459460```python461>>> # Заменить некоторые элементы:462... a[0:2] = [1, 12]463>>> a464[1, 12, 123, 1234]465>>> # Удалить некоторые:466... a[0:2] = []467>>> a468[123, 1234]469>>> # Вставить некоторые:470... a[1:1] = ['bletch', 'xyzzy']471>>> a472[123, 'bletch', 'xyzzy', 1234]473>>> # Вставить (копию) себя в начало474>>> a[:0] = a475>>> a476[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]477>>> # Очистить список: заменить все элементы пустым списком478>>> a[:] = []479>>> a480[]481```482483Встроенная функция [`len()`](https://python-all.ru/3.1/library/functions.html#len) применима также и к спискам:484485```python486>>> a = ['a', 'b', 'c', 'd']487>>> len(a)4884489```490491Списки можно вкладывать друг в друга (создавать списки, содержащие другие списки), например:492493```python494>>> q = [2, 3]495>>> p = [1, q, 4]496>>> len(p)4973498>>> p[1]499[2, 3]500>>> p[1][0]5012502```503504Можно добавить элемент в конец списка:505506```python507>>> p[1].append('xtra')508>>> p509[1, [2, 3, 'xtra'], 4]510>>> q511[2, 3, 'xtra']512```513514Обратите внимание, что в последнем примере `p[1]` и `q` на самом деле ссылаются на один и тот же объект! Мы вернёмся к *семантике объектов* позже.515516## 3.2. Первые шаги к программированию517518Конечно, с помощью Python можно решать и более сложные задачи, чем сложение двух и двух. Например, можно вывести начальную подпоследовательность ряда *Фибоначчи* следующим образом:519520```python521>>> # ряд Фибоначчи:522... # сумма двух элементов определяет следующий523... a, b = 0, 1524>>> while b < 10:525... print(b)526... a, b = b, a+b527...528152915302531353255338534```535536В этом примере представлено несколько новых возможностей.537538- В первой строке используется *множественное присваивание*: переменные `a` и `b` одновременно получают новые значения 0 и 1. В последней строке этот приём используется снова; это демонстрирует, что сначала вычисляются все выражения в правой части, и только потом выполняются присваивания. Выражения в правой части вычисляются слева направо.539- Цикл [`while`](https://python-all.ru/3.1/reference/compound_stmts.html#while) выполняется, пока условие (в примере: `b < 10`) остаётся истинным. В Python, как и в C, любое целое ненулевое значение – истина, ноль – ложь. Условием может быть также строка, список или любая последовательность: всё, что имеет ненулевую длину, – истина, пустые последовательности – ложь. Проверка в примере – это простое сравнение. Стандартные операторы сравнения записываются так же, как в C: `<` (меньше), `>` (больше), `==` (равно), `<=` (меньше или равно), `>=` (больше или равно) и `!=` (не равно).540- *Тело* цикла *выделяется отступом*: отступы – это способ группировки операторов в Python. В Python (пока!) нет интеллектуального ввода строк, поэтому для каждой строки с отступом требуется вводить табуляцию или пробелы. На практике более сложный ввод для Python готовится в текстовом редакторе; большинство текстовых редакторов имеют функцию автоотступа. При интерактивном вводе составного оператора после него должна следовать пустая строка для указания завершения (поскольку синтаксический анализатор не может угадать, когда введена последняя строка). Обратите внимание, что каждая строка в пределах базового блока должна иметь одинаковый отступ.541- Функция [`print()`](https://python-all.ru/3.1/library/functions.html#print) выводит значение переданного ей выражения (или выражений). Она отличается от простой записи выражения, которое нужно вывести (как это делалось ранее в примерах с калькулятором), способом обработки нескольких выражений, чисел с плавающей точкой и строк. Строки выводятся без кавычек, а между элементами вставляется пробел, что позволяет красиво форматировать вывод, например:542543 ```python544 >>> i = 256*256545 >>> print('The value of i is', i)546 The value of i is 65536547 ```548549 Ключевое слово *end* можно использовать для подавления перевода строки после вывода или для завершения вывода другой строкой:550551 ```python552 >>> a, b = 0, 1553 >>> while b < 1000:554 ... print(b, end=',')555 ... a, b = b, a+b556 ...557 1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,558 ```559