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

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

Вы можете переключить отображение подсказок и вывода, нажав на >>> в правом верхнем углу окна примера. Если скрыть подсказки и вывод для примера, то можно легко скопировать и вставить строки ввода в интерпретатор.

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

Некоторые примеры:

# this is the first comment
spam = 1  # and this is the second comment
          # ... and now a third!
text = "# This is not a comment because it's inside quotes."

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

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

3.1.1. Номера

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

>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5  # division always returns a floating point number
1.6

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

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

>>> 17 / 3  # classic division returns a float
5.666666666666667
>>>
>>> 17 // 3  # floor division discards the fractional part
5
>>> 17 % 3  # the % operator returns the remainder of the division
2
>>> 5 * 3 + 2  # floored quotient * divisor + remainder
17

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

>>> 5 ** 2  # 5 squared
25
>>> 2 ** 7  # 2 to the power of 7
128

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

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

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

>>> n  # try to access an undefined variable
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 также имеет встроенную поддержку complex numbers, и использует суффикс j или J для обозначения мнимой части (например, 3+5j).

3.1.2. Струны

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

>>> 'spam eggs'  # single quotes
'spam eggs'
>>> 'doesn\'t'  # use \' to escape the single quote...
"doesn't"
>>> "doesn't"  # ...or use double quotes instead
"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 means newline
>>> s  # without print(), \n is included in the output
'First line.\nSecond line.'
>>> print(s)  # with print(), \n produces a new line
First line.
Second line.

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

>>> print('C:\some\name')  # here \n means newline!
C:\some
ame
>>> print(r'C:\some\name')  # note the r before the quote
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 times 'un', followed by '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'  # can't concatenate a variable and a string literal
  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'

Строки могут быть индексированными (subscripted), причем первый символ имеет индекс 0. Отдельного типа символов не существует; символ - это просто строка размером один:

>>> word = 'Python'
>>> word[0]  # character in position 0
'P'
>>> word[5]  # character in position 5
'n'

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

>>> word[-1]  # last character
'n'
>>> word[-2]  # second-last character
'o'
>>> word[-6]
'P'

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

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

>>> word[0:2]  # characters from position 0 (included) to 2 (excluded)
'Py'
>>> word[2:5]  # characters from position 2 (included) to 5 (excluded)
'tho'

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

>>> word[:2]   # character from the beginning to position 2 (excluded)
'Py'
>>> word[4:]   # characters from position 4 (included) to the end
'on'
>>> word[-2:]  # characters from the second-last (included) to the end
'on'

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

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

Один из способов запомнить, как работают срезы, - это представить индексы как указатели между символами, с левым краем первого символа под номером 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]  # the word only has 6 characters
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

Однако индексы срезов вне диапазона обрабатываются изящно при использовании для срезов:

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

Строки Python не могут быть изменены — они immutable. Поэтому присвоение индексированной позиции в строке приводит к ошибке:

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

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

>>> squares[0]  # indexing returns the item
1
>>> squares[-1]
25
>>> squares[-3:]  # slicing returns a new list
[9, 16, 25]

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

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

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

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

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

>>> cubes = [1, 8, 27, 65, 125]  # something's wrong here
>>> 4 ** 3  # the cube of 4 is 64, not 65!
64
>>> cubes[3] = 64  # replace the wrong value
>>> cubes
[1, 8, 27, 64, 125]

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

>>> cubes.append(216)  # add the cube of 6
>>> cubes.append(7 ** 3)  # and the cube of 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']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
>>> 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 для более сложных задач, чем сложение двух и двух вместе. Например, мы можем написать начальную подпоследовательность Fibonacci series следующим образом:

>>> # Fibonacci series:
... # the sum of two elements defines the next
... 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, имеют одинаковое значение как в одинарных ('...'), так и в двойных ("...") кавычках. Единственное различие между ними заключается в том, что внутри одинарных кавычек не нужно экранировать " (но нужно экранировать \') и наоборот.

Вернуться на верх