Неформальное введение в 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. Числа
Интерпретатор работает как простой калькулятор: вы можете ввести выражение, и он выведет его значение. Синтаксис выражений прост: операторы +, -, * и / работают так же, как и в большинстве других языков (например, Pascal или C); скобки (()) могут использоваться для группировки. Например:
>>> 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. Мы подробнее рассмотрим числовые типы позже в этом руководстве.
Деление (/) всегда возвращает число с плавающей точкой. Для выполнения деления по модулю и получения целого результата (отбрасывая дробную часть) можно использовать оператор //; для вычисления остатка можно использовать %;
>>> 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 # result * 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 также имеет встроенную поддержку комплексных чисел, и использует суффикс 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.
Если вы не хотите, чтобы символы, предваряемые \, интерпретировались как специальные символы, вы можете использовать сырые строки, добавив 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'
Строки можно индексировать (индексировать), при этом первый символ имеет индекс 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.
В дополнение к индексированию поддерживается срез. В то время как индексирование используется для получения отдельных символов, срез позволяет получить подстроку:
>>> word[0:2] # characters from position 0 (included) to 2 (excluded) 'Py' >>> word[2:5] # characters from position 2 (included) to 5 (excluded) 'tho'
Обратите внимание, как начало всегда включается, а конец всегда исключается. Это гарантирует, что s[:i] + s[i:] всегда равно s;
>>> word[:2] + word[2:] 'Python' >>> word[:4] + word[4:] 'Python'
Индексы среза имеют полезные значения по умолчанию; пропущенный первый индекс по умолчанию равен нулю, пропущенный второй индекс по умолчанию равен размеру срезанной строки.
>>> 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'
Один из способов запомнить, как работают срезы, — представить индексы как указывающие между символами, причём левая граница первого символа имеет номер 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 не могут быть изменены — они неизменяемы. Поэтому присвоение индексированной позиции в строке приводит к ошибке:
>>> 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] # indexing returns the item 1 >>> squares[-1] 25 >>> squares[-3:] # slicing returns a new list [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] # 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: ... # 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, имеют одинаковое значение как в одинарных ('...'), так и в двойных ("...") кавычках. Единственное различие между ними заключается в том, что в одинарных кавычках вам не нужно экранировать"(но вы должны экранировать\'и наоборот).
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/tutorial/introduction.html