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