Простой Python — страница 6 из 66

>>>. Перед вами приглашение для ввода команд Python.

3. Немного поэкспериментируйте с интерпретатором. Используйте его как калькулятор и наберите текст 8 * 9. Нажмите клавишу Enter, чтобы увидеть результат. Python должен вывести 72.

4. Теперь введите число 47 и нажмите клавишу Enter. Появилось ли число 47 в следующей строке?

5. Теперь введите print(47) и нажмите клавишу Enter. Появилось ли снова число 47 в следующей строке?

Глава 2. Ингредиенты Python: числа, строки и переменные

В этой главе мы рассмотрим простейшие встроенные в Python типы данных:

• булевы значения (которые имеют значение True или False);

• целые числа (вроде 42 и 100 000 000);

• числа с плавающей точкой (числа с десятичной запятой, вроде 3,14159 или экспоненты, вроде 1,0е8, что означает «один умножить на десять в восьмой степени», или 100 000 000,0);

• строки (последовательности текстовых символов).

Можно сказать, что они являются атомами. В этой главе мы будем использовать их обособленно. В главе 3 будет показано, как объединить их в молекулы.

Каждый тип имеет специфические правила использования, они по-разному обрабатываются компьютером. Мы также познакомимся с переменными (имена, которые ссылаются на данные; чуть подробнее мы поговорим о них совсем скоро).

Примеры кода, приведенные в этой главе, корректны с точки зрения Python, но они являются лишь фрагментами кода. Мы будем использовать интерактивный интерпретатор Python, вводя в него эти фрагменты и немедленно получая результат. Попробуйте запустить их самостоятельно. Вы распознаете эти примеры по приглашению >>>. В главе 4 мы начнем писать программы, которые могут работать самостоятельно.

Переменные, имена и объекты

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

Объект похож на прозрачный пластиковый ящик, который содержит фрагмент данных (рис. 2.1). Объект имеет тип вроде булевых значений или целых чисел, который определяет, что можно сделать с этими данными. В реальном мире ящик с надписью «Керамика» может сообщить некоторую информацию (скорее всего, он тяжелый и лучше не ронять его на пол). Точно так же и в Python — если объект имеет тип int, вы знаете, что сможете сложить его с другим объектом типа int.


Рис. 2.1. Объект похож на коробку


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

Python является строго типизированным языком, а это означает, что тип объекта не изменится, даже если можно поменять его значение (рис. 2.2).


Рис. 2.2. Строгая типизация не означает, что нужно нажимать клавиши со строгим выражением лица


Языки программирования также позволяют вам определять переменные. Переменные являются именами, которые ссылаются на значения в памяти компьютера. Вы можете определить их для использования в своей программе. В Python символ = применяется для присваивания значения переменной.


В школе нас всех учили, что символ = означает «равно». Почему же во многих языках программирования, включая Python, этот символ используется для обозначения присваивания? Одна из причин — на стандартной клавиатуре отсутствуют логические альтернативы вроде стрелки влево, а символ = не слишком сбивает с толку. Кроме того, в компьютерных программах присваивание используется чаще проверки на равенство.


В следующей программе целое число 7 присваивается переменной с именем a, затем на экран выводится значение, связанное в текущий момент с этой переменной:

>>> a = 7

>>> print(a)

7

Сейчас пришло время сделать очень важное заявление о переменных в Python: переменные — это просто имена. Присваивание не копирует значение, оно прикрепляет имя к объекту, который содержит данные. Имя — это ссылка на какой-то объект, а не сам объект. Имя можно рассматривать как стикер (рис. 2.3).


Рис. 2.3. Имена прикрепляются к объектам


Попробуйте сделать следующее с помощью интерактивного интерпретатора.

1. Как и раньше, присвойте значение 7 имени a. Это создаст объект-«ящик», содержащий целочисленное значение 7.

2. Выведите на экран значение а.

3. Присвойте а переменной b, заставив b прикрепиться к объекту-«ящику», содержащему значение 7.

4. Выведите значение b.

>>> a = 7

>>> print(a)

7

>>> b = a

>>> print(b)

7

В Python, если вы хотите узнать тип какого-то объекта (переменной или значения), вам следует использовать конструкцию type(объект). Попробуем сделать это для разных значений (58, 99.9, abc) и переменных (a, b):

>>> type(a)

>>> type(b)

>>> type(58)

>>> type(99.9)

>>> type('abc')

Класс — это определение объекта; классы детально рассматриваются в главе 6. В Python значения терминов «класс» и «тип» примерно одинаковы.

Имена переменных могут содержать только следующие символы:

• буквы в нижнем регистре (от «a» до «z»);

• буквы в верхнем регистре (от «A» до «Z»);

• цифры (от 0 до 9);

• нижнее подчеркивание (_).

Имена не могут начинаться с цифры. Python также особо обрабатывает имена, которые начинаются с нижнего подчеркивания (об этом вы можете прочесть в главе 4). Корректными являются следующие имена:

• a;

• a1;

• a_b_c___95;

• _abc;

• _1a.

Следующие имена, однако, некорректны:

• 1;

• 1a;

• 1_.

Наконец, не следует использовать следующие слова для имен переменных, поскольку они являются зарезервированными словами Python:

falseclassfinallyisreturn
nonecontinueforlambdatry
truedeffromnonlocalwhile
anddelglobalnotwith
aselififoryield
assertelseimportpass
breakexceptinraise

Эти слова и некоторые знаки препинания используются в синтаксисе Python. Вы познакомитесь с ними всеми по мере чтения этой книги.

Числа

Python имеет встроенную поддержку целых чисел (наподобие 5 и 1 000 000 000) и чисел с плавающей точкой (вроде 3,1416, 14,99 и 1,87е4). Вы можете вычислять комбинации чисел с помощью простых математических операторов, приведенных в таблице.

ОператорОписаниеПримерРезультат
+Сложение5 + 813
Вычитание90–1080
*Умножение4 * 728
/Деление с плавающей точкой7/23,5
//Целочисленное (Truncating) деление7//23
%Modulus (вычисление остатка)7%31
**Возведение в степень3481

На нескольких следующих страницах я покажу вам простые примеры того, как Python можно использовать в качестве очень сложного калькулятора.

Целые числа

Любая последовательность цифр в Python считается целым числом:

>>> 5

5

Можно использовать и простой ноль (0):

>>> 0

0

Но не ставьте его перед другими цифрами:

>>> 05

··File "", line 1

····05

·····^

SyntaxError: invalid token


Только что вы увидели первое исключение в Python — программную ошибку. В нашем случае это предупреждение о том, что значение 05 — это invalid token (некорректный символ). Я объясню, что это значит, в подразделе «Системы счисления» далее. В этой книге вы увидите еще много примеров исключений, поскольку они являются основным механизмом обработки ошибок в Python.


Последовательность цифр указывает на целое число. Если вы поместите знак + перед цифрами, число останется прежним:

>>> 123

123

>>> +123

123

Чтобы указать на отрицательное число, вставьте перед цифрами знак —:

>>> -123

-123

С помощью Python вы можете выполнять обычные арифметические действия, как и с обычным калькулятором, используя операторы, показанные в предыдущей таблице. Сложение и вычитание будут работать, полностью соответствуя вашим ожиданиям:

>>> 5 + 9

14

>>> 100–7

93

>>> 4–10

-6

Вы можете работать с любым количеством чисел и операторов:

>>> 5 + 9 + 3

17

>>> 4 + 3–2 — 1 + 6

10

Замечание по стилю: не обязательно вставлять пробел между каждым числом и оператором:

>>> 5+9···+······3

17

Такой формат выглядит лучше, и его проще прочесть.

Умножение тоже довольно привычно:

>>> 6 * 7

42

>>> 7 * 6

42

>>> 6 * 7 * 2 * 3

252

Операция деления чуть более интересна, поскольку существует два ее вида:

• с помощью оператора / выполняется деление с плавающей точкой (десятичное деление);

• с помощью оператора // выполняется целочисленное деление (деление с остатком).

Даже если вы делите целое число на целое число, оператор / даст результат с плавающей точкой:

>>> 9 / 5

1.8

Целочисленное деление даст вам целочисленный ответ, отбрасывая остаток:

>>> 9 // 5

1

Деление на ноль с помощью любого оператора сгенерирует исключение:

>>> 5 / 0

Traceback (most recent call last):

··File "", line 1, in 

ZeroDivisionError: division by zero

>>> 7 // 0

Traceback (most recent call last):

··File "", line 1, in 

ZeroDivisionError: integer division or modulo by z

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

>>> a = 95

>>> a

95

>>> a — 3

92

Ранее, когда мы выполнили операцию a — 3, мы не присвоили результат переменной a, поэтому ее значение не изменилось:

>>> a

95

Если вы хотите изменить значение переменной а, придется сделать следующее:

>>> a = a — 3

>>> a

92

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

Проще думать об этом так.

1. Вычитаем 3 из а.

2. Присваиваем результат этого вычитания временной переменной.

3. Присваиваем значение временной переменной а:

>>> a = 95

>>> temp = a — 3

>>> a = temp

Поэтому, когда вы говорите:

>>> a = a — 3

Python рассчитывает результат операции вычитания с правой стороны от знака =, запоминает результат, а затем присваивает его переменной а, которая находится с левой стороны. Это гораздо быстрее и приятнее глазу, чем использование временной переменной.

Вы можете совместить арифметические операторы с присваиванием, размещая оператор перед знаком =. В этом примере выражение а — = 3 аналогично выражению а = а — 3:

>>> a = 95

>>> a — = 3

>>> a

92

Это выражение аналогично выражению а = а + 8:

>>> a += 8

>>> a

100

А это — выражению а = а * 2:

>>> a *= 2

>>> a

200

Здесь представлен пример деления с плавающей точкой, а = а / 3:

>>> a /= 3

>>> a

66.66666666666667

Присвоим значение 13 переменной а, а затем попробуем использовать сокращенный вариант а = а // 4 (целочисленное деление):

>>> a = 13

>>> a //= 4

>>> a

3

Символ % имеет несколько разных применений в Python. Когда он находится между двух чисел, с его помощью вычисляется остаток от деления первого числа на второе:

>>> 9 % 5

4

Вот так можно получить частное и остаток одновременно:

>>> divmod(9,5)

(1, 4)

В противном случае вам пришлось бы считать их по отдельности:

>>> 9 // 5

1

>>> 9 % 5

4

Только что вы увидели кое-что новое: функцию с именем divmod, в которую передаются целые числа 9 и 5, возвращающую двухэлементный результат, называемый кортежем. С кортежами вы познакомитесь в главе 3, а с функциями — в главе 4.

Приоритет операций

Рассмотрим, что получится, если ввести следующее:

>>> 2 + 3 * 4

Если выполнить сложение первым, 2 + 3 равно 5, а 5 * 4 равно 20. Но если выполнить первым умножение, 3 * 4 равно 12, а 2 + 12 равно 14. В Python, как и в большинстве других языков, умножение имеет больший приоритет, нежели сложение, поэтому вы увидите ответ, совпадающий со второй версией:

>>> 2 + 3 * 4

14

Как узнать приоритет той или иной операции? В приложении Е приводится огромная таблица, в которой перечислены все приоритеты, но я обнаружил, что на практике никогда не смотрю в эти правила. Гораздо проще добавить пару скобок, чтобы сгруппировать код и вычисления так, как нужно:

>>> 2 + (3 * 4)

14

Это поможет любому человеку, читающему код, точно определить его предназначение.

Системы счисления

Предполагается, что целые числа указываются в десятичной системе счисления, если только вы не укажете какую-либо другую. Вам может никогда не понадобиться использовать другие системы счисления, но иногда они будут встречаться в коде.

Как правило, у нас десять пальцев на руках и ногах (у одного из моих котов их немного больше, но он редко использует их для счета), поэтому мы считаем: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. После этого у нас заканчиваются цифры и мы переносим единицу на место десятки и ноль — на место единицы: 10 означает «одна десятка и ноль единиц». У нас нет одной цифры, которая представляла бы собой 10. Далее мы считаем: 11, 12… 19, переносим единицу, чтобы сделать 20 (две десятки и ноль единиц), и т. д.

Система счисления указывает, сколько цифр вы можете использовать до того, как перенести единицу. В двоичной (бинарной) системе счисления единственными цифрами являются 0 и 1. Двоичные 0 и 1 точно такие же, как и десятичные. Однако, если в этой системе сложить 1 и 1, вы получите 10 (одна десятичная двойка плюс ноль десятичных единиц).

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

• 0b или 0B для двоичной системы (основание 2);

• 0o или 0O для восьмеричной системы (основание 8);

• 0x или 0X для шестнадцатеричной системы (основание 16).

Интерпретатор выведет эти числа как десятичные. Попробуем воспользоваться каждой из систем счисления. Первой выберем старое доброе десятичное число 10, которое означает «одна десятка и ноль единиц»:

>>> 10

10

Теперь возьмем двоичную (основание 2), что означает «одна (десятичная) двойка и ноль единиц»:

>>> 0b10

2

Восьмеричная (основание 8) означает «одна (десятичная) восьмерка и ноль единиц»:

>>> 0°10

8

Шестнадцатеричная (основание 16) означает «одна (десятичное) 16 и ноль единиц»:

>>> 0x10

16

Если вам интересно, какие «цифры» использует шестнадцатеричная система счисления, взгляните на них: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e и f. 0ха равно десятичной 10, а 0xf — десятичному 15. Добавьте 1 к 0xf, и вы получите 0х10 (десятичное 16).

Зачем использовать другие системы счисления, отличные от десятичной? Это полезно для битовых операций, которые описаны в главе 7 наряду с детальной информацией о преобразовании чисел из одной системы счисления в другую.

Преобразования типов

Для того чтобы изменить другие типы данных на целочисленный тип, следует использовать функцию int(). Она сохраняет целую часть числа и отбрасывает любой остаток.

Простейший тип данных в Python — булевы переменные, значениями этого типа могут быть только True или False. При преобразовании в целые числа они представляют собой значения 1 и 0:

>>> int(True)

1

>>> int(False)

0

Преобразование числа с плавающей точкой в целое число просто отсекает все, что находится после десятичной запятой[2]:

>>> int(98.6)

98

>>> int(1.0e4)

10000

Наконец, рассмотрим пример преобразования текстовой строки (со строками вы познакомитесь через несколько страниц), которая содержит только цифры и, возможно, знаки + и —:

>>> int('99')

99

>>> int('-23')

-23

>>> int('+12')

12

Преобразование целого числа в целое число ничего не меняет и совсем не вредит:

>>> int(12345)

12345

Если вы попробуете преобразовать что-то непохожее на число, сгенерируется исключение:

>>> int('99 bottles of beer on the wall')

Traceback (most recent call last):

··File "", line 1, in 

ValueError: invalid literal for int() with base 10: '99 bottles of beer on the wall'

>>> int('')

Traceback (most recent call last):

··File "", line 1, in 

ValueError: invalid literal for int() with base 10: ''

Текстовая строка в предыдущем примере начинается с корректных символов-цифр (99), но продолжается теми символами, которые функция int() обработать не может.


Мы рассмотрим исключения в главе 4. Пока нужно только помнить, что с помощью исключений Python извещает вас о том, что произошла ошибка, вместо того чтобы прервать выполнение программы, как поступают некоторые другие языки. Вместо того чтобы показывать вам лишь правильные примеры, я продемонстрирую множество вариантов исключений, чтобы вы знали, как поступает Python, когда что-то идет не так.


Функция int() будет создавать целые числа из чисел с плавающей точкой или строк, состоящих из цифр, но она не будет обрабатывать строки, содержащие десятичные точки или экспоненты:

>>> int('98.6')

Traceback (most recent call last):

··File "", line 1, in 

ValueError: invalid literal for int() with base 10: '98.6'

>>> int('1.0e4')

Traceback (most recent call last):

··File "", line 1, in 

ValueError: invalid literal for int() with base 10: '1.0e4'

Если вы смешаете численные значения, Python будет пытаться автоматически преобразовать их:

>>> 4 + 7.0

11.0

Булево значение False рассматривается как 0 или 0.0, когда оно смешивается с целыми числами или числами с плавающей точкой, а True — как 1 или 1.0:

>>> True + 2

3

>>> False + 5.0

5.0

Насколько объемен тип int?

В Python 2 размер переменной типа int был ограничен 32 битами. Этого было достаточно для того, чтобы сохранить любое целое число в диапазоне от –2 147 483 648 до 2 147 483 647.

Для переменных типа long выделялось еще больше места — 64 бита, что позволяло хранить значения в диапазоне от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. В Python 3 тип long отсутствует, а переменная типа int может быть любого размера — даже больше 64 бит. Поэтому вы можете выполнить арифметические действия наподобие следующих (10**100 называется гугол (googol), компания Google называлась так до того, как решила сменить свое название на более простое):

>>>

>>> googol = 10**100

>>> googol

100000000000000000000000000000000000000000000000000000000000000000000000000000

00000000000000000000000

>>> googol * googol

100000000000000000000000000000000000000000000000000000000000000000000000000000

000000000000000000000000000000000000000000000000000000000000000000000000000000

000000000000000000000000000000000000000000000

Во многих языках программирования этот пример вызовет так называемое переполнение целочисленного значения, когда числу нужно больше места, чем компьютер может предоставить, что приведет к разным нежелательным эффектам. Python обрабатывает огромные целые числа без всяких проблем. Одно очко для Python.

Числа с плавающей точкой

Значениями целочисленного типа являются целые числа, но числа с плавающей точкой (в Python они называются float) имеют десятичную запятую. Числа с плавающей точкой обрабатываются так же, как и целые: вы можете использовать операторы +, —, *, /, //, **, % и функцию divmod().

Для того чтобы преобразовать другие типы в тип float, следует использовать функцию float(). Как и ранее, булевы значения обрабатываются как небольшие числа:

>>> float(True)

1.0

>>> float(False)

0.0

Преобразование значения типа int в тип float лишь создаст счастливого обладателя десятичной запятой:

>>> float(98)

98.0

>>> float('99')

99.0

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

>>> float('98.6')

98.6

>>> float('-1.5')

-1.5

>>> float('1.0e4')

10000.0

Математические функции

Python имеет привычный набор математических функций вроде квадратного корня, косинуса и т. д. Мы рассмотрим их в приложении В, где также обсудим применение Python в науке.

Строки