М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 78
Текст из файла (страница 78)
Результат последней строки в этом примере в действительности представляет собойкортеж из трех объектов – результатов трех выражений (пример кортежа безобъемлющих круглых скобок).В общем случае Python сравнивает типы следующим образом:•• Числа сравниваются по величине.•• Строки сравниваются лексикографически, символ за символом (“abc” <“ac”).•• При сравнении списков и кортежей сравниваются все компоненты слева направо.•• Словари сравниваются как отсортированные списки (ключ, значение). Словари в ��������������������������������������������������������������Python�������������������������������������������������������� 3.0 не поддерживают операторы отношений, но они поддерживаются в версии 2.6 и ниже, при этом они сравниваются как отсортированные списки (ключ, значение).•• Попытка сравнить значения несопоставимых нечисловых типов (например,1 < ‘spam’) в ����������������������������������������������������������Python���������������������������������������������������� 3.0 вызывает ошибку.
Зато такое сравнивание возможно в Python 2.6, однако при этом используется фиксированное и достаточнопроизвольно выбранное правило. То же относится и к операции сортировки, которая реализована на основе операции сравнения: коллекции значений нечисловых и несопоставимых типов в версии 3.0 отсортированы бытьне могут.Вообще сравнивание структурированных объектов выполняется, как если бысравнивались образующие их литералы, слева направо, по одному компонентуза раз. В последующих главах мы увидим другие типы объектов, которые могут изменять способ сравнения.Сравнивание словарей в Python 3.0Предпоследний пункт в списке из предыдущего раздела заслуживает особогопояснения.
В �������������������������������������������������������������Python������������������������������������������������������� 2.6 и в более ранних версиях словари поддерживали возможность сравнения с помощью операторов отношений, как если бы сравнивались сортированные списки пар ключ/значение:C:\misc> c:\python26\python>>> D1 = {‘a’:1, ‘b’:2}>>> D2 = {‘a’:1, ‘b’:3}308Глава 9.
Кортежи, файлы и все остальное>>> D1 == D2False>>> D1 < D2TrueВ Python�������������������������������������������������������������������������������������������������������������������������������������� 3.0 поддержка операторов отношений в словарях была ликвидирована, потому что они оказываются слишком затратными, когда просто требуется узнать, равны ли словари (проверка на равенство в версии 3.0 выполняетсяпо оптимизированному алгоритму, который по факту не сравнивает отсортированные списки пар ключ/значение).
Чтобы выяснить относительный порядок словарей в версии 3.0, можно написать цикл и вручную сравнить значения ключей или вручную создать отсортированные списки пар ключ/значениеи сравнить их – для этого вполне достаточно будет задействовать метод словарей items и встроенную функцию sorted:C:\misc> c:\python30\python>>> D1 = {‘a’:1, ‘b’:2}>>> D2 = {‘a’:1, ‘b’:3}>>> D1 == D2False>>> D1 < D2TypeError: unorderable types: dict() < dict()>>> list(D1.items())[(‘a’, 1), (‘b’, 2)]>>> sorted(D1.items())[(‘a’, 1), (‘b’, 2)]>>> sorted(D1.items()) < sorted(D2.items())True>>> sorted(D1.items()) > sorted(D2.items())FalseНа практике в большинстве программ, где требуется выполнять сравниваниесловарей, реализуются собственные, более эффективные процедуры сравнения данных в словарях, чем данный способ или оригинальная реализацияв Python 2.6.Смысл понятий «истина» и «ложь» в языке PythonОбратите внимание, что три значения в кортеже, возвращаемом последнимпримером из предыдущего раздела, – это логические значения «истина» (true)и «ложь» (false).
Они выводятся на экран как слова True и False, но теперь, когдамы приступаем к использованию логических проверок, мне следует более формально описать смысл этих названий.В языке ���������������������������������������������������������������Python���������������������������������������������������������, как в большинстве языков программирования, «ложь» представлена целочисленным значением 0, а «истина» – целочисленным значением 1. Кроме того, интерпретатор Python распознает любую пустую структуруданных как «ложь», а любую непустую структуру данных – как «истину».В более широком смысле понятия истины и лжи – это свойства, присущиевсем объектам в Python, – каждый объект может быть либо «истиной», либо«ложью»:•• Числа, отличные от нуля, являются «истиной».•• Другие объекты являются «истиной», если они непустые.Сравнивание, равенство и истина309В табл. 9.4 приводятся примеры истинных и ложных значений объектов в языке Python.Таблица 9.4.
Примеры значений истинности объектовОбъектЗначение“spam”True“”False[]False{}False1True0.0FalseNoneFalseТак как объекты могут быть «истинными» или «ложными», в программах наязыке Python часто можно увидеть такие условные инструкции, как if X:, которая, если предположить, что X является строкой, равноценна инструкции ifX != ‘’:. Говоря другими словами, можно проверить истинность объекта вместотого, чтобы сравнивать его с пустым объектом. (Подробнее об инструкции ifрассказывается в третьей части III.)Объект NoneВ языке Python имеется также специальный объект с именем None (последняястрока в табл. 9.4), который всегда расценивается как «ложь». Объект None былпредставлен в главе 4 – это единственный специальный тип данных в языкеPython�������������������������������������������������������������������, который играет роль пустого заполнителя и во многом похож на указатель NULL в языке C.Например, вспомните, что списки не допускают присваивание значений отсутствующим элементам (списки не вырастают по волшебству, когда вы выполняете присваивание некоторого значения несуществующему элементу).
Чтобыможно было выполнять присваивание любому из 100 элементов списка, обычно создается список из 100 элементов, который заполняется объектами None:>>> L = [None] * 100>>>>>> L[None, None, None, None, None, None, None, ... ]В этом примере мы никак не ограничиваем размер списка (его по-прежнемупозднее можно будет увеличить или уменьшить), мы просто создаем списокопределенного размера, чтобы обеспечить возможность присваивания по индексам. Точно так же можно было бы инициализировать список нулями, новсе-таки предпочтительнее использовать None, если заранее не известно, какиеданные будет содержать этот список.Имейте в виду, что значение None не означает «неопределенный». То есть None –это не «ничто» (несмотря на свое имя!); это настоящий объект, занимающийопределенную область памяти, с зарезервированным именем.
Другие примеры310Глава 9. Кортежи, файлы и все остальноеиспользования этого специального объекта вы найдете ниже в книге. Крометого, этот объект является значением, возвращаемым функциями по умолчанию, как будет показано в четвертой части.Тип boolЛогический тип bool в языке Python������������������������������������������������������������������������������������(представленный в главе 5) просто усиливает понятия «истина» и «ложь» в языке Python. Как мы узнали в главе 5,предопределенные имена True и False являются всего лишь разновидностямицелых чисел 1 и 0, как если бы этим двум зарезервированным именам предварительно присваивались значения 1 и 0. Этот тип реализован так, что ондействительно является лишь незначительным расширением к понятиям «истина» и «ложь», уже описанным, и предназначенным для того, чтобы сделатьзначения истинности более явными:•• При явном использовании слов True и False в операциях проверки на истинность они интерпретируются как «истина» и «ложь», которые в действительности являются специализированными версиями целых чисел 1 и 0.•• Результаты операций проверок также выводятся как слова True и False, а некак значения 1 и 0.Вам не обязательно использовать только логические типы в логических инструкциях, таких как if, – любые объекты по своей природе могут быть истинными или ложными, и все логические концепции, упоминаемые в этой главе,работают, как описано, и с другими типами.
Кроме того, в языке Python����������������имеется встроенная функция bool, которая может использоваться для проверкилогического значения объекта (например, для проверки истинности объекта,чтобы убедиться, что объект не является пустым или не равен нулю):>>> bool(1)True>>> bool(‘spam’)True>>> bool({})FalseОднако на практике вам редко придется вручную пользоваться переменнымитипа bool, которые воспроизводятся логическими проверками, потому что логические результаты автоматически используются инструкциями if и другими средствами выбора.
Мы займемся исследованием логического типа, когдабудем рассматривать логические инструкции в главе 12.Иерархии типов данных в языке PythonНа рис. 9.3 приводятся все встроенные типы объектов, доступные в языке Py���thon, и отображены взаимоотношения между ними. Наиболее значимые изних мы уже рассмотрели; большая часть других видов объектов на рис. 9.3 соответствует элементам программ (таким как функции и модули) или отражаетвнутреннее устройство интерпретатора (такие как кадры стека и скомпилированный программный код).Главное, что следует учитывать, – в языке Python все элементы являются объектами и могут быть использованы в ваших программах.