Главная страница
Навигация по странице:

  • Отсутствующие ключи: проверка с помощью оператора if

  • D.has_key(f) False>>> if not D.has_key(f): print missing

  • T = (1, 2, 3, 4)

  • X = set(spam) >>> Y = set([h, a, m])

  • X | Y

  • Классы, определяемые пользователем

  • В заключение На этом мы заканчиваем наш краткий обзор типов данных. В этой главе вашему вниманию было предложено краткое введение в базовые типы 140

  • Математический анализ. 3е издание


    Скачать 4.86 Mb.
    Название3е издание
    АнкорМатематический анализ
    Дата04.02.2022
    Размер4.86 Mb.
    Формат файлаpdf
    Имя файлаpython_01.pdf
    ТипДокументы
    #351981
    страница18 из 98
    1   ...   14   15   16   17   18   19   20   21   ...   98
    133
    и когда проблема производительности программы действительно за
    служивает того, чтобы на нее обратили внимание. Но чаще всего ваш программный код будет обладать достаточно высокой производитель
    ностью. Если же вам потребуется оптимизировать программу, в соста
    ве Python вы найдете инструменты, которые помогут вам в этом,
    включая модули time и timeit, а также модуль profile. Более подроб
    ную информацию об этих модулях вы найдете далее в книге и в руко
    водствах по языку Python.
    Отсутствующие ключи: проверка с помощью оператора if
    Еще одно замечание о словарях, прежде чем двинуться дальше. Несмот
    ря на то что операция присваивания значений элементам с несущест
    вующими ключами приводит к расширению словаря, тем не менее при попытке обратиться к несуществующему элементу возникает ошибка:
    >>> D
    {'a': 1, 'c': 3, 'b': 2}
    >>> D['e'] = 99 # Присваивание по новому ключу приводит к расширению словаря
    >>> D
    {'a': 1, 'c': 3, 'b': 2, 'e': 99}
    >>> D['f'] # При попытке обращения к несуществующему ключу возникает ошибка
    ...текст сообщения об ошибке опущен...
    KeyError: 'f'
    Программная ошибка при попытке получить значение несуществую
    щего элемента – это именно то, что нам хотелось бы получать. Но в не
    которых универсальных программах, когда создается программный код, мы не всегда можем знать, какие ключи будут присутствовать.
    Как быть в таких случаях, чтобы не допустить появление ошибок? Для этого можно, например, выполнить предварительную проверку. Метод словаря has_key позволяет определить наличие ключа и с помощью ус
    ловного оператора if выполнить тот или иной программный код:
    >>> D.has_key('f')
    False
    >>> if not D.has_key('f'):
    print 'missing'
    missing
    Далее в этой книге я расскажу подробнее об инструкции if и о ее син
    таксисе. Однако форма инструкции, которая используется здесь, доста
    точно очевидна: она состоит из ключевого слова if, следующего за ним выражения, результат которого интерпретируется как «истина» или
    «ложь». Далее следует блок программного кода, который будет выпол
    нен, если результатом выражения будет значение «истина». В полной форме инструкция if предусматривает наличие предложения else –,
    для реализации действия по умолчанию, и одно или более предложение elif
    (else if) для выполнения других проверок. Это основное средство

    134
    Глава 4. Введение в типы объектов языка Python выбора в языке Python и именно этим способом мы реализуем логику работы в наших сценариях.
    Существуют также и другие способы создания словарей и исключения ошибок обращения к несуществующим элементам словаря (включая метод get, выражение in и инструкцию try, с которой мы познакомим
    ся в главе 10, которая позволяет перехватывать и обрабатывать ис
    ключения), но подробнее об этом мы поговорим в одной из следующих глав. А сейчас рассмотрим кортежи.
    Кортежи
    Объекткортеж (tuple – произносится как «тъюпл» или «тъюпел»,
    в зависимости от того, у кого вы спрашиваете) в общих чертах напоми
    нает список, который невозможно изменить, – кортежи являются по
    следовательностями, как списки, но они являются неизменяемыми,
    как строки. Синтаксически, определение кортежа заключается в круг
    лые, а не в квадратные скобки. Они также поддерживают включение объектов различных типов, вложение и операции, типичные для по
    следовательностей:
    >>> T = (1, 2, 3, 4) # Кортеж из 4 элементов
    >>> len(T) # Длина
    4
    >> T + (5, 6) # Конкатенация
    (1, 2, 3, 4, 5, 6)
    >>> T[0] # Извлечение элемента, среза и т. д.
    1
    Единственное реальное отличие кортежей – это невозможность их из
    менения после создания. То есть кортежи являются неизменяемыми последовательностями:
    >>> T[0] = 2 # Кортежи являются неизменяемыми
    ...текст сообщения об ошибке опущен...
    TypeError: 'tuple' object does not support item assignment
    (TypeError: объект 'tuple' не поддерживает операцию присваивания элементам)
    Для чего нужны кортежи?
    Зачем нужен тип, который напоминает список, но поддерживает мень
    шее число операций? Откровенно говоря, на практике кортежи ис
    пользуются не так часто, как списки, но главное их достоинство – не
    изменяемость. Если коллекция объектов передается между компонен
    тами программы в виде списка, он может быть изменен любым из ком
    понентов. Если используются кортежи, такие изменения становятся невозможны. То есть кортежи обеспечивают своего рода ограничение целостности, что может оказаться полезным в крупных программах.
    Далее в книге мы еще вернемся к кортежам. А сейчас перейдем к по
    следнему базовому типу данных – к файлам.

    Файлы
    135
    Файлы
    Объектыфайлы – это основной интерфейс между программным кодом на языке Python и внешними файлами на компьютере. Файлы явля
    ются одним из базовых типов, но они представляют собой нечто не
    обычное, поскольку для файлов отсутствует возможность создания объектов в виде литералов. Вместо этого чтобы создать объект файла,
    необходимо вызвать встроенную функцию open, передав ей имя внеш
    него файла и строку режима доступа к файлу. Например, чтобы соз
    дать файл для вывода данных, вместе с именем файла функции необ
    ходимо передать строку режима 'w':
    >>> f = open('data.txt', 'w') # Создается новый файл для вывода
    >>> f.write('Hello\n') # Запись строки байтов в файл
    >>> f.write('world\n')
    >>> f.close() # Закрывает файл и выталкивает выходные буферы на диск
    В этом примере создается файл в текущем каталоге и в него записыва
    ется текст (имя файла может содержать полный путь к каталогу, если требуется получить доступ к файлу, находящемуся в другом месте).
    Чтобы прочитать то, что было записано в файл, файл нужно открыть в режиме 'r' (этот режим используется по умолчанию, если строка ре
    жима в вызове функции опущена), затем прочитать содержимое файла в строку байтов и отобразить ее. Содержимое файла для сценария все
    гда является строкой байтов, независимо от типов данных, фактиче
    ски хранящихся в файле:
    >>> f = open('data.txt') # 'r' – это режим доступа к файлу по умолчанию
    >>> bytes = f.read() # Файл читается целиком в строку
    >>> bytes
    'Hello\nworld\n'
    >>> print bytes # Вывод, с попутной интерпретацией служебных символов
    Hello world
    >>> bytes.split() # Содержимое файла всегда является строкой
    ['Hello', 'world']
    Объектыфайлы имеют и другие методы, поддерживающие дополни
    тельные возможности, рассматривать которые у нас нет времени. На
    пример, объекты файлов предоставляют различные способы чтения и записи данных (метод read принимает необязательный параметр –
    количество байтов, метод readline считывает по одной строке за одно обращение и т. д.) и другие методы (seek – перемещает позицию чте
    ния/записи в файле). В этой книге мы будем изучать их позднее, но ес
    ли у вас появится желание быстро ознакомиться с ними, запустите функцию dir, передав ей слово file (имя типа данных), а затем функ
    цию help с любым из имен методов в качестве аргумента:
    >>> dir(file)
    ['_ _class_ _', '_ _delattr_ _', '_ _doc_ _', '_ _enter_ _', '_ _exit_ _',

    136
    Глава 4. Введение в типы объектов языка Python
    '_ _getattribute_ _', '_ _hash_ _', '_ _init_ _', '_ _iter_ _', '_ _new_ _',
    '_ _reduce_ _', '_ _reduce_ex_ _', '_ _repr_ _', '_ _setattr_ _', '_ _str_ _',
    'close', 'closed', 'encoding', 'fileno', 'flush', 'isatty', 'mode',
    'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines',
    'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']
    >>> help(file.seek)
    ...попробуйте и увидите...
    Другие средства, напоминающие файлы
    Функция open – это рабочая лошадка в большинстве операций с файла
    ми, которые можно выполнять в языке Python. Для решения более специфичных задач Python поддерживает и другие инструментальные средства, напоминающие файлы: каналы, очереди, сокеты, файлы с доступом по ключу, хранилища объектов, файлы с доступом по деск
    риптору, интерфейсы к реляционным и объектноориентированным базам данных и многие другие. Файлы с доступом по дескриптору, на
    пример, поддерживают возможность блокировки и другие низкоуров
    невые операции, а сокеты представляют собой интерфейс к сетевым взаимодействиям. В этой книге мы не будем подробно рассматривать эти темы, но знание этих особенностей окажется для вас полезным,
    как только вы начнете всерьез программировать на языке Python.
    Другие базовые типы
    Помимо базовых типов данных, которые мы уже рассмотрели, сущест
    вуют и другие, которые могут считаться базовыми, в зависимости от широты определения этой категории. Например, множества совсем недавно появились в языке. Множества – это контейнеры для других объектов. Множества создаются встроенной функцией set и поддер
    живают типичные математические операции над множествами:
    >>> X = set('spam')
    >>> Y = set(['h', 'a', 'm']) # Создаются два множества последовательностей
    >>> X, Y
    (set(['a', 'p', 's', 'm']), set(['a', 'h', 'm']))
    >>> X & Y # Пересечение
    set(['a', 'm'])
    >>> X | Y # Объединение
    set(['a', 'p', 's', 'h', 'm'])
    >>> X – Y # Разность
    set(['p', 's'])
    Кроме того, недавно в Python появились вещественные числа с фикси
    рованной точностью и тип Boolean (с предопределенными объектами
    True и False, которые по сути являются целыми числами 0 и 1 с некото
    рыми особенностями отображения на экране), а кроме того, давно уже существует специальный объект None:

    Другие базовые типы
    137
    >>> import decimal # Вещественные числа с фиксированной точностью
    >>> d = decimal.Decimal('3.141')
    >>> d + 1
    Decimal("4.141")
    >>> 1 > 2, 1 < 2 # Логические значения
    (False, True)
    >>> bool('spam')
    True
    >>> X = None # Специальный объект None
    >>> print X
    None
    >>> L = [None] * 100 # Инициализация списка из ста объектов None
    >>> L
    [None, None, None, None, None, None, None, None, None, None, None, None, None,
    ...список из 100 объектов None...]
    >>> type(L) # Типы

    >>> type(type(L)) # Даже типы являются объектами

    Как можно нарушить гибкость программного кода
    Мы еще будем много говорить обо всех этих типах данных далее в кни
    ге, но сначала я хочу сделать важный акцент. Объект type позволяет выполнять проверку типов объектов в программном коде, который ис
    пользует эти объекты. Сделать это в сценариях на языке Python мож
    но как минимум тремя способами:
    >>> if type(L) == type([]): # Проверка типа, если в этом есть необходимость...
    print 'yes'
    yes
    >>> if type(L) == list: # С использованием имени типа
    print 'yes'
    yes
    >>> if isinstance(L, list): # Проверка в объектноориентированном стиле
    print 'yes'
    yes
    Однако теперь, когда я показал вам все эти способы проверки типа объ
    екта, я должен заметить, что использование таких проверок в про
    граммном коде практически всегда является неверным решением (и от
    личительным признаком бывшего программиста на языке C, присту
    пившего к программированию на языке Python). Наличие проверок на принадлежность объекта к тому или иному типу отрицательно сказы
    вается на гибкости программного кода, потому что вы ограничиваете его работой с единственным типом данных. Без таких проверок ваш

    138
    Глава 4. Введение в типы объектов языка Python программный код может оказаться в состоянии работать с более широ
    ким диапазоном типов.
    Это связано с идей полиморфизма, о которой упоминалось ранее, и это основная причина отсутствия необходимости описывать типы пере
    менных в языке Python. Как будет говориться далее, программный код на языке Python ориентируется на использование интерфейсов
    объектов (набор поддерживаемых операций), а не их типов. Отсутст
    вие заботы об определенных типах означает, что программный код ав
    томатически может обслуживать большинство из них – допустимыми будут любые объекты с совместимыми интерфейсами, независимо от конкретного типа. И хотя контроль типов поддерживается – а в ред
    ких случаях даже необходим, – тем не менее это обычно не способ ду
    мать на языке Python. Вы сами убедитесь, что ключевой идеей, обеспе
    чивающей успех использования Python, является полиморфизм.
    Классы, определяемые пользователем
    Мы рассмотрим объектноориентированный стиль программирования на языке Python (необязательную к применению, но весьма мощную особенность языка, которая позволяет сократить время разработки за счет многократного использования программного кода) подробно далее в этой книге. Тем не менее, говоря абстрактными терминами, классы определяют новые типы объектов, которые расширяют базовый набор,
    и потому они заслуживают упоминания здесь. Например, вам мог бы потребоваться такой тип объектов, который моделировал бы сотрудни
    ков. В языке Python нет такого базового типа, тем не менее следующий класс вполне мог бы удовлетворить ваши потребности:
    >>> class Worker:
    def _ _init_ _(self, name, pay): # Инициализация при создании
    self.name = name # self – это сам объект
    self.pay = pay
    def lastName(self):
    return self.name.split()[ 1] # Разбить строку по символам пробела
    def giveRaise(self, percent):
    self.pay *= (1.0 + percent) # Обновить сумму выплат
    Данный класс определяет новый тип объектов, который обладает ат
    рибутами name и pay (иногда атрибуты называют информацией о со+
    стоянии
    ), а также два описания поведения, оформленных в виде функций (которые обычно называют методами). Обращение к имени класса как к функции приводит к созданию экземпляра нового типа,
    а методы класса автоматически получают ссылку на текущий экземп
    ляр, обрабатываемый этими методами (аргумент self):
    >>> bob = Worker('Bob Smith', 50000) # Создаются два экземпляра и для каждого
    >>> sue = Worker('Sue Jones', 60000) # определяется имя и сумма выплат
    >>> bob.lastName() # Вызов метода: self – это bob
    'Smith'
    >>> sue.lastName() # self – это Sue

    В заключение
    139
    'Jones'
    >>> sue.giveRaise(.10) # Обновить сумму выплат для Sue
    >>> sue.pay
    66000.0
    Модель называется объектноориентированной потому, что здесь при
    сутствует подразумеваемый объект «self»: внутри функций, определяе
    мых в классах, всегда присутствует подразумеваемый объект. В некото
    ром смысле типы, основанные на классах, просто создаются на базе ос
    новных типов и используют их функциональные возможности. В дан
    ном случае пользовательский класс Worker – это всего лишь коллекция,
    состоящая из строки и числа (name и pay), плюс функции, выполняю
    щие обработку этих двух встроенных объектов.
    Кроме того, механизм наследования классов поддерживает программ
    ные иерархии, которые допускают возможность их расширения. Воз
    можности программного обеспечения расширяются за счет создания новых классов, но при этом не изменяется программный код, который уже работает. Вместе с тем, вы должны понимать, что классы в языке
    Python не являются обязательными к применению, и нередко более простые встроенные типы, такие как списки и словари, оказываются эффективнее классов, определяемых пользователем. Однако все это выходит далеко за рамки ознакомительной главы, поэтому, чтобы про
    должить знакомство, вам придется прочитать следующие главы.
    И все остальное
    Как уже упоминалось ранее, все данные, которые обрабатываются сце
    нариями на языке Python, являются объектами, поэтому наш краткий обзор типов объектов никак нельзя назвать исчерпывающим. Однако,
    даже при том, что все сущее в языке Python является «объектом»,
    только рассмотренные типы образуют базовый набор. Другие типы объектов, как правило, реализуются в виде модулей и не являются син
    таксическими элементами языка. Кроме того, они обычно имеют уз
    кий круг применения – текстовые шаблоны, интерфейсы доступа к ба
    зам данных, сетевые взаимодействия и т. д.
    Более того, имейте в виду, что объекты, с которыми мы здесь познако
    мились, действительно являются объектами, но для работы с ними не требуется использовать объектно+ориентированный подход – концеп
    ция, которая обычно подразумевает использование механизма насле
    дования и оператора class, с которыми мы еще встретимся далее в этой книге. Однако базовые объекты языка Python – это рабочие лошадки практически любого сценария, и, как правило, они являются основой более крупных типов, не являющихся базовыми.
    В заключение
    На этом мы заканчиваем наш краткий обзор типов данных. В этой главе вашему вниманию было предложено краткое введение в базовые типы

    140
    Глава 4. Введение в типы объектов языка Python объектов языка Python и операции, которые могут к ним применяться.
    Мы рассмотрели наиболее универсальные операции, которые могут применяться к объектам различных типов (операции над последова
    тельностями, такие как обращение к элементам по их индексам и из
    влечение срезов), а также операции, специфичные для определенных типов, реализованные в виде методов (например, разбиение строки и добавление элементов в список). Здесь также были даны определе
    ния некоторых ключевых терминов, такие как неизменность, после
    довательности и полиморфизм.
    Наряду с этим мы узнали, что базовые типы данных в языке Python об
    ладают большей гибкостью и более широкими возможностями, чем ти
    пы данных, доступные в низкоуровневых языках программирования,
    таких как C. Например, списки и словари избавляют нас от необходи
    мости реализовать программный код поддержки коллекций и поиска.
    Списки – это упорядоченные коллекции объектов, а словари – это кол
    лекции объектов, доступ к которым осуществляется по ключу, а не по позиции. И словари, и списки могут быть вложенными, могут увеличи
    ваться и уменьшаться по мере необходимости и могут содержать объек
    ты любых типов. Более того, память, занимаемая ими, автоматически освобождается, как только будет утрачена последняя ссылка на них.
    Я опустил большую часть подробностей здесь, чтобы сделать знаком
    ство как можно более кратким, поэтому вы не должны считать, что эта глава содержит все, что необходимо. В следующих главах мы будем рассматривать базовые типы языка более подробно, благодаря чему вы сможете получить более полную картину. В следующей главе мы при
    ступим к всестороннему изучению чисел в языке Python. Но для нача
    ла ознакомьтесь с контрольными вопросами.
    1   ...   14   15   16   17   18   19   20   21   ...   98


    написать администратору сайта