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

В следующих примерах ввод и вывод различаются присутствием или отсутствием приглашений (>>> (docs.python.org/3/glossary.html#term) и ... (docs.python.org/3/glossary.html#term-1)): чтобы повторить пример, вы должны ввести все после приглашения, когда оно появляется; строки, которые не начинаются с приглашения, являются выводом интерпретатора. Заметьте, что вторичное приглашение на отдельной строке в примере означает, что вы должны ввести пустую строку; это используется для окончания многострочной команды.

Многие из примеров в данном руководстве, даже те, которые вводятся в интерактивном режиме, включают комментарии. Комментарии в 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. Далее в учебнике мы подробнее познакомимся с числовыми типами.

Деление (/) всегда возвращает вещественное число. Чтобы выполнить floor division (docs.python.org/3/glossary.html#term-floor-division) и получить целый результат (отбрасыванием какой-либо дробной части), вы можете использовать оператор //; для вычисления остатка можете использовать %:

>>> 17 / 3  # классическое деление возвращает вещественное число
5.666666666666667
>>>
>>> 17 // 3  # деление нацело отбрасывает дробную часть
5
>>> 17 % 3  # оператор % возвращает остаток от деления
2
>>> 5 * 3 + 2  # результат * делитель + остаток
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

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

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5

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

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

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

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

3.1.2. Строки

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

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

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

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

Если вы не хотите, чтобы символы, которым предшествует \, интерпретировались как специальные, то можете использовать raw string (сырые строки - прим. перев.), добавив 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'

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

>>> prefix = 'Py'
>>> prefix 'thon'  # не может соединить переменную и строковый литерал
  ...
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
  ...
SyntaxError: invalid syntax

Если вы хотите конкатенировать переменные или переменную и литерал, используйте +:

>>> prefix + 'thon'
'Python'

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

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

Строка может быть проиндексирована, первый символ имеет индекс 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]  # у word только 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 не могут быть изменены - они неизменяемы (docs.python.org/3/glossary.html#term-immutable). Поэтому присвоение по индексированной позиции в строке приводит к ошибке:

>>> word[0] = 'J'
  ...
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
  ...
TypeError: 'str' object does not support item assignment

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

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

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

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

Смотрите также:

  • Тип текстовой последовательности — str 
    Строки являются примером типов последовательностей и поддерживают обычные операции, поддерживаемые такими типами.
  • Методы строк 
    Строки поддерживают большое число методов для основных преобразований и поиска.
  • Formatted string literals (docs.python.org/3/reference/lexical_analysis.html#f-strings)
    Строковые литералы со встроенными выражениями.
  • Format String Syntax (docs.python.org/3/library/string.html#formatstrings)
    Информация о форматировании строк с помощью str.format().
  • printf-стиль форматирования строки
    Старые операции форматирования вызываются, когда строки являются левым операндом оператора %, описанного более подробно здесь.

3.1.3. Списки

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

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

Как строки (и все другие встроенные типы последовательностей (docs.python.org/3/glossary.html#term-sequence)), списки могут быть проиндексированы и из них можно брать срезы:

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

В отличие от строк, которые неизменяемые (docs.python.org/3/glossary.html#term-immutable), списки являются изменяемым (docs.python.org/3/glossary.html#term-mutable) типом, т. е. есть возможность изменить их содержание:

>>> 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 b < 10:
...     print(b)
...     a, b = b, a+b
...
1
1
2
3
5
8

Этот пример знакомит с несколькими новыми свойствами.

  • Первая строка содержит множественное присваивание: переменные a и b одновременно получают новые значения 0 и 1. В последней строке это используется опять, демонстрируя, что сначала выражения с правой стороны полностью оцениваются, прежде чем произойдет какое-либо присваивание. Выражения с правой стороны выполняются слева направо.
  • Цикл while (docs.python.org/3/reference/compound_stmts.html#while) выполняется до тех пор, пока условие (здесь b < 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 b < 1000:
...     print(b, end=',')
...     a, b = b, a+b
...
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, имеют одинаковое значение как в одинарных ('...'), так и двойных ("...") кавычках. Разница между двумя вариантами только в том, что в одинарных кавычках вам не надо экранировать " (но вы должны экранировать \') и наоборот.

Создано

Обновлено