<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Newacct</id>
		<title>Linuxformat - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Newacct"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Newacct"/>
		<updated>2026-05-13T11:07:44Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF120:Python</id>
		<title>LXF120:Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF120:Python"/>
				<updated>2010-09-13T00:43:52Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''''Python''''' Заставим Web доставлять нужное содержимое вам на блюдечке&lt;br /&gt;
&lt;br /&gt;
==''Python'': Сеть на ваш вкус==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Python}}&lt;br /&gt;
&lt;br /&gt;
: '''Часть 1''': Недовольны, что контент раскидан где попало и как попало? '''Ник Вейч''' приступает к объяснению, как подчинить сеть вашим целям.&lt;br /&gt;
&lt;br /&gt;
Что бы вам ни захотелось узнать, оно, вероятно, найдется в Сети. Это загадочное облако – иногда белое и пушистое, а иногда и полное грязных инсинуаций – содержит знания любого сорта, хотя до них надо еще докопаться. Готовы поспорить, что отыщется даже точная дата крещения «Наболиона Буонапарте», если порыться старательно.&lt;br /&gt;
&lt;br /&gt;
Но не вся информация в сети статична, соединена разумным образом или вообще настолько хороша, насколько должно быть. Вот почему одним из заметных шагов пост-web 2.0 является мэшап ['''мэшап, mashup – технология построения web-сайта с объединением возможностей группы сторонних web-приложений, см. http://ru.wikipedia.org/wiki/Мэшап_(веб), – прим. пер.'''] – преобразование web-содержимого в новые удивительные формы. Добро пожаловать в мир панк-данных.&lt;br /&gt;
&lt;br /&gt;
===Куда дует ветер===&lt;br /&gt;
&lt;br /&gt;
Для начала нашего путешествия сделаем что-нибудь попроще, типа изменения фона рабочего стола в зависимости от погоды. Приложения и виджеты, предоставляющие такой сервис, уже имеются, а значит, данные должно быть легко добыть в Интернете. Быстрый поиск по словосочетанию «weather API data» непременно выдаст множество ссылок. Наши критерии: API должны быть понятны, охватывать как можно большую часть мира и иметь приличную документацию. Под них подпадает лишь пара из предложенных источников, в основном в связи с документацией – ну да, можно потратить время на распутывание данных или работы API, но зачем, если есть кому предоставить и данные, и руководство по их использованию?&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF120_66_1.jpg|300px]] Получить идентификатор вашей местности можно прямо у онлайн-службы Yahoo, просто скопировав открытый ею URL.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Пошарив там и сям, мы решили, что нас устраивает служба погоды Yahoo. Она проста и обладает достаточной документацией, чтобы начать без особых усилий. Еще чуток порывшись, мы обнаружили http://develoPer.yahoo.com/weather, где предоставлено множество деталей и пара примеров использования службы. Очко в пользу Yahoo!&lt;br /&gt;
&lt;br /&gt;
Метод Yahoo состоит в добавлении идентификатора местности в конец URL. В ответ служба генерирует RSS-ленту данных о погоде в указанном регионе. Это удобно во многих отношениях, поскольку означает, что даже код писать не придется. Идентификатор местности найти легко – согласно документации, достаточно пройти на главную страницу Yahoo! Weather, ввести город, и URL ваш (иногда, правда, при этом выскакивает название не города, а ближайшей к нему метеостанции).&lt;br /&gt;
&lt;br /&gt;
«St. Petersburg» даст нам http://weather.yahoo.com/forecast/RSXX0091.html – значит, код нашей местности RSXX0091. Теперь у нас есть информация о местоположении. Инструкция также говорит, что можно добавить параметр для выбора температуры по Фаренгейту или по Цельсию, и мы добавили к URL опцию по Цельсию '''u=c'''. Теперь протестируем URL, чтобы увидеть как он работает (о написании кода речи все еще нет).&lt;br /&gt;
&lt;br /&gt;
Приличный браузер, вроде ''Firefox'', способен отобразить RSS-ленту в удобной форме – надо всего лишь ввести ее URL: http://weather.yahooapis.com/forecastrss?p=RSXX0091&amp;amp;u=c.&lt;br /&gt;
&lt;br /&gt;
===Обработчик ленты===&lt;br /&gt;
&lt;br /&gt;
Теперь, зная, что нужная нам информация доступна в виде RSS-ленты, как заполучить ее в скрипт ''Python'' и декодировать? Скопировав указанный выше URL в ''Firefox'' и выбрав в меню '''Вид &amp;gt; Исходный код''', вы увидите кучу информации плюс всякие заголовки и прочее. Можно создать обработчик, который возьмет эти сырые данные и выудит из них соответствующие куски – но, как обычно и бывает, кто-то его уже создал. Для ''Python'' имеется библиотечный модуль под названием ''Feedparser'', создающий объект ''Python'' из RSS-потока. Проще всего установить его через менеджер пакетов: другие способы малость утомительны.&lt;br /&gt;
&lt;br /&gt;
После установки ''Feedparser'' наконец-то настает время кодирования. Сначала запустите ''Python'' из командной строки, чтобы понимать, с чем мы имеем дело. Вы окажетесь в интерактивной оболочке ''Python'', где мы и введем:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|left|Заголовок=Скорая помощь|Содержание=''Python'' требователен к синтаксису. Он требует выделять отступами блоки многострочных выражений, функций и условных операторов. Количество пробелов в отступе роли не играет: главное, чтобы оно сохранялось внутри блока.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import feedparser&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; url = “http://weather.yahooapis.com/forecastrss?p=RSXX0091&amp;amp;u=c”&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; data = feedparser.parse(url)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; data&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF120_67_1.jpg|300px]] Убедитесь, что передаваемый URL выдает RSS-ленту, через ''Firefox'', который ее тут же отобразит|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Результатом действия последней строки будет выдача вереницы символов, которая представляет собой ленту. К счастью, хотя она и похожа на набор случайных данных, пронизанных частоколом скобок, на деле это хорошо структурированный объект. Чтобы убедиться в этом, попробуйте ввести в оболочке ''Python'' следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;for x in data: &lt;br /&gt;
 ... print x&lt;br /&gt;
 ...&lt;br /&gt;
 feed&lt;br /&gt;
 status&lt;br /&gt;
 version&lt;br /&gt;
 encoding&lt;br /&gt;
 bozo&lt;br /&gt;
 headers&lt;br /&gt;
 etag&lt;br /&gt;
 href&lt;br /&gt;
 namespaces&lt;br /&gt;
 entries&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это цикл, пробегающий по всем объектам внутри '''data'''. Одно из замечательных свойств ''Python'' – легкость работы с объектами, и даже возможность заставить их рассказать о себе. Например, пусть мы хотим точно знать, с каким типом объектов работаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;type(data)&lt;br /&gt;
 &amp;lt;class 'feedparser.FeedParserDict'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну, отчасти нам это помогло. Если вы уже сталкивались с ''Python'', то, вероятно, слышали про объекты-словари (ассоциативные массивы) – они просто хранят данные в виде пар ключ = значение. Объекты, список которых мы только что выводили, являются в данном случае ключами. Обратившись к документации ''Feedparser'', мы получим несколько более внятное представление, что хранят такие ключи, поскольку они стандартны для объектов ''Feedparser''. Из них для нас важен ключ entries. Он хранит объект-список отдельных записей RSS-ленты, которые и составляют ее реальное содержимое.&lt;br /&gt;
&lt;br /&gt;
Списки ''Python'' нумеруются с индекса '''0''', поэтому, чтобы сослаться на объект первой записи, следует использовать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; data.entries[0]&lt;br /&gt;
 {'updated': u'Thu, 28 May 2009 2:00 am MSD', 'yweather_condition': u'', 'updated_parsed': ...&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; for x in data.entries[0]&lt;br /&gt;
 ... print x&lt;br /&gt;
 ...&lt;br /&gt;
 updated&lt;br /&gt;
 yweather_condition&lt;br /&gt;
 updated_parsed&lt;br /&gt;
 links&lt;br /&gt;
 title&lt;br /&gt;
 summary_detail&lt;br /&gt;
 geo_lat&lt;br /&gt;
 summary&lt;br /&gt;
 guidislink&lt;br /&gt;
 title_detail&lt;br /&gt;
 link&lt;br /&gt;
 geo_long&lt;br /&gt;
 yweather_forecast&lt;br /&gt;
 id&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И вновь мы имеем объект-словарь с парами ключей и значений. На сей раз они определяются самой XML-структурой ленты, поэтому для данного объекта нет модуля с голубой каемочкой; зато его элементы документированы на сайте Yahoo. После недолгого изучения становится ясно, что полезна нам будет сводка ('''summary''') текущих погодных условий, включая температуру.&lt;br /&gt;
&lt;br /&gt;
Налицо небольшая проблема: необходимые данные отнюдь не сосредоточены в одном поле нам на радость. Эта часть ленты – HTML-код для отображения на web-странице, а нам нужен только текст.&lt;br /&gt;
&lt;br /&gt;
===Регулярные выражения===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Регулярные выражения|Содержание=Регулярные выражения заполонили все вокруг. Они бывают и простенькими, и дьявольски сложными. Вкратце, регулярное выражение – это группа знаков, определяющая некую конфигурацию символов в строке. Имеются также специальные знаки, типа местозаполнителей, которые подразумевают любой символ. Кроме того, есть еще списки, группы и даже операторы для объединения соответствий – можно, например, создать регулярное выражение, полностью описывающее все базы для поиска.&lt;br /&gt;
&lt;br /&gt;
При создании шаблона лучше всего воспользоваться инструментом, который поможет вам проверить его корректность – даже один неверный символ чреват катастрофой! Среди лучших подобных инструментов – онлайн-построитель регулярных выражений http://gskInner.com/RegExr/. Вставьте в него пример текста и протестируйте свои навыки создания шаблонов. Не помешает и обратиться к документации: http://docs.python.org/library/re.html.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF120_69_1.jpg|300px]] Регулярные выражения не всякому по плечу; нам поможет служба http://gskinner.com/RegExr/|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
От регулярных выражений (также известных как «регекспы» [regex]) никуда не денешься – они будут все чаще встречаться на вашем пути переустройства мира. Регулярные выражения – это просто способ выполнения поиска и замены, и хотя они смахивают на криптограммы, разобраться в них не так уж трудно. В данном случае нам надо всего лишь избавиться от нудных HTML-тэгов. Мы, вероятно, и без того извлекли бы нужные данные, но подобный опыт пригодится нам в будущем, если мы захотим приспособить наш скрипт к работе с различными источниками.&lt;br /&gt;
&lt;br /&gt;
Мы импортируем ''Python''-модуль '''re''' (он включен в качестве одной из стандартных библиотек, так что ничего загружать и устанавливать не придется) и привлечем его к работе с этим текстом. На нашем уроке нет места на детальное объяснение работы регулярных выражений, а за краткими сведениями обратитесь ко врезке '''Регулярные выражения''' или статье из [[LXF80:Регулярные_выражения.|LXF80]].&lt;br /&gt;
 &lt;br /&gt;
Выражением мы хотим охватить все, что обрамлено знаками «больше» и «меньше», используемыми для обозначения HTML-тэгов. Это очень легко; выражение будет выглядеть как &amp;lt;, за которым следует шаблон любого символа, повторенный любое количество раз, то есть .'''+?''' и в конце '''&amp;gt;'''. '''+?''' – то же, что и '''+''', но это «ленивое» соответствие: оно отвечает наикратчайшей корректной строке. А нам того и надо – все, что находится между '''&amp;lt;&amp;gt;'''; других вариантов нет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;summary = data.entries[0].summary&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;import re&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;pattern = '&amp;lt;.+?&amp;gt;'&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp = re.sub(pattern,'',summary)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp&lt;br /&gt;
 u'\nCurrent Conditions:\nLight Rain Shower, 12 C\nForecast:\nThu – Partly Cloudy. High: 25 Low:12\nFri – Mostly Sunny. High: 19 Low:&lt;br /&gt;
 9\n\nFull Forecast at Yahoo! Weather\n(provided by The Weather Channel)’&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь текст очищен от тэгов HTML; но в нем остались переводы строк. Вообще-то есть стандартный модуль для преобразования такой строки в список, но у нас уже загружен модуль re, и мы вполне можем им обойтись. Для поиска символов новой строки надо объяснить ''Python'', что мы хотим использовать чистое (raw) значение строки – поместив перед ней символ '''r'''.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Почему ''Python''?|Содержание=Можно, естественно, писать скрипты и приложения для обработки web-данных на любом другом языке; так почему же мы выбрали ''Python'', а не ''C#'', например? На то есть веские причины. ''Python'' – язык простой и понятный, код на нем легко пишется и (что, вероятно, еще важнее) легко читается. Он обладает прекрасными возможностями для работы с текстом (которым по большей части и являются наши данные), он кросс-платформенный и снабжен бездной полезных библиотек для web-служб и протоколов. Используя ''Python'' и пару библиотек, можно мигом создать рабочее приложение или скрипт.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; temp = re.split(r'\n',temp)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; temp&lt;br /&gt;
 [u'', u'Current Conditions:', u'Light Rain Shower, 12 C', u'Forecast:', u'Thu – Partly Cloudy. High: 25 Low: 12', u'Fri – Mostly Sunny. High:&lt;br /&gt;
 19 Low: 9', u'', u'Full Forecast at Yahoo! Weather', u'(provided by The Weather Channel)']&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp[2]&lt;br /&gt;
 u'Light Rain Shower, 12 C'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видите, мы предположили, что необходимую строку содержит третий элемент полученного списка. Чтобы добыть из него температуру, воспользуемся другим регулярным выражением, отбирающим из строки исключительно цифры.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp = re.findall(u'[0‑9]+',temp[2])[0]&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp&lt;br /&gt;
 u'12'&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; temp = int(temp)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; temp&lt;br /&gt;
 12&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Финальный шаг – употребить встроенное в ''Python'' преобразование типов, превратив строку со значением температуры в целое число: числа проще сравнивать. (В реальном скрипте мы можем, эффективности ради, объединить некоторые из приведенных этапов, но это не даст большого выигрыша для приложения, а ясность пошаговой записи будет утрачена.) Осталось только создать то, что мы посулили в начале урока: обои рабочего стола, меняющиеся в зависимости от погоды&lt;br /&gt;
&lt;br /&gt;
===Перемена погоды===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF120_68_2.jpg|300px]] Сберегите свой рассудок — для написания кода ''Python'' пользуйтесь IDE; это сильно упрощает обнаружение ошибок.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Как переделать обои? А для этого в ''Python'' есть вызов внешних команд. В Gnome можно изменить заставку командой ''gconftool-2'', устанавливающей переменную окружения, в которой хранится размещение и имя файла обоев. Оно бы и достаточно. Но поскольку у нас возможны варианты, лучше оформить это в виде функции.&lt;br /&gt;
&lt;br /&gt;
Несложная функция не особо напряжет вам мозг. ''Python'' обладает простой конструкцией: описание функции и ее параметров, за которым следует текст с отступом. Ее даже можно создать в интерактивной оболочке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; def change_wallpaper(filename):&lt;br /&gt;
 ... cmd = 'gconftool-2 -s /desktop/gnome/background/picture_filename -t string &amp;quot;' + filename + '&amp;quot;'&lt;br /&gt;
 ... os.system(cmd)&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; change_wallpaper('plop.jpg')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первая строка функции создает команду оболочки, а вызов '''os.system'' выполняет ее. Вызов функции меняет переменную окружения, и загружается новое изображение. Подставленное нами имя файла '''filename''' – просто параметр; в реальности, хорошо бы хранить ваши изображения где-нибудь внутри вашего домашнего каталога, допустим, в подкаталоге с именем '''weather''', и называть их согласно погодным условиям.&lt;br /&gt;
&lt;br /&gt;
Сейчас Gnome допускает в качестве обоев SVG-изображения, и вы можете создать этакую изысканную масштабируемую картину для вашего рабочего стола.&lt;br /&gt;
Не знаем, как по-вашему, но мы думаем, что здесь должно быть пять изображений: freezing [мороз], cold [холод], mild [средне], warmish [тепло] и hot [жарко]. Диапазоны температур выбирайте в соответствии с вашим климатом, а мы присвоим следующие: ниже 0°C – мороз, 0–8 – холод, 9–15 – средне, 16–25 – тепло, выше – жарко. В некоторых языках для реализации проверки предусмотрена конструкция '''case/switch'''. В ''Python'' ее нет, и мы нагородим огород из конструкций '''if/elif/else''', вот так:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF120_68_1.jpg|300px]] Кого же не согреет милый снегопад на SVG-обоях рабочего стола? Они могут быть вашими.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; if (temp &amp;lt;0):&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/freezing.svg')&lt;br /&gt;
 ... elif (temp&amp;lt;9):&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/snow.svg')&lt;br /&gt;
 ... elif (temp&amp;lt;16):&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/mild.svg')&lt;br /&gt;
 ... elif (temp&amp;lt;26):&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/warm.svg')&lt;br /&gt;
 ... else:&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/hot.svg')&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объединив все это в один скрипт, мы получим нечто подобное следующему (остается только разжиться изображениями):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 import feedparser,re,os,string&lt;br /&gt;
 def change_wallpaper(filename):&lt;br /&gt;
  cmd = 'gconftool-2 -s /desktop/gnome/ background/picture_filename -t string &amp;quot;'+filename+'&amp;quot;'&lt;br /&gt;
  os.system(cmd)&lt;br /&gt;
 url = “http://weather.yahooapis.com/&lt;br /&gt;
 forecastrss?p=RSXX0091&amp;amp;u=c”&lt;br /&gt;
 data = feedparser.parse(url)&lt;br /&gt;
 # extract the summary from the data&lt;br /&gt;
 summary = data.entries[0].summary&lt;br /&gt;
 temp = re.split(r'\n',re.sub('&amp;lt;.+?&amp;gt;','',summary))&lt;br /&gt;
 temp = int(re.search('\d+',temp[2]).group())&lt;br /&gt;
 if temp &amp;lt;0:&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/freezing.svg')&lt;br /&gt;
 elif temp&amp;lt;9:&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/snow.svg')&lt;br /&gt;
 elif temp&amp;lt;16:&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/mild.svg')&lt;br /&gt;
 elif temp&amp;lt;26:&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/warm.svg')&lt;br /&gt;
 else:&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/hot.svg')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Форматы web-данных|Содержание=Мы осознали, что есть масса web-приложений, способных доставить нам данные. Но вы ведь не ждали, что все будет просто, не так ли? Протоколов или способов предоставления данных немало, и некоторые сайты (например, Flickr) даже предусматривают более одного варианта. Еще одно неудобство – разнобой в их использовании на сайтах. В нашей серии уроков мы постепенно все это рассмотрим.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Конечно, даже при буйном воображении это не полноценное приложение, а небольшой сценарий, но его вполне можно взять за основу. На данном уроке мы взяли данные из сети и автоматически совместили их с контекстом рабочего стола. Мы увидели, как просто выглядят RSS-ленты и как работать с объектами в ''Python''; постигли ужасы регулярных выражений; и рассмотрели совершение из ''Python'' системных вызовов для выполнения внешних команд. Вот так мы и можем, исследуя сервисы всемирной паутины, брать что угодно и ставить себе на службу.&lt;br /&gt;
&lt;br /&gt;
Скрипт легко расширить (например, позволив пользователям выбирать местоположение) или преобразовать его в апплет. Покамест он завершился бы с ошибкой при отсутствии подключения к Интернету, что не есть хорошо, но на следующих уроках мы изучим, как с этим справиться. Оставайтесь с нами! '''LXF'''&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF121:Python</id>
		<title>LXF121:Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF121:Python"/>
				<updated>2010-07-10T20:40:28Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''''Python''''' Заставим Web доставлять нужное содержимое вам на блюдечке&lt;br /&gt;
&lt;br /&gt;
==''Python'': Создаем говорящего бота==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Python}}&lt;br /&gt;
&lt;br /&gt;
: '''Часть 2:''' Думаете, жизнь может быть лучше? Она и станет лучше, если вы, следуя '''Нику Вейчу''', создадите себе бота – чтоб вкалывал за вас.&lt;br /&gt;
&lt;br /&gt;
Представьте, как упростилась бы наша жизнь при наличии оравы слуг, готовых выполнять наши приказы: они приносили бы почту, чистили клетку с гиппогрифом, пинали Майка… ну, всякое такое. Увы, мы живем в слишком раннем историческом периоде, когда еще не внедрены дешевые, эффективные и послушные роботы-слуги, и приходится все делать самим. Другой способ отлынивать от работы – завести виртуальную прислугу. О да, под это определение может попасть практически&lt;br /&gt;
любое ПО, но я-то имею в виду простой и удобный интерфейс, способный выполнять полезные задачи и сообщать вам то, что вы хотите знать. Если он сумеет ставить в тупик ваших друзей и убеждать ваших врагов пересмотреть свою матрицу враждебности, тем лучше.&lt;br /&gt;
&lt;br /&gt;
Нечасто используемым, но удобным способом общения с подобными существами является чат. Стоит ли связываться с хитроумными ''SSH''-туннелями или нудными сервисами на базе web, если можно легко общаться с помощью средства, из которого вы и так не вылезаете? В свете вышесказанного, наш маленький&lt;br /&gt;
подручный будет чат-ботом: пусть сидит на канале чата и ждет, когда хозяин подаст голос; или, допустим, при случае проявляется и сообщает вам о чем-нибудь.&lt;br /&gt;
&lt;br /&gt;
===Я ''Xmpppy''===&lt;br /&gt;
&lt;br /&gt;
Протокол Jabber/XMPP отлично поддерживается ''Python''. Он реализован в рамках всеобъемлющего сетевого модуля ''Twisted'', но есть и более легковесная версия, подходящая для наших нужд, по имени ''Xmpppy''. В вашем дистрибутиве наверняка имеется этот пакет, но можно скачать код ''Python'' с сайта http://xmpppy.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
Чтобы разобраться в ''Xmpppy'', начнем с примеров командной строки. Но сперва обзаведемся тестовой учетной записью: разве ваш бот не заслужил собственного имени пользователя в Google? Для тестирования вам понадобятся как минимум два идентификатора '''Jabber ID'''. Итак, мы зарегистрировали учетную запись Gmail специально для бота, вошли через web-браузер и пригласили другого пользователя Gmail в чат. Можно было бы настроить все это&lt;br /&gt;
в самом ''Xmpppy'', но так будет сложнее: для первичного тестирования лучше иметь две учетных записи, которые могут общаться друг с другом. После этого наберите в оболочке ''python'' для доступа к интерактивной командной строке ''Python'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import xmpp&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; jid=xmpp.protocol.JID(“botaddress@gmail.com”)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это мы установили '''ID Jabber'''. Он сильно смахивает на адрес электронной почты, потому что мы для целей нашего урока взяли учетную запись Google; однако любой другой '''Jabber ID''' тоже подойдет. Он состоит из двух частей (а может и из трех, но об этом потом): имя пользователя и домен. Домен – это место, где ''Xmpppy'' будет искать сервер.&lt;br /&gt;
&lt;br /&gt;
Создав пользователя, надо создать и экземпляр клиента. Клиент в ''Xmpppy'' – это объект, который контролирует соединение, обрабатывает сообщения и вообще взаимодействует с сервером. Клиент и его подключение создаются за несколько шагов: сначала нужно создать экземпляр клиента (в качестве аргумента потребуется '''Jabber ID'''), а затем мы попробуем соединиться с сервером. Установив соединение, нужно аутентифицироваться для выполнение дальнейших действий.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая попомщь|Содержание=Безопасность вашего бота легко укрепить, ограничив ему прием команд только одним конкретным ID.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; myclient=xmpp.Client(jid.getDomain(),debug=[])&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; myclient.connect()&lt;br /&gt;
 ‘tls’&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; myclient.auth(jid.getNode(),’botpasswd’)&lt;br /&gt;
 ‘sasl’&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь нужно обратить внимание на пару моментов. Сперва мы создали экземпляр клиента и вызвали метод '''jid.getDomain''' для получения имени сервера из созданного нами объекта '''jid'''. Далее, вас просят еще указать уровень отладки, определяющий качество обратной связи, которую вы получаете. Мы установили свой на пустой список, но если вам охота завалить себе экран сообщениями, добавьте в него строку '''always'''. Впрочем, при наличии проблем сообщения могут и пригодиться.&lt;br /&gt;
&lt;br /&gt;
===Даешь ''Disco''===&lt;br /&gt;
&lt;br /&gt;
''XMPP'' включает структуру модулей расширения под названием ''Disco''. Они обогащают протокол другими типами сообщений, включая SIP (голосовые) и передачу файлов, и всеми мыслимыми возможностями, для которых применяется сеть «точка–точка». Так почему бы не прибавить функциональности и нашему боту – например, превратить его в хранилище файлов или чтеца новостей?&lt;br /&gt;
&lt;br /&gt;
К счастью, Google расширил свою реализацию ''XMPP'' некоторыми дополнительными функциями, подробную информацию о которых вы найдете на сайте http://code.google.com/apis/talk/jep_extensions/extensions.html.&lt;br /&gt;
&lt;br /&gt;
===Создание соединения===&lt;br /&gt;
&lt;br /&gt;
После установки уровня отладки мы создали соединение (пароль тут подставьте ваш собственный) и получили ответный результат tls, который означает, что с сервером установлено безопасное соединение – вы можете также увидеть tcp для стандартного сетевого соединения, или пустую строку, если в соединении было отказано.&lt;br /&gt;
&lt;br /&gt;
При малой прыткости ваших пальцев и в зависимости от вашего сервера, следующий шаг может не сработать: серверы Google ожидают от вас быстрой аутентификации соединения, в противном случае оно оборвется, оставив вас скрести в затылке и раздумывать, что за беда тут стряслась. Вам дается всего несколько секунд, и вы, возможно, захотите объединить следующие строки вместе:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; myclient.connect() ; myclient.auth(jid.getNode(),’botpasswd’)&lt;br /&gt;
 ‘tls’&lt;br /&gt;
 ‘sasl’&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат '''sasl''' говорито том, что соединение аутентифицировано с использованием SASL (Simple Authentification and Security Layer, Простая аутентификация и слой безопасности) посредством вашего пароля. Последний шаг установки соединения – объявление вашего статуса. Как вы знаете, в Google Chat и других сервисах ''Jabber'' существует несколько различных уровней статусов клиентов (например, Доступен или Занят). Кроме всего прочего, они используются сервером для составления списков доступных контактов, а в ''Xmpppy ''для этого существует специальный метод:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 myclient.sendInitPresence()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Учтите, что некоторые серверы не дадут вам и шагу ступить, пока вы не укажете это правильным образом.&lt;br /&gt;
&lt;br /&gt;
Послание в бутылке&lt;br /&gt;
Ура, есть контакт! Теперь, прежде чем заняться скучными вещами, давайте составим и отправим сообщение нашему оппоненту (хороший кандидат – ваш собственный адрес Google). Однако сначала нужно обзавестись адресом, куда требуется доставить сообщение, и его текстом. После этого создадим сообщение и отправим его&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 mymsg=xmpp.protocol.Message(“evilbot.1@gmail.com”,”hello”, “chat”)&lt;br /&gt;
 myclient.send(mymsg)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Если вы справились с приглашением и разрешением на чат от учетной записи вашего бота, вы должны получить приятный сюрприз.&lt;br /&gt;
Одна штука может вас озадачить: а как установить свое статусное сообщение? Сервер отображает только статус и соответ-ствующее сообщение, переданные клиентом.&lt;br /&gt;
&lt;br /&gt;
На сервере Google это означает, что вы можете иметь статус Не на месте, Невидим, Отсутствую, Не беспокоить или На месте, а также в форме текстового сообщения. А вот и разгадка: ваш статус задается отправкой специального сообщения ''XMPP'', которое идет прямо на сервер. Оно включает ваш статус и текст статусного сообщения. Не зная этого, самому догадаться сложно, но смысл тут есть: ''XMPP'' как раз предназначен для отправки сообщений, так зачем же заводить отдельные протоколы только для отправки сообщений про статус? Сервер отвечает за обновление статуса для всех, кто соединен с вами. Кстати говоря, протокол ''XMPP'' позволяет отправлять контактам явные сообщения о статусе, но, хотя тут и есть с чем порезвиться, обычно мы перекладываем эту заботу на сервер:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; presence = xmpp.Presence(status = “Ready!”, show = “chat”, priority = ‘1’)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; myclient.send(presence)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Модуль ''Xmpppy'' работает с сообщениями о статусе иначе, чем с обычными, потому что они используют другие аргументы,&lt;br /&gt;
но механизм отправки тот же самый.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Почему ''Python''?|Содержание=Можно, естественно, писать скрипты и приложения для обработки web-данных на любом другом языке; так почему же мы выбрали ''Python'', а не ''C#'', например? На то есть веские причины. ''Python'' – язык простой и понятный, код на нем легко пишется и (что, вероятно, еще важнее) легко читается.&lt;br /&gt;
&lt;br /&gt;
Он обладает прекрасными возможностями для работы с текстом (которым по большей части и являются наши данные), он кросс-платформенный и снабжен бездной полезных библиотек для web-служб и протоколов. Используя ''Python'' и пару библиотек, можно мигом создать рабочее приложение или скрипт.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
===Прослушивание===&lt;br /&gt;
&lt;br /&gt;
От хорошего бота также нужно получать входящие сообщения. Среда ''Xmpppy'' принимает весточки, отправленные на созданный вами клиентский объект, и сохраняет их в стеке для обработки. А какой? ''Xmpppy'' использует концепцию обработчиков [handler]: сперва вы определяете функцию или метод, который будет действовать как получатель информации. Затем, при готовности обработать сообщения из стека, вы просто вызываете метод '''Process()''' объекта клиента. Звучит это сложнее, чем есть на самом деле – другими словами, вы сообщаете клиенту, где нарыть сообщений, затем велите ему пропустить их через функцию. Конечно, это можно сделать и через командную строку ''Python'', но тогда будет сложнее: нужно написать функцию обработчика, а затем, обычным порядком, запустить бесконечный цикл для обработки сообщений по мере их прибытия.&lt;br /&gt;
&lt;br /&gt;
Мы покажем соответствующий код в командной строке, но разумнее будет встроить его в собственный класс (как мы увидим далее). В данном примере, мы также отправим сообщение самим себе для тестирования, а вы можете сделать это через Gmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; def msgparser(instance, message):&lt;br /&gt;
 ... print “new message!”&lt;br /&gt;
 ... print “from: “ + str(message.getFrom())&lt;br /&gt;
 ... print “msg: “ + str(message.getBody())&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; myclient.RegisterHandler(‘message’, msgparser)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; mymsg=xmpp.protocol.Message(“evilbot@gmail.com”,”hello”, “chat”)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; myclient.send(mymsg) &lt;br /&gt;
 ‘5’&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; myclient.Process(1)&lt;br /&gt;
 new message!&lt;br /&gt;
 from: evilbot@gmail.com&lt;br /&gt;
 msg: hello&lt;br /&gt;
 1493&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видите, анализирующая функция '''msgparser()''' проста. Она использует доступные методы '''getFrom()''' и '''getBody()''' во входящем&lt;br /&gt;
сообщении, преобразует результаты в строку и выдает на консоль. Для реального бота надо еще записать отправителя в переменную (чтобы ему отвечать), а может быть, разобрать сообщение глубже, чтобы сгенерировать ответ.&lt;br /&gt;
&lt;br /&gt;
===Помощь по ''Python''===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Версии ''Python''|Содержание=''Python 3.0'' уже доступен, но поскольку его код несовместим с прежними версиями, многие дистрибутивы по умолчанию все еще используют (и будут использовать в обозримом будущем) версии 2.х. Поэтому весь наш код в этой серии уроков совместим с 2.x, для удобства большинства читателей.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Если вы новичок в ''Python'', но имеете опыт программирования на других языках, трудностей у вас возникнуть не должно: главное – помните, что надо правильно делать отступы. На основном сайте ''Python'' имеется масса документации по особенностям языка и синтаксису, а также по использованию стандартных модулей, поставляемых вместе с ''Python''.&lt;br /&gt;
&lt;br /&gt;
===Командный голос===&lt;br /&gt;
&lt;br /&gt;
Для нашего простенького бота мы примем такой синтаксис: специальные команды будут начинаться с символа '''#'''. Получив сообщение, начинающееся с '''#''', мы попытаемся сделать что-нибудь; а в противном случае вернем произвольный ответ из припасенного списка.&lt;br /&gt;
&lt;br /&gt;
Добавление обработчика команд сделало бы код громоздким. Ради экономии места и умственных усилий применим трюк: используя конструкцию '''eval''' языка ''Python'', мы создадим функцию, вызывающую метод в нашем классе с тем же именем, что и команда, которая была нам передана. Это, конечно, отчасти халтура, но экономит место и облегчает добавление команд – вам останется только определить новый метод. Для бота более продвинутого вы, возможно, захотите вставить механизм обработчиков, чтобы к экземплярам класса можно было добавлять свои команды, но ниже показано, как работает метод попроще (заметим, что данный код – это метод класса)&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Редакторы ''Python''|Содержание=''Python'' строг насчет синтаксиса. Это не так плохо, но чревато проблемами, если вы пишете код в неподходящем редакторе. Мы использовали ''Vim'' и ''Kate'' – оба имеют выделение синтаксиса и другие функции для облегчения задачи создания работающего скрипта на ''Python''. Годится также ''Eric'', IDE на базе ''Python'', куда включено много других возможностей, специфичных для этого языка. Она доступна в большинстве дистрибутивов, и ее можно скачать с сайта http://eric-ide.python-projects.org/eric4-download.html.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 def messageparse(self, instance, message): &lt;br /&gt;
  m = message.getBody()&lt;br /&gt;
  sender=message.getFrom()&lt;br /&gt;
  if m[0]==’#’:&lt;br /&gt;
   self.log(‘command received’)&lt;br /&gt;
   #специальный случай&lt;br /&gt;
   #просто команда – подразумеваем, что метод существует, как и id отправителя&lt;br /&gt;
   try:&lt;br /&gt;
    getattr(self, m[1:])(sender)&lt;br /&gt;
   except:&lt;br /&gt;
    self.client.send((xmpp.protocol.Message(sender, ‘Sorry Dave, I can\’t do that...’)))&lt;br /&gt;
  else:&lt;br /&gt;
  #полагаю, надо сказать что-нибудь, из вежливости&lt;br /&gt;
   self.client.send((xmpp.protocol.Message(sender, random.choice(self.responses))))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видите, сообщение проверяется на наличие символа '''#''', и если он есть, мы создаем вызов метода по остатку строки, включая ID отправителя, и пытаемся выполнить его. Конструкции '''try''' и '''execept''' отлавливают исключения – например, несуществующий метод. Если команды нет, мы просто отправляем случайный ответ, выбрав его из списка '''responses'''. На самом деле, для этого нужно импортировать модуль '''random; random.choice''' случайным образом выбирает элемент из тех, что ему подсунули.&lt;br /&gt;
&lt;br /&gt;
Обработчик команд может быть таким:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 def uptime(self, sender):&lt;br /&gt;
  import subprocess&lt;br /&gt;
  p=subprocess.Popen([“uptime”], stdout=subprocess.PIPE)&lt;br /&gt;
  r=p.communicate()[0]&lt;br /&gt;
  self.client.send((xmpp.protocol.Message(sender,r)))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объясним его, потому что он работает с запуском команд локально, на компьютере, где выполняется бот. Сначала идет определение, которое принимает экземпляр объекта '''self''' (это требование ''Python'') и информацию об отправителе сообщения, добытую обработчиком. А потом мы импортируем '''subprocess''' из стандартных библиотек ''Python'', для запуска локальной команды.&lt;br /&gt;
&lt;br /&gt;
Кроме того, мы использовали метод под названием '''Popen''' (см. строку, начинающуюся с '''p=subprocess.Popen'''), который задокументирован и объяснен по адресу http://docs.python.org/library/subprocess.html. Вкратце, мы передаем команду для выполнения и требуем, чтобы стандартный вывод отсылался в определенное место. Тогда мы можем связаться с этим выводом, используя метод communicate экземпляра '''Popen''', и получить результат команды. Последняя строка запаковывает его и отправляет в виде чат-сообщения. Теперь вы можете делать запросы к вашему серверу через чат-клиент и заставлять его злодействовать!&lt;br /&gt;
&lt;br /&gt;
===Идем дальше===&lt;br /&gt;
&lt;br /&gt;
Полный код с комментариями для класса нашего чат-бота включен на '''LFXDVD'''. Если вы собираетесь запустить его, подставьте данные учетной записи вашего бота. А если вы импортируете его в качестве модуля, можете ввести данные об учетной записи и пароле просто через конструктор. Код нашего примера должен предоставить вам достаточно информации, поясняющей, как он работает.&lt;br /&gt;
&lt;br /&gt;
Возможно, вам захочется добавить к классу собственные методы для задания других команд: автоматизировать какие-нибудь задания или обратиться к внешним ресурсам – например, создать систему напоминаний, использующую онлайн-календарь. Или, почему бы не приткнуть вашего чат-бота к сервису переводов – включить его в беседу и заставить переводить все, что вы скажете, на другой язык?&lt;br /&gt;
&lt;br /&gt;
Чат-бот – всего лишь перевалочный пункт: легкий в использовании интерфейс, позволяющий обращаться к скрипту. Как вы трудоустроите своего чат-бота, зависит от вас, от того, на что вы его запрограммируете. Если придумаете другие способы его применения, пожалуйста, напишите нам; а если вы чего-то недопоняли – не забудьте просмотреть полный код на DVD. '''LXF'''&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF85:Java</id>
		<title>LXF85:Java</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF85:Java"/>
				<updated>2010-04-30T06:26:38Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Цикл/Java}}&lt;br /&gt;
=== Считалочки ===&lt;br /&gt;
''ЧАСТЬ 2: Мало сыграть свадьбу — надо еще научиться вести семейный бюджет, выполнять одну и ту же работу каждый день и принимать судьбоносные решения. '''Антон Черноусов''' продолжает учить монархическую чету премудростям Java.''&lt;br /&gt;
&lt;br /&gt;
В предыдущей статье были рассмотрены основы объектно-ориентированного языка программирования Java: инкапсуляция,&lt;br /&gt;
наследование, полиморфизм. Мы создали простое приложение, в котором женили короля на царевне Несмеяне.&lt;br /&gt;
&lt;br /&gt;
Сегодня мы поговорим о простых типах (числах), о ветвлениях, циклах, а также об исключениях.&lt;br /&gt;
&lt;br /&gt;
=== Простые числа и их братья ===&lt;br /&gt;
Итак, мы оставили нашу царевну Несмеяну в семейном гнезде, где она в скором времени добралась до казны государства. Ей пришлось&lt;br /&gt;
освоить нехитрую математику — отнимать и делить: ведь казна требует строго учета, и никакая программа не обходится без вычислений. Без них невозможно создать даже самую простую систему учета и контроля, а мадам необходимо наладить нетривиальный учет бюджетных средств.&lt;br /&gt;
&lt;br /&gt;
Для реализации арифметических операций в Java существует семь арифметических операторов, которые работают с любыми числовыми типами: сложение +, вычитание -, умножение *, деление /, остаток %, унарный минус -val и унарный плюс +val, а также шесть примитивных типов переменных для выполнения арифметических операций:&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
 !Тип переменной&lt;br /&gt;
 !Разрядность&lt;br /&gt;
 !Описание&lt;br /&gt;
 |-&lt;br /&gt;
 |Byte||align=&amp;quot;center&amp;quot;|8||Целое со знаком&lt;br /&gt;
 |-&lt;br /&gt;
 |Short||align=&amp;quot;center&amp;quot;|16||Целое со знаком&lt;br /&gt;
 |-&lt;br /&gt;
 |Int||align=&amp;quot;center&amp;quot;|32||Целое со знаком&lt;br /&gt;
 |-&lt;br /&gt;
 |Long||align=&amp;quot;center&amp;quot;|64||Целое со знаком&lt;br /&gt;
 |-&lt;br /&gt;
 |Float||align=&amp;quot;center&amp;quot;|32||Число с плавающей точкой&lt;br /&gt;
 |-&lt;br /&gt;
 |Double||align=&amp;quot;center&amp;quot;|64||Число с плавающей точкой&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Значение типов byte и short при выполнении вычислений переопределяется int, поэтому использование этих типов целесообразно для&lt;br /&gt;
хранения небольших значений для уменьшения объема используемой оперативной памяти.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int iA = 10;&lt;br /&gt;
byte bB = 12;&lt;br /&gt;
int iC = iA + bB;&lt;br /&gt;
System.out.println(&amp;quot;Сумма А и B = &amp;quot; + iC);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Выше приведен пример выполнения арифметической операции с использованием переменных различных типов. Результат — целое число типа int. Для преобразования типа переменной, например, в тип с более низкой разрядностью, необходимо воспользоваться специальными языковыми конструкциями:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
double dD = 10.2;&lt;br /&gt;
double dE = 12.23;&lt;br /&gt;
float fF = (float) (dD + dE);&lt;br /&gt;
System.out.println(fF);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Логика и выбор ===&lt;br /&gt;
Чтобы провести ревизию налоговой службы правильно, Несмеяне пришлось разобраться с налоговым кодексом, а там без поллитра и знаний логических операций не обойтись.&lt;br /&gt;
&lt;br /&gt;
Для представления логических значений в Java присутствует простой тип boolean, который принимает значения true или false. Для проведения различных логических операций можно использовать ниже перечисленные операторы:&lt;br /&gt;
&lt;br /&gt;
{| border = &amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
 !Тип операторов&lt;br /&gt;
 !Операторы&lt;br /&gt;
 |-&lt;br /&gt;
 |операторы отношений&lt;br /&gt;
 |align = &amp;quot;center&amp;quot;| &amp;lt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;gt; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;gt;= &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;= &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; instanceof&lt;br /&gt;
 |-&lt;br /&gt;
 |операторы равенства||align = &amp;quot;center&amp;quot;|== &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; !=&lt;br /&gt;
 |-&lt;br /&gt;
 |поразрядное И||align = &amp;quot;center&amp;quot;|&amp;amp;&lt;br /&gt;
 |-&lt;br /&gt;
 |поразрядное исключающее ИЛИ||align = &amp;quot;center&amp;quot;|^&lt;br /&gt;
 |-&lt;br /&gt;
 |поразрядное включающее ИЛИ||align = &amp;quot;center&amp;quot;|&amp;amp;#448;&lt;br /&gt;
 |-&lt;br /&gt;
 |логическое И||align = &amp;quot;center&amp;quot;|&amp;amp;&amp;amp;&lt;br /&gt;
 |-&lt;br /&gt;
 |логическое ИЛИ||align = &amp;quot;center&amp;quot;|&amp;amp;#449;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пока Несмеяна разбирается в дебрях налогового кодекса, мы для иллюстрации работы с логическими выражениями обратимся к методу&lt;br /&gt;
primeNumberCheckUp(int numberForCheck), который выясняет, является ли переданное ему число простым.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private boolean primeNumberCheckUp(int numberForCheck) {&lt;br /&gt;
  boolean result = true;&lt;br /&gt;
  if (numberForCheck != 1 || numberForCheck != 2 || numberForCheck != 3) {&lt;br /&gt;
    for (int currentNumber = 2; currentNumber &amp;lt; numberForCheck; currentNumber++) {&lt;br /&gt;
      if (numberForCheck % currentNumber == 0) {&lt;br /&gt;
        result = false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В primeNumberCheckUp использованы две замечательные конструкции: оператор выбора по условию или условный оператор, и цикл.&lt;br /&gt;
Условный оператор if имеет следующий синтаксис:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
if (логическое выражение) {&lt;br /&gt;
           операторы группы 1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
           операторы группы 2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В вышеописанном методе использована упрощенная конструкция (без else), а для вычисления логического выражения использованы&lt;br /&gt;
операторы: != (не равно) и || (логическое «или»). В полной конструкции в случае истинности логического выражения выполняются операторы группы 1, иначе — группы 2.&lt;br /&gt;
&lt;br /&gt;
Вместо if для управления выполнением кода может быть использована специальная конструкция switch. В рамках этой конструкции&lt;br /&gt;
вычисляется целочисленное выражение, и в соответствии с полученным результатом ведется поиск соответствующего значения блока&lt;br /&gt;
case.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int flag = 6;&lt;br /&gt;
switch (flag) {&lt;br /&gt;
  case 1: {&lt;br /&gt;
    System.out.println(&amp;quot;Царевна в спальне №1&amp;quot;);&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
  case 5: {&lt;br /&gt;
    System.out.println(&amp;quot;Царевна в спальне №5&amp;quot;);&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
  default: {&lt;br /&gt;
    System.out.println(&amp;quot;Кто тут знает, где царевна?&amp;quot;);&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Обратите внимание на оператор break, который обеспечивает немедленный выход из любого блока, а в примере выше прекращает дальнейшую обработку операторов конструкции switch, а также на блок операторов default — этот блок необязательный, он выполняется в случае, если выражение, удовлетворяющие условию, не было найдено среди case.&lt;br /&gt;
&lt;br /&gt;
=== Циклы ===&lt;br /&gt;
Разобравшись, как все устроено в королевстве, Несмеяна поняла, что все подчиняется принципу «Украл, выпил, в тюрьму» — точнее, во Дворец до следующего месяца. По кругу.&lt;br /&gt;
&lt;br /&gt;
Для реализации «кругового» процесса в Java существует три вида циклов: for, while и do-while. С циклом for мы уже вы встречались в методе primeNumberCheckUp, продемонстрированном ранее, синтаксис этой конструкции следующий:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
for (инициализация; логическое выражение; приращение) {&lt;br /&gt;
           операторы;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В рамках инициализации производится объявление и установка значений временных переменных. Цикл выполняется до тех пор, пока&lt;br /&gt;
логическое выражение истинно. На каждой итерации цикла производится приращение временных переменных.&lt;br /&gt;
&lt;br /&gt;
Две другие конструкции циклов можно назвать однояйцевыми близнецами, если бы не маленькое отличие в их использовании. При&lt;br /&gt;
использования цикла while проверка условия осуществляется до выполнения блока операторов, а в конструкции do-while — после него, то есть действия внутри цикла отрабатывают хотя бы раз. Например, процесс одиночной попойки короля от счастья, что он женат, на языке Java можно описать так:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int i = 100;&lt;br /&gt;
while (i &amp;gt; 0) {&lt;br /&gt;
  System.out.println(i + &amp;quot; бутылок пива стояло на столе, одну уговорил&amp;quot;);&lt;br /&gt;
  i--;&lt;br /&gt;
}&lt;br /&gt;
System.out.println(&amp;quot;Все выпил, да!&amp;quot;);&lt;br /&gt;
int tankard = 1;&lt;br /&gt;
int allTankards = 10;&lt;br /&gt;
do {&lt;br /&gt;
  System.out.println(tankard + &amp;quot; стакан помыт&amp;quot;);&lt;br /&gt;
  tankard++;&lt;br /&gt;
}&lt;br /&gt;
while (tankard &amp;lt;= allTankards);&lt;br /&gt;
System.out.println(&amp;quot;Ну вот и все стаканы помыл&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Для организации хранения однотипных данных в Java можно использовать массивы. Массивом называется структура данных, которая&lt;br /&gt;
позволяет хранить несколько значений в одной переменной (определение расплывчатое, но суть передает верно). Объявить массив можно несколькими способами, но я предпочитаю следующий как наиболее логичный:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[] arrayName = new int[length]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом int — это тип переменных массива, а length — его размерность (число элементов). После того, как массив создан,&lt;br /&gt;
значения всех переменных равны null.&lt;br /&gt;
&lt;br /&gt;
Многомерный массив — это обыкновенный массив, элементами которого являются массивы, причем совсем не требуется, чтобы они&lt;br /&gt;
имели одинаковую размерность, например:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[][] arrayName = new int[2][];&lt;br /&gt;
arrayName[0] = new int[5];&lt;br /&gt;
arrayName[1] = new int[2];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В некоторых задачах требуется создать массив, состоящий из произвольных чисел. Генерация произвольных чисел возможна благодаря&lt;br /&gt;
классу Random, который входит в пакет java.util. К слову, пакеты — это иерархически именованные контейнеры, применяемые для изолирования имен классов в некотором пространстве имен, то есть пакеты применяются во избежание конфликтов с именами классов.&lt;br /&gt;
&lt;br /&gt;
Подключение класса Random к программе происходит при использовании зарезервированного слова import и команды import java.util.Random; традиционно объявляемой в начале файла, содержащего разрабатываемый класс.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
public class RandomGenerator {&lt;br /&gt;
  private static Random random = new Random();&lt;br /&gt;
  private int base;&lt;br /&gt;
  public RandomGenerator(int base) {&lt;br /&gt;
    this.base = base;&lt;br /&gt;
  };&lt;br /&gt;
  public RandomGenerator() {&lt;br /&gt;
    this.base = Math.abs(random.nextInt());&lt;br /&gt;
  };&lt;br /&gt;
  public int getInt(){&lt;br /&gt;
    return random.nextInt(this.base);&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Далее, приведенный код позволяет сгенерировать массив псевдослучайных чисел с использованием класса RandomGenerator, код&lt;br /&gt;
которого приведен выше:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int[] newArray = new int[100];&lt;br /&gt;
RandomGenerator currentRG = new RandomGenerator(500);&lt;br /&gt;
for (int currentNumber = 0; currentNumber &amp;lt; 100; currentNumber++) {&lt;br /&gt;
  newArray[currentNumber] = currentRG.getInt();&lt;br /&gt;
  System.out.println(&amp;quot;newArray[&amp;quot; + currentNumber + &amp;quot;] = &amp;quot; + newArray[currentNumber]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Иногда невозможно установить точное количество элементов в массиве, в таком случае на помощь приходят динамические массивы ArrayList. ArrayList — это класс, который входит в Collection API. Объекты, созданные на основе ArrayList, более ресурсоемки. Давайте посмотрим на работу динамических массивов на примере задачи по поиску всех простых чисел в диапазоне от 1 до N:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
private Integer[] getAllPrimeNumbers (int numberForCheck){&lt;br /&gt;
  ArrayList primeNumbers = new ArrayList();&lt;br /&gt;
  for (int currentNumber = 1; currentNumber &amp;lt;= numberForCheck; currentNumber++) {&lt;br /&gt;
    if (this.primeNumberCheckUp(currentNumber)) {&lt;br /&gt;
      primeNumbers.add(currentNumber);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  Integer[] result = (Integer[]) primeNumbers.toArray(new Integer[0]);&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public int[] getIntArray(){&lt;br /&gt;
  Integer[] arrayOfPrimeNumbers = (Integer[]) GetAllPrimeNumder(this.number);&lt;br /&gt;
    int[] result = new int[arrayOfPrimeNumbers.length];&lt;br /&gt;
    for (int currentNumber = 0; currentNumber&amp;lt;resault.length; currentNumber++){&lt;br /&gt;
      result[currentNumber] = arrayOfPrimeNumbers[currentNumber].intValue();&lt;br /&gt;
    }&lt;br /&gt;
    return resault;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
public Integer[] getIntegerArray(){&lt;br /&gt;
  return this.GetAllPrimeNumder(this.number);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В getAllPrimeNumder формируется динамический массив primeNumbers — объект класса ArrayList (для его использования необходимо подключить пакет java.util.ArrayList). Добавление нового объекта в динамический массив производится методом add(Object). После того, как динамический массив сформирован, из него извлекается простой массив методом toArray(Object[]). Обратите внимание, что из ArrayList извлекается массив объектов типа Integer, несмотря на то, что в него помещаются переменные типа int. Для получения массива состоящего из переменных типа int используется метод getIntArray().&lt;br /&gt;
&lt;br /&gt;
Динамические массивы, как правило, используют лишь до тех пор, пока не установлено точное количество элементов, так как скорость работы с простым массивом выше и обработка простого массива менее трудоемка.&lt;br /&gt;
&lt;br /&gt;
Для логического завершения работы с простыми числами включим ранее описанные методы (primeNumberCheckUp, getAllPrimeNumder,&lt;br /&gt;
getIntArray(), getIntegerArray()) в представленный далее класс ArrayOfPrimeNumbers.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
public class ArrayOfPrimeNumbers {&lt;br /&gt;
  private int number;&lt;br /&gt;
&lt;br /&gt;
  public ArrayOfPrimeNumber(int number) {&lt;br /&gt;
    this.number = number;&lt;br /&gt;
  }&lt;br /&gt;
  public int getNumber() {&lt;br /&gt;
    return number;&lt;br /&gt;
  }&lt;br /&gt;
  public void setNumber(int number) {&lt;br /&gt;
    this.number = number;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Класс, в зависимости от вызываемого метода, возвращает массив, состоящий из элементов int или Integer.&lt;br /&gt;
&lt;br /&gt;
=== Куча хлама ===&lt;br /&gt;
Вернемся к нашей Несмеяне. Так как королевство ей досталось, прямо скажем, маленькое, пришлось ей еще и за порядком следить, что значит знать, где и что. Здесь ей помог HashMap — такая интересная структура для хранения данных, класс который входит в '''java.util.''' Экземпляры класса HashMap позволяют хранить различные именованные объекты, которые хранятся в виде пар «ключ — значение». Снаружи объекта типа HashMap нельзя узнать (как в хорошем бардаке), что же там лежит, однако, зная ключ, можно получить то, что ищешь, ну а если ключ неизвестен, то необходимо начать разбирать бардак до тех пор, пока не будет найдено то, что требуется. HashMap часто используется для хранения параметров системы. Как царевна разбирала бардак&lt;br /&gt;
мужа с помощью HashMap, можно посмотреть ниже.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
HashMap sameHeap = new HashMap();&lt;br /&gt;
sameHeap.put(&amp;quot;Key1&amp;quot;, &amp;quot;Левый носок&amp;quot;);&lt;br /&gt;
sameHeap.put(&amp;quot;Key2&amp;quot;, &amp;quot;Грязная футболка&amp;quot;);&lt;br /&gt;
sameHeap.put(&amp;quot;Key3&amp;quot;, &amp;quot;Правый носок&amp;quot;);&lt;br /&gt;
String sameObj = (String) sameHeap.get(&amp;quot;Key1&amp;quot;);&lt;br /&gt;
System.out.println(&amp;quot;Key1 = &amp;quot; + sameObj);&lt;br /&gt;
Map.Entry entry = null;&lt;br /&gt;
Iterator it = sameHeap.entrySet().iterator();&lt;br /&gt;
while (it.hasNext()) {&lt;br /&gt;
  entry = (Map.Entry) it.next();&lt;br /&gt;
  System.out.println(&amp;quot;For key = &amp;quot; + entry.getKey() + &amp;quot; value = &amp;quot; + entry.getValue());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для компиляции понадобится подключить java.util.HashMap, java.util.Iterator, java.util.Map — это можно сделать с помощью всего одной строкой вместо трех — import java.util.*;.&lt;br /&gt;
&lt;br /&gt;
Как вы можете убедиться, для помещения объекта в HashMap необходимо использовать метод put, где первым параметром будет ключ, а&lt;br /&gt;
вторым — ассоциируемый с ним объект. Извлечение объекта возможно с помощью метода get при передаче ключа или с помощью последовательного перебора записей в HashMap.&lt;br /&gt;
&lt;br /&gt;
После выполнения кода вы можете увидеть, что элементы в куче лежат не в том порядке, в котором вы их туда кинули (как в жизни, и не только короля). Порядок элементов в коллекции также может меняться во времени. HashMap обеспечивает постоянное время доступа для операций put и get. Как для ключей, так и для элементов допускаются значения типа null.&lt;br /&gt;
&lt;br /&gt;
=== Пятый угол ===&lt;br /&gt;
В хорошо написанной программе, как и в сказочном королевстве, все должно идти своим чередом, но непредвиденные ситуации все равно бывают, так как программа соприкасается с внешним миром (другими программами, файлами, пользователями). Для решения непредвиденных ситуаций в Java существуют исключения и специальные операторы позволяющие отловить и обработать их.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
try{&lt;br /&gt;
  // небезопасный код&lt;br /&gt;
} catch(Exception e) {&lt;br /&gt;
  // обработка исключительной ситуации&lt;br /&gt;
} finally {&lt;br /&gt;
  // гарантированно выполняющийся блок&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Выше представлена структура, с помощью которой производится обработка исключительных ситуаций: в блоке try производятся&lt;br /&gt;
потенциально опасные операции, а в блоке catch производится обработка возникшего исключения (блоков catch может быть несколько). Под блоком подразумевается последовательность операторов, объявлений локальных классов или локальных переменных, заключенных в фигурные скобки. Область видимости локальных переменных и классов ограничена блоком, в котором они определены.&lt;br /&gt;
&lt;br /&gt;
Иногда дополнительно, вне зависимости от того, как будет выполнен блок try, необходимо, чтобы выполнились какие-либо действия&lt;br /&gt;
(например, освобождение ресурсов), тогда используют оператор finally, который обеспечивает гарантированное выполнение указанного блока операторов.&lt;br /&gt;
&lt;br /&gt;
Исключительная ситуация может быть сгенерирована виртуальной машиной Java, а также программистом. Исключение «выбрасывается»&lt;br /&gt;
с помощью оператора throw.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public float calculate(int sameA, int sameB) throws Exception {&lt;br /&gt;
  float result;&lt;br /&gt;
  if (sameB != 0) {&lt;br /&gt;
    result = sameA / sameB;&lt;br /&gt;
  } else&lt;br /&gt;
    throw new Exception(&amp;quot;Параметр для вычисления не должен быть равным нулю&amp;quot;);&lt;br /&gt;
  return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Предложенный метод обеспечивает деление, а так как Царевна и король никогда не делят на ноль, они все делят поровну, то с помощью оператора throw порождается исключение в случае неправильно введенных данных. Это исключение можно «отловить» с помощью catch по месту использования метода.&lt;br /&gt;
&lt;br /&gt;
Жизнь царевны и короля изменилась: пришлось осваивать азы науки и знакомиться с простыми типами (чисел), разбираться в ветвлениях налогового кодекса, использовать все три типа циклов, а также усвоить исключения. Оставим их осмыслять все это до [[LXF86:Java|следующего номера…]]&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF102:Flash-%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B8</id>
		<title>LXF102:Flash-карточки</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF102:Flash-%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B8"/>
				<updated>2010-03-09T06:33:09Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Цикл/Программирование}}&lt;br /&gt;
== Кодируем: Flash-карточки ==&lt;br /&gt;
: ''ЧАСТЬ 2 Улучшите навыки программиста и выучите иностранный язык – помогут '''Майк Сондерс''' и ваш собственный инструмент для показа всплывающих карточек...''&lt;br /&gt;
&lt;br /&gt;
Одна из причин нашей любви к компьютерам – их способность просто работать. Конечно, устройства могут ломаться,&lt;br /&gt;
а программы – содержать ошибки, но когда все в порядке,&lt;br /&gt;
ваши данные не исчезнут как по волшебству. Если вы загрузите, скажем, норвежский словарь, ваш ПК без возражений сохранит его для&lt;br /&gt;
последующих вызовов. ПК не будет уставать или пытаться изучить&lt;br /&gt;
другой язык; не сможет он и упиться до полного забвения места, куда&lt;br /&gt;
вчера записал данные. Он не поссорится с ПК-дамой и не уничтожит&lt;br /&gt;
ее файлы на почве ревности. В целостной системе данные всегда&lt;br /&gt;
под рукой.&lt;br /&gt;
&lt;br /&gt;
Однако здесь, в царстве людей, мы постоянно боремся с недочетами и изворотами нашей мысли. Мы вечно все забываем, меняем свое&lt;br /&gt;
мнение – короче, лучше бы наш мозг походил на ОЗУ, а не на серые&lt;br /&gt;
комки органики. Всего очевиднее это при изучении иностранного языка: компьютер хранит миллионы слов и никогда их не «забывает», а мы&lt;br /&gt;
с трудом припоминаем, как по-английски «встреча», даже если использовали это слово вчера. Спасибо, мозг.&lt;br /&gt;
&lt;br /&gt;
Итак, проект кодирования этого месяца – создание программы&lt;br /&gt;
всплывающих карточек (flash-карт), которая помогает запоминать&lt;br /&gt;
иностранные слова. Она отображает английские слова и просит вас&lt;br /&gt;
выбрать их русский эквивалент из списка трех, случайным образом&lt;br /&gt;
выбранных, слов, начисляя вам очки по мере вашего прогресса. Но&lt;br /&gt;
она не ограничивается только английским и пригодится для любого&lt;br /&gt;
языка, или вообще для всего, что нужно изучить! Вы сможете даже&lt;br /&gt;
настроить ее на отображение названий животных: пусть спросит вас&lt;br /&gt;
об их виде.&lt;br /&gt;
&lt;br /&gt;
=== Новый опыт Python ===&lt;br /&gt;
На LXFDVD прошлого месяца была опубликована подшивка LXF за&lt;br /&gt;
2005–2007 года; помимо прочего, в ней можно найти и учебник по&lt;br /&gt;
языку Python (выпуски [[LXF74-75:Python|74/75]]–[[LXF83:Python|83]]). Не пугайтесь, если вы пропустили&lt;br /&gt;
прошлый номер или никогда не писали на Python: в нем очень легко&lt;br /&gt;
разобраться. Если вы знакомы хоть с одним языком программирования, то не встретите проблем при работе с этим кодом.&lt;br /&gt;
&lt;br /&gt;
Наше приложение flash-карт должно будет читать текстовые файлы&lt;br /&gt;
и генерировать случайные числа. Открытие файлов в Python – плевое&lt;br /&gt;
дело: создайте новый текстовый файл с именем foo.txt, вбейте в него&lt;br /&gt;
несколько слов (по одному в строке) и сохраните в домашнем каталоге.&lt;br /&gt;
Теперь создайте файл с именем test.py, также в домашнем каталоге, со&lt;br /&gt;
следующим содержимым:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;file = open(‘foo.txt’, ‘r’)&lt;br /&gt;
print file.readlines()&amp;lt;/source&amp;gt;&lt;br /&gt;
Для запуска этого Python-скрипта откройте терминал и введите:&lt;br /&gt;
 python test.py&lt;br /&gt;
Этот код открывает foo.txt (‘r’ означает «только для чтения») и связывает его содержимое с новым объектом по имени file.&lt;br /&gt;
&lt;br /&gt;
Во второй строке кода мы вызываем readlines() нашего объекта file,&lt;br /&gt;
который сканирует foo.txt и сохраняет его строки как элементы массива.&lt;br /&gt;
При его печати на экране мы увидим:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;[‘hello\n’, ‘banana\n’, ‘cupcake\n’]&amp;lt;/source&amp;gt;&lt;br /&gt;
Понятно, слова будут те, которые вы ввели в foo.txt. Но отсюда видно, как Python получает текст из файла и выводит элементы массива&lt;br /&gt;
через запятую. Ну, хорошо; а если мы хотим нормально отобразить&lt;br /&gt;
текст файла?&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;file = open(‘foo.txt’, ‘r’)&lt;br /&gt;
for line in file:&lt;br /&gt;
 print line&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот код выводит все строки из foo.txt. Заметьте, что отступы в&lt;br /&gt;
Python важны – табуляция перед print line говорит о том, что этот код&lt;br /&gt;
выполняется внутри цикла for. Конкретно этот цикл for говорит: для&lt;br /&gt;
(for) каждой строки открытого нами файла, напечатать ее, и так до&lt;br /&gt;
конца файла.&lt;br /&gt;
&lt;br /&gt;
Итак, мы теперь можем получать текст из файлов и использовать&lt;br /&gt;
списки слов для наших flash-карточек. Но надо сделать еще кое-что:&lt;br /&gt;
наша программа должна отобразить список возможных ответов при&lt;br /&gt;
выводе слова. Кроме того, было бы крайне бесполезно, если бы верным ответом был всегда первый! Поэтому в нашей программе мы собираемся отображать три возможных ответа, один из которых правильный. Вот как получить случайные числа:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;import random&lt;br /&gt;
a = random.randint(1, 5)&lt;br /&gt;
b = random.randint(30, 100)&lt;br /&gt;
print a, b&amp;lt;/source&amp;gt;&lt;br /&gt;
Первая строка говорит Python, что мы хотим использовать его генератор случайных чисел. После этого мы создаем две переменные: a и&lt;br /&gt;
b, и присваиваем им случайные значения стандартной подпрограммой&lt;br /&gt;
Python random.randint(). Мы указываем диапазон значений – для переменной a это будет число от 1 до 5 (включительно). Для b – число между 30 и 100. Легко!&lt;br /&gt;
&lt;br /&gt;
=== Создаем flashcard.py 1.0 ===&lt;br /&gt;
[[Изображение:LXF102 69 1.png|thumb|Первая инкарнация нашей программы flash-карт – простой текстовый вариант.]]&lt;br /&gt;
Давайте поработаем с программой. Нам понадобятся два текстовых&lt;br /&gt;
файла: в одном – английские слова, в другом – соответствующие&lt;br /&gt;
русские. (Или, например, в одном файле могут быть названия стран,&lt;br /&gt;
а во втором – названия их столиц.) Важно, чтобы оба файла имели&lt;br /&gt;
одинаковое число строк и соответствие слов для каждой их пары.&lt;br /&gt;
Если вы используете названия столиц и седьмая строка первого файла – это «Япония», то седьмая строка второго файла должна содержать&lt;br /&gt;
«Токио». Иначе ответы не подойдут!&lt;br /&gt;
&lt;br /&gt;
Итак, создадим два текстовых файла в домашнем каталоге и введем по десять слов в каждый из них, по одному в строке. В нашем примере, первый файл называется english.txt и содержит слова ‘Thanks,&lt;br /&gt;
word, job’ и т.д.; второй файл называется russian.txt и содержит ‘спасибо, слово, работа’ и т.д. Теперь нам необходим код на Python, чтобы&lt;br /&gt;
работать с этими текстовыми файлами в домашнем каталоге – и вот&lt;br /&gt;
вам листинг. Он есть на нашем DVD (flashcard.py в разделе Magazine/CodeProject), но пока просто пробегитесь по нему...&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;# -*- coding: utf_8 -*-&lt;br /&gt;
import os, random&lt;br /&gt;
count = 0&lt;br /&gt;
score = 0&lt;br /&gt;
file1 = open(‘english.txt’, ‘r’)&lt;br /&gt;
file2 = open(‘russian.txt’, ‘r’)&lt;br /&gt;
f1content = file1.readlines()&lt;br /&gt;
f2content = file2.readlines()&lt;br /&gt;
while count &amp;lt; 10:&lt;br /&gt;
os.system(‘clear’)&lt;br /&gt;
wordnum = random.randrange(len(f1content))&lt;br /&gt;
print ‘Слово:’, f1content[wordnum], ‘’&lt;br /&gt;
options = [random.randrange(len(f2content)),&lt;br /&gt;
random.randrange(len(f2content)),&lt;br /&gt;
random.randrange(len(f2content))]&lt;br /&gt;
options[random.randrange(3)] = wordnum&lt;br /&gt;
print ‘1 -’, f2content[options[0]],&lt;br /&gt;
print ‘2 -’, f2content[options[1]],&lt;br /&gt;
print ‘3 -’, f2content[options[2]],&lt;br /&gt;
answer = input(‘\n Ваш выбор:’)&lt;br /&gt;
if options[answer-1] == wordnum:&lt;br /&gt;
raw_input(‘\n Верно! Нажмите enter...’)&lt;br /&gt;
score += 1&lt;br /&gt;
else:&lt;br /&gt;
raw_input(‘\n Неверно! Нажмите enter...’)&lt;br /&gt;
count += 1&lt;br /&gt;
print ‘\n Набрано очков:’, score&amp;lt;/source&amp;gt;&lt;br /&gt;
При наличии flashcard.py, russian.txt и english.txt в вашем домашнем&lt;br /&gt;
каталоге откройте терминал и введите python flashcard.py. Вы увидите,&lt;br /&gt;
что программа отображает английское слово, а ниже – три возможных&lt;br /&gt;
русских эквивалента. Эти эквиваленты пронумерованы, и если вы считаете, что верный ответ – это 3, просто нажмите 3, а затем Enter. После&lt;br /&gt;
этого программа скажет вам, правы вы или ошибаетесь – всего будет&lt;br /&gt;
задано десять вопросов.&lt;br /&gt;
&lt;br /&gt;
Давайте рассмотрим код более детально. Мы начали строкой с&lt;br /&gt;
import [Русская версия скрипта начинается с указания используемой&lt;br /&gt;
в системе кодировки, в противном случае программа не будет выполняться, – прим. пер.], которая говорит Python, какие возможности&lt;br /&gt;
мы собираемся использовать. В нашем случае необходимо вызывать&lt;br /&gt;
функцию ОС (для очистки экрана) и генерировать случайные числа.&lt;br /&gt;
Затем мы описываем две переменные, count и score – первая используется для отображения десяти вопросов, а вторая запоминает число&lt;br /&gt;
верных ответов. Далее идет:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;file1 = open(‘english.txt’, ‘r’)&lt;br /&gt;
file2 = open(‘russian.txt’, ‘r’)&lt;br /&gt;
f1content = file1.readlines()&lt;br /&gt;
f2content = file2.readlines()&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь мы открываем два файла и связываем их с двумя переменными с именами file1 и file2. Эти переменные – вроде дескрипторов&lt;br /&gt;
этих файлов: они представляют файлы, сохраненные в памяти. Но нам&lt;br /&gt;
не нужны просто сами файлы; нам необходимо их содержимое, поэтому следующие две строки кода по кусочкам переносят реальный текст&lt;br /&gt;
в два массива с именами f1content и f2content. Теперь у нас есть список&lt;br /&gt;
английских слов в f1content и список русских слов в f2content. Затем&lt;br /&gt;
начинается основной цикл программы:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;while count &amp;lt; 10:&lt;br /&gt;
os.system(‘clear’)&lt;br /&gt;
wordnum = random.randrange(len(f1content))&lt;br /&gt;
print ‘Слово:’, f1content[wordnum], ‘’&amp;lt;/source&amp;gt;&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Скорая помощь&lt;br /&gt;
|Содержание=Если при ваших&lt;br /&gt;
экспериментах&lt;br /&gt;
с кодом Python&lt;br /&gt;
программа&lt;br /&gt;
зациклилась,&lt;br /&gt;
ее можно снять&lt;br /&gt;
из терминала, нажав&lt;br /&gt;
Ctrl+C. Вам может&lt;br /&gt;
понадобиться сделать&lt;br /&gt;
это пару раз,&lt;br /&gt;
особенно если&lt;br /&gt;
ваша программа&lt;br /&gt;
ждет ввода&lt;br /&gt;
от пользователя.&lt;br /&gt;
Если ваша&lt;br /&gt;
программа все-таки&lt;br /&gt;
не останавливается,&lt;br /&gt;
наберите в терминале&lt;br /&gt;
ps ax, найдите номер&lt;br /&gt;
процесс Python&lt;br /&gt;
вашего скрипта&lt;br /&gt;
и введите kill -9&lt;br /&gt;
&amp;lt;number&amp;gt;. Это&lt;br /&gt;
команда абсолютного&lt;br /&gt;
останова программы&lt;br /&gt;
|Ширина=200px}}&lt;br /&gt;
Мы хотим задать десять вопросов, то есть выполнить весь код с&lt;br /&gt;
отступом десять раз (переменная-счетчик каждый раз увеличивается). Первая строка этого цикла очищает экран, вызывая стандартную&lt;br /&gt;
утилиту /usr/bin/clear, а затем мы отображаем случайное слово. Мы&lt;br /&gt;
говорим: wordnum должно принять случайное значение, представляющее строку в файле слов, так что дай мне число между нулем и&lt;br /&gt;
размером файла (в строках). Хотя файл слов может иметь строки от&lt;br /&gt;
первой до десятой, массивы нумеруются с нуля, вот почему мы берем&lt;br /&gt;
случайное число от нуля до числа строк в файле минус один. То есть&lt;br /&gt;
строка один в f1content (english.txt) – на самом деле нулевой элемент&lt;br /&gt;
массива, а строка десять – девятый. Затем мы отображаем слово из&lt;br /&gt;
файла english.txt.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;options = [random.randrange(len(f2content)),&lt;br /&gt;
random.randrange(len(f2content)),&lt;br /&gt;
random.randrange(len(f2content))]&lt;br /&gt;
options[random.randrange(3)] = wordnum&amp;lt;/source&amp;gt;&lt;br /&gt;
Далее создается массив трех возможных ответов с именем&lt;br /&gt;
options. Мы задаем для каждого ответа случайное число, ограниченное сверху числом строк в f2content (russian.txt). Теперь у нас есть&lt;br /&gt;
три случайных русских слова – но стойте, одно из них должно быть&lt;br /&gt;
верным, ведь так? Иначе получится три неверных ответа! Так что&lt;br /&gt;
положим один из ответов в options равным wordnum – то есть верному. И вместо того, чтобы верный ответ всегда был, скажем, первым,&lt;br /&gt;
мы размещаем его в случайное место в списке из трех возможных&lt;br /&gt;
ответов.&lt;br /&gt;
&lt;br /&gt;
Оставшийся код понять очень просто. Он печатает на экране три&lt;br /&gt;
возможных ответа затем запрашивает ответ у пользователя – то&lt;br /&gt;
есть ввод 1, 2 или 3. Когда пользователь вводит ответ, мы проверяем, соответствует ли&lt;br /&gt;
он верному слову. То&lt;br /&gt;
есть, если русское слово – «спасибо» и номер&lt;br /&gt;
варианта thanks – «2»,&lt;br /&gt;
когда пользователь вводит 2, наша программа&lt;br /&gt;
говорит: «Ах! Вариант&lt;br /&gt;
два является седьмым&lt;br /&gt;
в файле русских слов. И истинный номер ответа wordnum также&lt;br /&gt;
равен семи, так что все верно! Слова совпадают.» В точку.&lt;br /&gt;
&lt;br /&gt;
=== Версия с картинками ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=PyGame умеет больше&lt;br /&gt;
|Содержание=Наша вторая программа для flash-карт лишь поверхностно&lt;br /&gt;
очертила то, что можно сделать с PyGame (http://www.pygame.org).&lt;br /&gt;
Данная библиотека предоставляет множество инструментов&lt;br /&gt;
для загрузки изображений, перемещения спрайтов, работы&lt;br /&gt;
с клавиатурой/мышью и воспроизведения звуковых эффектов.&lt;br /&gt;
Это популярный выбор программистов игр с открытым кодом;&lt;br /&gt;
примеры того, что можно сделать, см. на http://www.pygame.org/tags/arcade.&lt;br /&gt;
&lt;br /&gt;
А главное, PyGame имеет обширную документацию, включая&lt;br /&gt;
учебники для абсолютных новичков и детальный справочник API.&lt;br /&gt;
По адресу http://www.pygame.org/docs вы найдете учебники,&lt;br /&gt;
описывающие с нуля, как инициализировать PyGame,&lt;br /&gt;
перемещать спрайты и использовать пиксельные эффекты.&lt;br /&gt;
[[Изображение:LXF102 71 1.png|thumb|300px|PyGame не ограничивается видеоиграми – вы можете использовать ее и для создания медиа-проигрывателя.]]&lt;br /&gt;
|Ширина=400px}}&lt;br /&gt;
Теперь у нас есть текстовый инструмент flash-карт, превосходный для&lt;br /&gt;
множества применений, а как насчет графической версии? Допустим,&lt;br /&gt;
картинка с животным и три возможных названия – идеально для детей.&lt;br /&gt;
А может, вы захотите нарисовать национальные флаги – кстати, именно это мы и собираемся сделать. Как и прежде, программу можно преобразовать во что угодно, использующее слова и картинки: блюда и их&lt;br /&gt;
названия на испанском, фотографии звезд и их имена...&lt;br /&gt;
&lt;br /&gt;
Для этого необходимо выйти за границы командной строки и воспользоваться графическим слоем. К счастью, у нас есть прекрасный&lt;br /&gt;
выбор для нашего Python-приключения: PyGame, библиотека, связывающая Python с популярным медиа-слоем SDL. PyGame позволяет&lt;br /&gt;
создавать окна и отображать соответствующие картинки на экране,&lt;br /&gt;
причем с минимумом усилий. Собственно, большая часть кода останется той же – надо только заставить отображаться вместо текста&lt;br /&gt;
картинки.&lt;br /&gt;
&lt;br /&gt;
Наша первая версия flashcard.py использовала два текстовых файла с соответствиями слов, а эта графическая инкарнация будет использовать соответствия слов и картинок. То есть file1.txt может содержать&lt;br /&gt;
«Непал, Канада, Финляндия...», а file2.txt – ‘nepalflag.png, canadaflag.png,&lt;br /&gt;
finlandflag.png...’ и так далее. Слова будем получать из file1, а картинки&lt;br /&gt;
для отображения – из file2.&lt;br /&gt;
&lt;br /&gt;
Код для этого выйдет более длинный, и чтобы зря не тратить место,&lt;br /&gt;
мы приведем здесь лишь основную часть. Но это большая часть, и она&lt;br /&gt;
вам покажет, как работает графическая версия. На нашем DVD в разделе Magazine/CodeProject/Graphical имеется полный листинг кода со&lt;br /&gt;
множеством комментариев (обозначенных символом #).&lt;br /&gt;
&lt;br /&gt;
Заметьте, что перед запуском программы необходимо установить библиотеку PyGame: большинство дистрибутивов имеют ее&lt;br /&gt;
в своих репозиториях (поищите в вашем менеджере пакетов), но&lt;br /&gt;
если это не так, исходный код вы найдете в разделе Разработка&lt;br /&gt;
нашего DVD.&lt;br /&gt;
&lt;br /&gt;
Вот наш основной кусок кода. Здесь есть несколько новых элементов, но, в типичной манере Python, по большей части все самодокументировано – открываем файл изображения, рисуем его на экране в&lt;br /&gt;
указанной позиции, и все.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;init()&lt;br /&gt;
screen = display.set_mode((640, 480))&lt;br /&gt;
display.set_caption(‘Flashcard’)&lt;br /&gt;
font = font.Font(None, 48)&lt;br /&gt;
while count &amp;lt; 10:&lt;br /&gt;
screen.fill(0)&lt;br /&gt;
wordnum = random.randrange(len(f2content))&lt;br /&gt;
mainpic = image.load(f2content[wordnum].rstrip(‘\n’))&lt;br /&gt;
screen.blit(mainpic, (255, 50))&lt;br /&gt;
options = [random.randrange(len(f1content)),&lt;br /&gt;
random.randrange(len(f1content)),&lt;br /&gt;
random.randrange(len(f1content))]&lt;br /&gt;
options[random.randrange(3)] = wordnum&lt;br /&gt;
text1 = font.render(‘1 - ‘ + f1content[options[0]].rstrip(‘\n’),&lt;br /&gt;
True, (255, 255, 255))&lt;br /&gt;
text2 = font.render(‘2 - ‘ + f1content[options[1]].rstrip(‘\n’),&lt;br /&gt;
True, (255, 255, 255))&lt;br /&gt;
text3 = font.render(‘3 - ‘ + f1content[options[2]].rstrip(‘\n’),&lt;br /&gt;
True, (255, 255, 255))&lt;br /&gt;
screen.blit(text1, (30, 200))&lt;br /&gt;
screen.blit(text2, (30, 300))&lt;br /&gt;
screen.blit(text3, (30, 400))&lt;br /&gt;
display.update()&amp;lt;/source&amp;gt;&lt;br /&gt;
Первые четыре строки кода говорят PyGame настроить экран. Мы&lt;br /&gt;
инициализируем PyGame, а затем велим ему создать новое окно размером 640 x 480 пикселей, поместив в заголовок окна соответствующий текст. Затем создаем новый шрифт: создадим объект с именем&lt;br /&gt;
font, используя собственную систему шрифтов PyGame, и скажем&lt;br /&gt;
‘None’, что означает: нам неважно, какой шрифт использовать – пусть&lt;br /&gt;
будет стандартный системный. А размер шрифта установим 48 пунктов.&lt;br /&gt;
&lt;br /&gt;
Затем запускается главный цикл, выдавая десять вопросов. screen.&lt;br /&gt;
fill(0) просто заполняет экран нулевым цветом, то есть черным – это&lt;br /&gt;
очищает окно для каждого вопроса. Затем мы выбираем строку для&lt;br /&gt;
случайного слова, которое будет ответом, так же, как и в текстовой&lt;br /&gt;
версии, а затем у нас идет:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;mainpic = image.load(f2content[wordnum].rstrip(‘\n’))&amp;lt;/source&amp;gt;&lt;br /&gt;
Это довольно большая инструкция, так что давайте разберем ее.&lt;br /&gt;
Мы создаем новый объект PyGame: картинку с именем mainpic, для&lt;br /&gt;
отрисовки на экране. Однако картинку необходимо откуда-то загрузить,&lt;br /&gt;
и это должна быть картинка для верного ответа – а мы здесь сказали,&lt;br /&gt;
чтоб Python выбрал ее случайным образом.&lt;br /&gt;
&lt;br /&gt;
Как и до этого, в полном коде мы загружаем два текстовых файла&lt;br /&gt;
в f1content и f2content. f1content содержит список слов – в нашем случае, «Непал, Канада, Финляндия...». f2content содержит список имен&lt;br /&gt;
соответствующих файлов изображений: ‘nepalflag.png, canadaflag.png,&lt;br /&gt;
finlandflag.png...’. Наша переменная wordnum указывает на слово в&lt;br /&gt;
f1content, а также на имя файла связанного изображения в f2content.&lt;br /&gt;
Если wordnum равно 2, то она может указывать на «Непал» в f1content&lt;br /&gt;
и ‘nepal.png’ в f2content – вот почему записи в файлах должны попарно соответствовать друг другу!&lt;br /&gt;
&lt;br /&gt;
Итак, загружаем нашу картинку в соответствии с именем файла из&lt;br /&gt;
f2content, удалив символ перевода строки при помощи rstrip – не то&lt;br /&gt;
PyGame нас не поймет! Далее, делаем один из трех вариантов правильным, как и ранее. Затем создаем три отрывка текста для отображения&lt;br /&gt;
на экране. Вот первый:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;text1 = font.render(‘1 - ‘ + f1content[options[0]].rstrip(‘\n’),True, (255, 255, 255))&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Изображение:LXF102 71 2.png|thumb|При помощи Python и PyGame, мы теперь можем создать графический тест вроде этого.]]&lt;br /&gt;
Здесь создается новое изображение с именем text1, содержащее&lt;br /&gt;
первый случайный вариант из нашего списка слов f1content. True означает, что текст должен быть сглаженным, а (255, 255, 255) – цвет текста&lt;br /&gt;
в формате красный, зеленый, синий: белый, стало быть. Делаем то же&lt;br /&gt;
для других вариантов, затем отрисуем (blit) текст на экране и обновим&lt;br /&gt;
его, чтобы все отобразилось.&lt;br /&gt;
&lt;br /&gt;
Оставшийся код с комментариями, который вы можете просмотреть&lt;br /&gt;
на нашем DVD, обрабатывает ввод пользователя. Мы проверяем, что&lt;br /&gt;
нажал пользователь – 1, 2 или 3 – и реагируем соответственно: выводим «Верно!» и обновляем счетчик очков, или выводим «Неверно!».&lt;br /&gt;
Затем ждем нажатия Enter и вновь запускаем цикл.&lt;br /&gt;
&lt;br /&gt;
=== Завершаем ===&lt;br /&gt;
Надеемся, что это вдохновило вас покопаться глубже в вашем проекте&lt;br /&gt;
flash-карт – возможно, расширить его, включив пять вариантов вместо&lt;br /&gt;
трех. А может быть, вы хотите записывать системное время в начале&lt;br /&gt;
теста и сравнить его со временем по завершении теста, чтобы выставлять оценку за быстроту!&lt;br /&gt;
&lt;br /&gt;
С этой программой можно еще много чего сделать, и если у вас&lt;br /&gt;
получится что-то классное, пожалуйста, сообщите нам, и мы, возможно,&lt;br /&gt;
разместим это на нашем DVD. Если у вас возникли вопросы по данному&lt;br /&gt;
уроку, обратитесь к разделу Программирование на http://www.linuxforum.ru.&lt;br /&gt;
Наслаждайтесь!&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	</feed>