3. Неофициальное знакомство c Python

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

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

Примеры:

# первый комментарий
spam = 1  # и здесь второй комментарий
          # ... здесь третий!
text = "# Это не комментарий, потому что внутри кавычек."

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

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

3.1.1. Числа

Поведение интерпретатора сходно поведению калькулятора: вы вводите выражение, а в ответ он выводит значение. Синтаксис выражений привычен: операции +, -, * и / работают так же как и в большинстве других языков (например, 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. Строки

Кроме чисел, Python также может работать со строками, которые могут быть описаны несколькими способами. Они могут быть заключены в одиночные кавычки ('...') или двойные кавычки ("...") с тем же [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…5 в строке; второй ряд дает соответствующие отрицательные индексы. Слайс от 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. Списки

В языке Python доступно некоторое количество составных типов данных, использующихся для группировки прочих значений вместе. Наиболее гибкий из них — список. Его можно выразить в тексте программы через разделённые запятыми значения (элементы), заключённые в квадратные скобки. Элементы списка могут быть разных типов, но обычно элементы все имеют тот же тип.

>>> 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. Первые шаги в программировании

Конечно, мы можем использовать 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, любое ненулевое целое значение истинно; 0 — ложный. Условие также может быть строковым или перечисленным значением, фактически любой последовательностью; все, что имеет ненулевую длину, является истинным, пустые последовательности являются ложными. Проверка, используемая в примере, является простым сравнением. Стандартные операторы сравнения аналогичны 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, имеют одинаковое значение с одинарными ('...') и двойными ("...") кавычками. Единственное различие между ними состоит в том, что в пределах одиночных кавычек нет необходимости экранирования " (но необходимо экранировать \') и наоборот.