Всё чувствительно к регистру
Все имена в Python чувствительны к регистру — имена переменных, функций, классов, модулей, исключений. Всё, что можно прочитать, записать, вызвать, создать или импортировать, чувствительно к регистру.
>>> an_integer = 1
>>> an_integer
1
>>> AN_INTEGER
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'AN_INTEGER' is not defined
>>> An_Integer
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'An_Integer' is not defined
>>> an_inteGer
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'an_inteGer' is not defined
Перевод сообщений оболочки:
Раскрутка стека (список последних вызовов):
Файл "<stdin>", строка 1, <модуль>
NameError: имя '<имя>' не определено
И так далее.
Запуск скриптов
В Python всё является объектом.
Модули Python — это объекты, имеющие несколько полезных атрибутов. И это обстоятельство можно использовать для простого тестирования модулей, при их написании, путём включения особого блока кода, который будет исполняться при запуске файла из командной строки. Взгляните на последние строки humansize.py:
if __name__ == '__main__':
print(approximate_size(1000000000000, False))
print(approximate_size(1000000000000))
Как и в C, в Python используется оператор == для проверки на равенство и оператор = для присваивания. Но в отличие от C, Python не поддерживает присваивание внутри другого выражения, поэтому у вас не получится случайно присвоить значение вместо проверки на равность. |
Итак, что же делает этот блок if особенным? У всех модулей, как у объектов, есть встроенный атрибут __name__ (имя). И значение этого атрибута зависит от того, как модуль используется. Если модуль импортируется, то __name__ принимает значение равное имени файла модуля, без расширения и пути к каталогу.
>>> import humansize
>>> humansize.__name__
'humansize'
Но модуль можно запустить и напрямую, как самостоятельную программу, в этом случае __name__ примет особое значение — __main__. Python вычислит значение условного выражения в операторе if, определит его истинность, и выполнит блок кода if. В данном случае, будут напечатаны два значения.
c:\home\diveintopython3> c:\python31\python.exe humansize.py
1.0 TB
931.3 GiB
И это ваша первая программа на Python!
Материалы для дальнейшего чтения
- PEP 257: Docstring Conventions объясняет, чем отличается хорошая строка документации от великолепной.
- Python Tutorial: Documentation Strings также касается данного вопроса.
- PEP 8: Style Guide for Python Code обсуждает хороший стиль расстановки отступов.
- Python Reference Manual объясняет, что означают слова «в Python всё является объектом», потому что некоторые люди — педанты, которые любят длиннющие обсуждения вещей такого рода.
Примечания
- В английском языке апострофы, обрамляющие текст, — это уже одинарные кавычки. — Прим. пер.
- Имеется ввиду тип данных string (строка). — Прим. пер.
Встроенные типы данных
В начале всяческой философии лежит удивление, изучение движет его вперёд, невежество убивает его. |
Мишель де Монтень |
Погружение
Отложите на минутку вашу первую программу на Python и давайте поговорим о типах данных. В Python у каждого значения есть тип, но нет необходимости явно указывать типы переменных. Как это работает? Основываясь на первом присвоении значения переменной, Python определяет её тип и в дальнейшем отслеживает его самостоятельно.
В Python имеется множество встроенных типов данных. Вот наиболее важные из них:
- Логический, может принимать одно из двух значений — True (истина) или False (ложь).
- Числа, могут быть целыми (1 и 2), с плавающей точкой (1.1 и 1.2), дробными (1/2 и 2/3), и даже комплексными.
- Строки — последовательности символов Юникода, например, HTML-документ.
- Байты и массивы байтов, например, файл изображения в формате JPEG.
- Списки — упорядоченные последовательности значений.
- Кортежи — упорядоченные неизменяемые последовательности значений.
- Множества — неупорядоченные наборы значений.
- Словари — неупорядоченные наборы пар вида ключ-значение.
Конечно, существуют и многие другие типы данных. В языке Python всё является объектом, поэтому в нём имеются также и такие типы, как модуль, функция, класс, метод, файл, и даже скомпилированный код. Некоторые из них вы уже встречали: у модулей есть имена, функции имеют строки документации, и т. д. С классами вы познакомитесь в главе «Классы и итераторы»; с файлами — в главе «Файлы».
Строки и байты насколько сложны, настолько же и важны, поэтому им отведена отдельная глава. Но сначала давайте познакомимся с остальными типами.
Логические значения
Практически любое выражение можно использовать в логическом контексте.
Логический тип данных может принимать одно из двух значений: истина или ложь. В Python имеются две константы с понятными именами True (от англ. true — истина) и False (от англ. false — ложь), которые можно использовать для непосредственного присвоения логических значений. Результатом вычисления выражений также может быть логическое значение. В определенных местах (например, в операторе if), Python ожидает, что результатом вычисления выражения будет логическое значение. Такие места называют логическим контекстом. Практически любое выражение можно использовать в логическом контексте, Python в любом случае попытается определить его истинность. Для этого имеются отдельные наборы правил, для различных типов данных, указывающие на то, какие из их значений считать истинными, а какие ложными в логическом контексте. (Эта идея станет более понятна по мере ознакомления с конкретными примерами далее в этой главе.)
К примеру, рассмотрим следующий отрывок из программы humansize.py:
if size < 0:
raise ValueError('число должно быть неотрицательным')
Здесь переменная size и значение 0 имеют тип целого числа, а знак < между ними является числовым оператором. Результатом же вычисления выражения size < 0 всегда будет логическое значение. Вы можете самостоятельно в этом убедиться с помощью интерактивной оболочки Python:
>>> size = 1
>>> size < 0
False
>>> size = 0
>>> size < 0
False
>>> size = -1
>>> size < 0
True
Из-за некоторых обстоятельств, связанных с наследием оставшимся от Python 2, логические значения могут трактоваться как числа. True как 1, и False как 0.
>>> True + True
2
>>> True - False
1
>>> True * False
0
>>> True / False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: int division or modulo by zero
Перевод сообщения оболочки:
Раскрутка стека (список последних вызовов):
Файл "<stdin>", строка 1, <модуль>
ZeroDivisionError: целочисленное деление на ноль или остаток по модулю ноль
Ой-ой-ой! Не делайте так! Забудьте даже, что я упоминал об этом.
Числа
Числа — это потрясающая штука. Их так много, всегда есть, из чего выбрать. Python поддерживает как целые числа, так и с плавающей точкой. И нет необходимости объявлять тип для их различия; Python определяет его по наличию или отсутствию десятичной точки.
>>> type(1) ①
<class 'int'>
>>> isinstance(1, int) ②
True
>>> 1 + 1 ③
2
>>> 1 + 1.0 ④
2.0
>>> type(2.0)
<class 'float'>