Книга на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16
Скачать 0.72 Mb.
|
17.3. Серия «Модуль недели» 135 Дополнительно К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся ис- пользовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания. 18.1 Передача кортежей Хотелось ли вам когда-нибудь, чтобы функция возвращала не один результат, а два? Это возможно. Всё, что для этого нужно, – использовать кортеж. >>> def get_error_details (): ... return ( 2 , 'описание ошибки No2' ) ... >>> errnum, errstr = get_error_details() >>> errnum 2 >>> errstr 'описание ошибки No2' Обратите внимание, что использование выражения « a, b = <некоторое выражение> » интерпретирует результат как кортеж из двух значений. Чтобы интерпретировать результат как « (a, <всё остальное>) », нужно просто поста- вить звёздочку, как это делалось для параметров функций: >>> a, * b = [ 1 , 2 , 3 , 4 ] >>> a 1 >>> b [2, 3, 4] Это также подразумевает, что поменять местами два значения в Python быстрее всего можно так: 136 A Byte of Python (Russian), Версия 2.02 >>> a = 5 ; b = 8 >>> a, b = b, a >>> a, b (8, 5) 18.2 Специальные методы Есть ряд методов, играющих особую роль для классов. Например, __init__ и __del__ Специальные методы служат для того, чтобы имитировать поведение встроенных типов данных. Например, всё, что потребуется для использования операции индексирования x[индекс] применительно к своему классу (в таком виде, как это делалось для списков и кортежей), это реализовать метод __getitem__() . Кстати, именно этот метод Python использует для самого класса list ! Некоторые полезные специальные методы перечислены в таблице ниже. Все другие ме- тоды можно посмотреть в документации Имя Описание __init__(self, …) Этот метод вызывается прямо перед тем, как вновь созданный объект возвращается для использования. __del__(self) Вызывается перед уничтожением объекта __str__(self) Вызывается при использовании функции print или str() __lt__(self, other) Вызывается, когда используется оператор «меньше» (<). Существуют и аналогичные методы для всех операторов (+, >, и т.д.) __getitem__(self, key) Вызывается при использовании оператора индексирования x[индекс] __len__(self) Вызывается при обращении к встроенной функции len() для объекта-последовательности. 18.3 Блоки в одно выражение Мы неоднократно говорили, что каждый блок команд отделяется от других своим соб- ственным уровнем отступа. Однако, существует и исключение. Если блок команд содер- жит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере: >>> flag = True >>> if flag: ( 'Да' ) Да 18.2. Специальные методы 137 A Byte of Python (Russian), Версия 2.02 Обратите внимание, что единственный оператор расположен в той же строке, а не отдель- ным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но я настоятельно рекомендую избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа. 18.4 Lambda-формы Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвраща- ется новой функцией. Пример: (сохраните как lambda.py ) points = [ { 'x' : 2 , 'y' : 3 }, { 'x' : 4 , 'y' : 1 } ] points sort(key = lambda i : i[ 'y' ]) (points) Вывод: $ python3 lambda.py [{'x': 4, 'y': 1}, {'x': 2, 'y': 3}] Как это работает: Обратите внимание на то, что метод sort класса list может принимать пара- метр key , определяющий способ сортировки списка (обычно мы думаем толь- ко о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдель- ный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение. 18.5 Генераторы списков Генераторы списков служат для создания новых списков на основе существующих. Пред- ставьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число боль- ше 2. Генераторы списков подходят для таких задач как нельзя лучше. 18.4. Lambda-формы 138 A Byte of Python (Russian), Версия 2.02 Пример: (сохраните как list_comprehension.py ) listone = [ 2 , 3 , 4 ] listtwo = [ 2 * i for i in listone if i > 2 ] (listtwo) Вывод: $ python3 list_comprehension.py [6, 8] Как это работает: В этом примере мы создаём новый список, указав операцию, которую необхо- димо произвести ( 2 * i ), когда выполняется некоторое условие ( if i > 2 ). Обратите внимание, что исходный список при этом не изменяется. Преимущество использования генераторов списков состоит в том, что это заметно сокра- щает объёмы стандартного кода, необходимого для циклической обработки каждого эле- мента списка и сохранения его в новом списке. 18.6 Передача кортежей и словарей в функции Для получения параметров, переданных функции, в виде кортежа или словаря, существу- ют специальные приставки « * » или « ** » соответственно. Это особенно полезно в случа- ях, когда функция может принимать переменное число параметров. >>> def powersum (power, * args): ... '''Возвращает сумму аргументов, возведённых в указанную степень.''' ... total = 0 ... for i in args: ... total += pow (i, power) ... return total ... >>> powersum( 2 , 3 , 4 ) 25 >>> powersum( 2 , 10 ) 100 Поскольку перед переменной args указана приставка « * », все дополнительные аргу- менты, переданные функции, сохранятся в args в виде кортежа. В случае использова- ния приставки « ** » все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре. 18.6. Передача кортежей и словарей в функции 139 A Byte of Python (Russian), Версия 2.02 18.7 exec и eval Функция exec служит для выполнения команд Python, содержащихся в строке или фай- ле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec : >>> exec( 'print("Здравствуй, Мир!")' ) Здравствуй, Мир! Аналогично, функция eval позволяет вычислять корректные выражения Python, содер- жащиеся в строке. Вот простой пример. >>> eval ( '2*3' ) 6 18.8 Оператор assert Оператор assert существует для того, чтобы указать, что нечто является истиной. На- пример, если требуется гарантировать, что в списке будет хотя бы один элемент, и вы- звать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError . Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда. >>> mylist = [ 'item' ] >>> assert len (mylist) >= 1 >>> mylist pop() 'item' >>> mylist [] >>> assert len (mylist) >= 1 Traceback (most recent call last): File " , line 1 , in AssertionError Тем не менее, оператор assert следует использовать благоразумно. В большинстве слу- чаев гораздо лучше «отлавливать» исключения и либо решать соответствующую про- блему автоматически, либо выдавать пользователю сообщение об ошибке и завершать работу программы. 18.7. exec и eval 140 A Byte of Python (Russian), Версия 2.02 18.9 Функция repr Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object >>> i = [] >>> i append( 'item' ) >>> repr (i) "['item']" >>> eval ( repr (i)) ['item'] >>> eval ( repr (i)) == i True По большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr 18.10 Управляющие последовательности Попробуйте ответить на вопрос: Как указать строку, содержащую одинарную кавычку ( ' )? Например, строку « What's your name? ». Её ведь нельзя записать просто как « 'What's your name?' », потому что тогда Python не сможет определить, где начало строки, и где конец. В таком случае придётся каким-то образом указать, что данная одинарная кавычка не обозначает конца строки. Это можно сделать при помощи так называемой управляю- щей последовательности. Укажите одинарную кавычку как \' – через обратную косую черту. Теперь наша строка будет выглядеть так: 'What\'s your name?' Другой способ записи такой специфической строки – "What's your name?" , т.е. с ис- пользованием двойных кавычек. Аналогично следует использовать управляющую после- довательность для вставки двойной кавычки в строку, ограниченную двойными кавычка- ми. Сама же обратная наклонная черта указывается управляющей последовательностью \\ А как записать двустрочную строку? Один из вариантов нам уже знаком – заключить строку в тройные кавычки, как было показано ранее . Но есть и другой – использовать управляющую последовательность для символа перевода строки \n . Например: « Это первая строка\nЭто вторая строка ». Полезно знать ещё одну управляющую после- довательность – табуляцию ( \t ). Управляющих последовательностей существует намного больше, но здесь упомянуты только наиболее важные. Следует отметить, что одинарная наклонная черта в конце строки лишь указывает на то, что продолжение идёт строкой ниже, но не вставляет перевода строки. Например: 18.9. Функция repr 141 A Byte of Python (Russian), Версия 2.02 "Это первое предложение. \ Это второе предложение." эквивалентно записи "Это первое предложение. Это второе предложение." 18.11 Необрабатываемые строки Для записи строки, в которой не будет проводиться никакой специальной обработки, как, например, управляющих последовательностей, перед строкой указывается приставка « r » или « R » 1 . Например, r"Перевод строки обозначается \n" Замечание для пользователей регулярных выражений Для работы с регулярными выражениями всегда используйте необрабатываемые строки. В противном случае вас ждёт много возни с обратными косыми чёрточками. Например, обратные ссылки можно обозначать как '\\1' или r'\1' 18.12 Резюме Итак, в настоящей главе мы рассмотрели некоторые дополнительные возможности Python, хотя по-прежнему, не охватили всего. Тем не менее, к настоящему моменту мы уже прошли почти всё, что вам когда-либо понадобится использовать на практике. Этого вполне достаточно для начала работы над любыми программами. Далее мы обсудим, как продолжать исследовать Python. 1 «r» – от англ. «raw» – «сырой, необработанный» (прим. перев.) 18.11. Необрабатываемые строки 142 Что дальше Добросовестный читатель, дочитавший книгу до сих пор, а также много практиковав- шийся в написании программ, наверняка уже освоился с Python. И конечно, вы уже по- пробовали реализовать какие-нибудь собственные идеи на Python, чтобы потренировать- ся. Нет? Тогда стоит начать! Но в таком случае возникает вопрос: «Что же делать дальше?». Я предлагаю вам справиться со следующей задачей. Задача Создайте собственную программу «Адресная книга», работающую из командной стро- ки и позволяющую просматривать, добавлять, изменять, удалять или искать контактные данные ваших знакомых. Кроме того, эта информация также должна сохраняться на дис- ке для последующего доступа. Это достаточно простая задача, если думать о ней в терминах, которые мы до сих пор проходили. Если же вы всё-таки нуждаетесь в подсказке, как действовать, вот она. Подсказка (не читать!) Создайте класс для хранения персональных данных. Объекты визитных карточек храни- те в словаре, в котором имена контактов будут служить ключами. Для длительного хра- нения этих объектов на жёстком диске воспользуйтесь модулем pickle. Для добавления, изменения или удаления контактов применяйте встроенные методы словаря. Как только вы справитесь с этим, вы смело можете называться программистом на Python. А теперь немедленно напишите мне письмо ;-). Это не обязательный шаг, но весьма ре- комендуемый. Также подумайте о покупке бумажной версии книги , чтобы поддержать её дальнейшую разработку. Если эта задачка показалась вам слишком лёгкой, попробуйте ещё одну: 143 A Byte of Python (Russian), Версия 2.02 Задача Реализуйте команду replace . Эта команда заменяет одну строку другой в списке передан- ных ей файлов. Команда replace может быть любой желаемой сложности: от простой замены строк до поиска по шаблону (регулярному выражению). А вот ещё некоторые возможные направления вашего дальнейшего путешествия по миру Python: 19.1 Упражнения На Stack Overflow есть неплохое обсуждение упражнений на Python, помогающих отто- чить ваше мастерство 19.2 Примеры программ Лучший способ овладеть языком программирования – это писать много программ и чи- тать много программ: • Проект PLEAC • Хранилище кода Rosetta • Примеры для Python на java2s • Книга рецептов Python – ценнейшая коллекция рецептов и подсказок, как решать те или иные проблемы при помощи Python. Обязательна к прочтению каждым про- граммистом на Python. • Модуль недели – ещё один замечательный путеводитель по стандартной библио- теке Python 19.3 Вопросы и ответы • Официальные «Можно и нельзя» в Python • Официальные ЧаВо Python • Список НеЧасто задаваемых Вопросов от Norvig • Вопросы и ответы из интервью о Python 19.1. Упражнения 144 A Byte of Python (Russian), Версия 2.02 • Вопросы на StackOverflow с пометкой «python» 19.4 Советы и рекомендации • Трюки и уловки Python • Сколачиваем программы при помощи Python • Очаровательный Python – замечательная серия статей о Python Дэвида Мерца. 19.5 Учебники • Всеобъемлющий список учебников по Python от Awaretek 19.6 Видео • PyVideo 19.7 Обсуждение Если вы застряли на какой-то проблеме в Python и не знаете, кого спросить, тогда список рассылки python-tutor подойдёт наилучшим образом. Тем не менее, сначала проделайте всю домашнюю работу и попытайтесь решить пробле- му самостоятельно. 19.8 Новости Если вас интересуют последние новости мира Python, отслеживайте их на официальной планете Python 19.4. Советы и рекомендации 145 A Byte of Python (Russian), Версия 2.02 19.9 Установка библиотек В Каталоге пакетов Python существует колоссальное количество открытых библиотек, ко- торые вы можете использовать в своих программах. Для их установки можно воспользо- ваться pip 19.10 Графические программы Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к Python. Привязки позволяют писать программу на Python, используя библиотеки, кото- рые сами по себе написаны на C, C++ или других языках. Выбор ГИП для Python достаточно обширен: • Kivy http://kivy.org • PyGTK Это привязки Python к инструментарию GTK+, на основе которого построен GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интер- фейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте Учебник по PyGTK • PyQt Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумитель- ной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы. Для начала прочитайте краткое пособие по PyQt или Книгу PyQt • wxPython Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освое- нии, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраи- ваемых платформах. Многие среды разработки для wxPython, такие как SPE (Stani’s Python Editor) и wxGlade включают дизайнеры графического интерфейса. При по- мощи wxPython можно создавать как свободные, так и проприетарные программы. Для начала прочитайте учебник по wxPython 19.9. Установка библиотек 146 A Byte of Python (Russian), Версия 2.02 19.11 Резюме по инструментам ГИП Другие варианты можно найти на wiki-странице GuiProgramming официального сайта Python К сожалению, не существует некоего единого стандартного инструмента для создания графических программ на Python. Я бы рекомендовал выбирать один из инструментов, описанных выше, наиболее подходящий для конкретной ситуации. Во-первых, опреде- литесь, согласны ли вы платить за использование этого инструмента. Во-вторых, опре- делитесь, на каких платформах должна работать ваша программа: только на Windows, на Mac и GNU/Linux или на всех сразу. И в-третьих, если вы выбрали платформу GNU/Linux, то в какой среде вы работаете: в KDE или GNOME. Для более подробного анализа см. страницу 26 Статей о Python, Том 3, Выпуск 1 19.12 Различные реализации Язык программирования обычно состоит из двух частей: собственно языка и программ- ного обеспечения. Язык – это то, как мы что-либо пишем, а программное обеспечение – это то, что запускает наши программы. До сих пор для выполнения наших программ мы использовали CPython. Он называется «CPython», потому что написан на языке C и является Классическим интерпретатором Python 1 Но существует и другое программное обеспечение, способное выполнять программы на Python: • Jython Реализация Python, работающая на платформе Java. Это означает, что можно ис- пользовать библиотеки и классы Java в программе на Python и наоборот. • IronPython Реализация Python, работающая на платформе .NET, что означает возможность ис- пользования библиотек и классов .NET в программах на Python и наоборот. • PyPy Реализация Python, написанная на Python! Это исследовательский проект, суще- ствующий для ускорения и облегчения разработки интерпретатора, поскольку сам интерпретатор написан на динамическом языке (в отличие от статических языков, как C, Java и C# в вышеупомянутых реализациях) • Stackless Python 1 |