Документация Python неофициальный перевод
Содержание страницы

3. Неформальное введение в PythonAn Informal Introduction to Python

В следующих примерах ввод и вывод различаются наличием или отсутствием приглашений (>>> и ): чтобы повторить пример, необходимо ввести всё после приглашения, когда оно появляется; строки, не начинающиеся с приглашения, являются выводом интерпретатора. Обратите внимание, что вторичное приглашение на отдельной строке в примере означает, что нужно ввести пустую строку; это используется для завершения многострочной команды.

Многие примеры в этом руководстве, даже те, которые вводятся в интерактивном приглашении, содержат комментарии. Комментарии в Python начинаются с символа решётки, #, и продолжаются до конца физической строки. Комментарий может находиться в начале строки, после пробелов или кода, но не внутри строкового литерала. Символ решётки внутри строкового литерала – это просто символ решётки. Поскольку комментарии служат для пояснения кода и не интерпретируются Python, их можно опускать при вводе примеров.

Несколько примеров:

# это первый комментарий
spam = 1  # а это второй комментарий
          # ... и теперь третий!
text = "# This is not a comment because it's inside quotes."

3.1. Использование Python в качестве калькулятораUsing Python as a Calculator

Давайте попробуем несколько простых команд Python. Запустите интерпретатор и дождитесь основного приглашения, >>>. (Это не должно занять много времени.)

3.1.1. ЧислаNumbers

Интерпретатор работает как простой калькулятор: можно ввести выражение в него и он выведет значение. Синтаксис выражений прост: операторы +, -, * и / работают так же, как в большинстве других языков (например, Pascal или C); круглые скобки (()) можно использовать для группировки. Например:

>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5  # деление всегда возвращает число с плавающей запятой
1.6

Целые числа (например, 2, 4, 20) имеют тип int, числа с дробной частью (например, 5.0, 1.6) – тип float. Мы узнаем больше о числовых типах позже в этом руководстве.

Деление (/) всегда возвращает число с плавающей запятой (float). Чтобы выполнить целочисленное деление и получить целый результат (отбрасывая дробную часть), можно использовать оператор //; для вычисления остатка – %:

>>> 17 / 3  # классическое деление возвращает число с плавающей запятой
5.666666666666667
>>>
>>> 17 // 3  # целочисленное деление отбрасывает дробную часть
5
>>> 17 % 3  # оператор % возвращает остаток от деления
2
>>> 5 * 3 + 2  # result * divisor + remainder
17

В Python можно использовать оператор ** для возведения в степень 1:

>>> 5 ** 2  # 5 в квадрате
25
>>> 2 ** 7  # 2 в степени 7
128

Знак равенства (=) используется для присваивания значения переменной. После этого результат не отображается до следующего интерактивного приглашения:

>>> width = 20
>>> height = 5 * 9
>>> width * height
900

Если переменная не «определена» (ей не присвоено значение), попытка её использования приведёт к ошибке:

>>> n  # попытка обращения к неопределённой переменной
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined

Имеется полная поддержка чисел с плавающей запятой; операторы со смешанными типами операндов преобразуют целочисленный операнд в число с плавающей запятой:

>>> 4 * 3.75 - 1
14.0

В интерактивном режиме последнее выведенное выражение присваивается переменной _. Это означает, что при использовании Python в качестве настольного калькулятора несколько упрощается продолжение вычислений, например:

>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06

Эту переменную следует рассматривать как доступную только для чтения. Не присваивайте ей значение явно – это создаст независимую локальную переменную с тем же именем, которая будет скрывать встроенную переменную с её магическим поведением.

В дополнение к int и float Python поддерживает и другие типы чисел, такие как Decimal и Fraction. Python также имеет встроенную поддержку комплексных чисел, и использует суффикс j или J для обозначения мнимой части (например, 3+5j).

3.1.2. СтрокиStrings

Помимо чисел, Python может также работать со строками, которые можно записать несколькими способами. Они могут быть заключены в одинарные кавычки ('...') или dвойные кавычки ("...") с одним и тем же результатом 2. \ можно использовать для экранирования кавычек:

>>> 'spam eggs'  # одинарные кавычки
'spam eggs'
>>> 'doesn\'t'  # используйте \' для экранирования одинарной кавычки...
"doesn't"
>>> "doesn't"  # ...или используйте двойные кавычки
"doesn't"
>>> '"Yes," they said.'
'"Yes," they said.'
>>> "\"Yes,\" they said."
'"Yes," they said.'
>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'

В интерактивном интерпретаторе выводимая строка заключается в кавычки, а специальные символы экранируются обратной косой чертой. Хотя это иногда может выглядеть иначе, чем ввод (ограничивающие кавычки могут меняться), обе строки эквивалентны. Строка заключается в двойные кавычки, если строка содержит одинарную кавычку и не содержит двойных, в противном случае она заключается в одинарные кавычки. Функция print() выводит более читаемый результат, опуская ограничивающие кавычки и печатая экранированные и специальные символы:

>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'
>>> print('"Isn\'t," they said.')
"Isn't," they said.
>>> s = 'First line.\nSecond line.'  # \n означает новую строку
>>> s  # без print(), \n включается в вывод
'First line.\nSecond line.'
>>> print(s)  # с print(), \n создает новую строку
First line.
Second line.

Если вы не хотите, чтобы символы, перед которыми стоит \, интерпретировались как специальные, можно использовать сырые строки, добавив r перед первой кавычкой:

>>> print('C:\some\name')  # здесь \n означает перевод строки!
C:\some
ame
>>> print(r'C:\some\name')  # обратите внимание на r перед кавычкой
C:\some\name

Строковые литералы могут занимать несколько строк. Один из способов – использовать тройные кавычки: """...""" или '''...'''. Символы конца строки автоматически включаются в строку, но это можно предотвратить, добавив \ в конец строки. Следующий пример:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

выводит следующий результат (обратите внимание, что начальный перевод строки не включается):

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

Строки можно объединять (склеивать) оператором + и повторять оператором *:

>>> # 3 раза 'un', затем 'ium'
>>> 3 * 'un' + 'ium'
'unununium'

Два или более строковых литерала (то есть заключённых в кавычки), расположенные рядом, автоматически объединяются.

>>> 'Py' 'thon'
'Python'

Эта возможность особенно полезна, когда нужно разбить длинные строки:

>>> text = ('Put several strings within parentheses '
...         'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'

Однако это работает только с двумя литералами, но не с переменными или выражениями:

>>> prefix = 'Py'
>>> prefix 'thon'  # нельзя объединить переменную и строковый литерал
  File "<stdin>", line 1
    prefix 'thon'
                ^
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
  File "<stdin>", line 1
    ('un' * 3) 'ium'
                   ^
SyntaxError: invalid syntax

Если нужно объединить переменные или переменную и литерал, используйте +:

>>> prefix + 'thon'
'Python'

Строки можно индексировать (по индексу), причём первый символ имеет индекс 0. Отдельного типа для символов нет; символ – это просто строка длины один:

>>> word = 'Python'
>>> word[0]  # символ в позиции 0
'P'
>>> word[5]  # символ в позиции 5
'n'

Индексы могут быть и отрицательными числами, тогда отсчёт ведётся справа:

>>> word[-1]  # последний символ
'n'
>>> word[-2]  # предпоследний символ
'o'
>>> word[-6]
'P'

Обратите внимание: поскольку -0 совпадает с 0, отрицательные индексы начинаются с -1.

Помимо индексации также поддерживается срезы. Если индексация используется для получения отдельных символов, то срезы позволяют получить подстроку:

>>> word[0:2]  # символы с позиции 0 (включительно) по 2 (исключительно)
'Py'
>>> word[2:5]  # символы с позиции 2 (включительно) до 5 (исключительно)
'tho'

Обратите внимание, что начальный индекс всегда включается, а конечный – всегда исключается. Это гарантирует, что s[:i] + s[i:] всегда равно s:

>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'

Индексы среза имеют полезные значения по умолчанию: опущенный первый индекс по умолчанию равен нулю, а опущенный второй – длине строки, из которой берётся срез.

>>> word[:2]   # символ от начала до позиции 2 (исключительно)
'Py'
>>> word[4:]   # символы с позиции 4 (включительно) до конца
'on'
>>> word[-2:]  # символы с предпоследнего (включительно) до конца
'on'

Один из способов запомнить, как работают срезы – представлять индексы между символами, причём левый край первого символа имеет номер 0. Тогда правый край последнего символа строки из n символов имеет индекс n, например:

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

Первая строка чисел показывает позиции индексов 0…6 в строке; вторая строка – соответствующие отрицательные индексы. Срез от i до j состоит из всех символов между границами, помеченными i и j соответственно.

Для неотрицательных индексов длина среза равна разности индексов, если оба находятся в допустимом диапазоне. Например, длина word[1:3] равна 2.

Попытка использовать слишком большой индекс приведёт к ошибке:

>>> word[42]  # в слове всего 6 символов
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

Однако выход за границы при использовании индексов среза обрабатывается без ошибок:

>>> word[4:42]
'on'
>>> word[42:]
''

Строки Python нельзя изменить – они являются неизменяемыми. Поэтому попытка присвоения значения элементу строки по индексу приводит к ошибке:

>>> word[0] = 'J'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

Если нужна другая строка, следует создать новую:

>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'

Встроенная функция len() возвращает длину строки:

>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34

См. также

Тип текстовой последовательности – str

Строки – это пример типов-последовательностей и поддерживают общие операции, характерные для таких типов.

Методы строк

Строки поддерживают множество методов для базовых преобразований и поиска.

Форматированные строковые литералы

Строковые литералы, содержащие встроенные выражения.

Синтаксис строк форматирования

Информация о форматировании строк с помощью str.format().

Строковое форматирование в стиле printf

Старые операции форматирования, которые вызываются, когда строка является левым операндом оператора %, описаны здесь более подробно.

3.1.3. СпискиLists

Python поддерживает несколько составных типов данных, используемых для объединения других значений. Самый универсальный из них – список (list), который можно записать как список разделённых запятыми значений (элементов) в квадратных скобках. Списки могут содержать элементы разных типов, но обычно все элементы имеют один и тот же тип.

>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]

Как и строки (и все остальные встроенные последовательные типы), списки можно индексировать и извлекать из них срезы:

>>> squares[0]  # индексация возвращает элемент
1
>>> squares[-1]
25
>>> squares[-3:]  # срез возвращает новый список
[9, 16, 25]

Все операции со срезами возвращают новый список, содержащий запрошенные элементы. Это означает, что следующий срез возвращает новую (поверхностную) копию списка:

>>> squares[:]
[1, 4, 9, 16, 25]

Списки также поддерживают операции, например, конкатенацию:

>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

В отличие от строк, которые являются неизменяемыми, списки – изменяемый тип, то есть их содержимое можно изменять:

>>> cubes = [1, 8, 27, 65, 125]  # здесь что-то не так
>>> 4 ** 3  # куб 4 равен 64, а не 65!
64
>>> cubes[3] = 64  # заменить неверное значение
>>> cubes
[1, 8, 27, 64, 125]

Также можно добавлять новые элементы в конец списка с помощью append() метода (о методах мы узнаем подробнее позже):

>>> cubes.append(216)  # добавить куб 6
>>> cubes.append(7 ** 3)  # и куб 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]

Присваивание срезам также возможно, и это может даже изменить размер списка или полностью его очистить:

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # заменить некоторые значения
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # теперь удалить их
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # очистить список, заменив все элементы пустым списком
>>> letters[:] = []
>>> letters
[]

Встроенная функция len() также применима к спискам:

>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4

Списки можно вкладывать друг в друга (создавать списки, содержащие другие списки), например:

>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'

3.2. Первые шаги в программированииFirst Steps Towards Programming

Конечно, Python можно использовать и для более сложных задач, чем сложение двух и двух. Например, можно вывести начальный отрезок ряда Фибоначчи следующим образом:

>>> # ряд Фибоначчи:
... # сумма двух элементов определяет следующий
... a, b = 0, 1
>>> while a < 10:
...     print(a)
...     a, b = b, a+b
...
0
1
1
2
3
5
8

В этом примере представлено несколько новых возможностей.

  • Первая строка содержит множественное присваивание: переменные a и b одновременно получают новые значения 0 и 1. В последней строке этот приём используется снова, показывая, что выражения в правой части вычисляются до того, как будет выполнено любое из присваиваний. Выражения в правой части вычисляются слева направо.

  • Цикл while выполняется, пока условие (в данном случае: a < 10) остаётся истинным. В Python, как и в C, любое ненулевое целое число считается истинным; ноль – ложным. Условием может также быть строка или список, в общем, любая последовательность: всё, что имеет ненулевую длину, истинно, а пустые последовательности ложны. Проверка, используемая в примере, – это простое сравнение. Стандартные операторы сравнения записываются так же, как в C: < (меньше), > (больше), == (равно), <= (меньше или равно), >= (больше или равно) и != (не равно).

  • Тело цикла отступает: отступы – это способ Python группировать инструкции. В интерактивной подсказке нужно вводить табуляцию или пробел(ы) для каждой строки с отступом. На практике для более сложного ввода в Python готовят код в текстовом редакторе; все приличные редакторы имеют функцию автоматического отступа. При интерактивном вводе составной инструкции после неё должна следовать пустая строка, чтобы указать завершение (поскольку синтаксический анализатор не может угадать, когда введена последняя строка). Обратите внимание, что каждая строка внутри одного базового блока должна иметь одинаковый отступ.

  • Функция print() выводит значение переданного ей аргумента (или аргументов). Она отличается от простого вывода выражения (как мы делали ранее в примерах с калькулятором) тем, как обрабатывает множественные аргументы, числа с плавающей запятой и строки. Строки выводятся без кавычек, а между элементами вставляется пробел, что позволяет красиво форматировать вывод, например так:

    >>> i = 256*256
    >>> print('The value of i is', i)
    The value of i is 65536
    

    Именованный аргумент end можно использовать, чтобы избежать перевода строки после вывода или завершить вывод другой строкой:

    >>> a, b = 0, 1
    >>> while a < 1000:
    ...     print(a, end=',')
    ...     a, b = b, a+b
    ...
    0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
    

Сноски

1

Поскольку ** имеет более высокий приоритет, чем -, -3**2 будет интерпретировано как -(3**2) и в результате даст -9. Чтобы избежать этого и получить 9, можно использовать (-3)**2.

2

В отличие от других языков, специальные символы, такие как \n, имеют одинаковое значение как в одинарных ('...'), так и в двойных ("...") кавычках. Единственное различие между ними: внутри одинарных кавычек не нужно eкранировать " (но нужно экранировать \'), и наоборот.