Поиск информации — одно из основных использований компьютера. Одна из простейших задач поиска информации — поиск точно заданной подстроки в строке. Тем не менее, эта задача чрезвычайно важна — она применяется в текстовых редакторах, СУБД, поисковых машинах…
Алгоритм Кнута-Морриса-Пратта (КМП)
Алгоритм был разработан Кнутом (Knuth) и Праттом (Pratt) и независимо от них Моррисом (Morris) в 1977 г.
Он относится к «правильным» подходам решения поставленной задачи, в отличии от тривиального подхода, рассмотренного ранее.
Данный подход хоть и считается достаточно тривиальным, описания, которые нашел я, зачастую пестрят математическими основами и доказательствами, которые сбивают с сути. Так в книге, уважаемого Никлауса Вирта, приводится описание, которое я так и не одолел.
Однако я нашел пару статей, которые достаточно информативны, они приведены в ссылках и рекомендуемы для ознакомления.
Тибетская диета
Тип диеты — низкокалорийная
Убыль веса — 3-4 кг
Продолжительность — 7 дней
Если вы хотите не только хотите похудеть, но и омолодить свой организм обязательно попробуйте тибетскую диету. Основа диеты – молоко и продукты растительного происхождения – овощи и фрукты. Мясо, птица, яйца запрещены. Исключение составляет рыба, которая присутствует в диете в незначительном количестве, да и то не каждый день.
Основные правили тибетской диеты:
— есть нужно не торопясь, в спокойной обстановке, тщательно пережевывая пищу, это способствует лучшему перевариванию и не дает откладываться жиру;
— перекусы между основными приемами пищи запрещены;
— питьевой режим не ограничен, но воду пить рекомендуется за час до еды, лучше родниковую или минеральную без газов;
— стараться не есть на ночь, последний прием пищи должен быть не позднее чем за два часа до сна;
— сочетать диету с дыхательными и физическими упражнениями на свежем воздухе, это способствует более эффективному похудению, а так же омоложению организма.
Использование try-finally
Хочу обратить внимание на маленькую особенность написания конструкции try-finally.
Возьмём для примера многопоточность, а конкретно блокировки.
Где-то (наверное, в конструкторе класса) мы создали объект блокировки:
self.locker = threading.RLock()
Затем в каком-то методе мы пытаемся использовать эту блокировку в try-finally statement. Да, я знаю что RLock поддерживает context manager protocol и может использоваться в with statement. Так будет даже лучше, но мы сейчас говорим о другом варианте использования.
try:
self.locker.acquire()
do_some_work()
finally:
self.locker.release()
В чём ошибка? .acquire() может выбросить исключение. Блокировка не будет захвачена и попытка её освободить в .release() выбросит новое (другое) исключение. Что крайне нежелательно. Особенно в python 2.x, где нет цепочек исключений. Т.е. ошибка в .acquire() будет просто скрыта, понять в чём было дело невозможно.
Правильно писать так:
self.locker.acquire()
try:
do_some_work()
finally:
self.locker.release()
Если было исключение в .acquire() — то блокировка не захвачена и освобождать её не нужно. Пусть обработка исключения разворачивается своим ходом, .release() в finally block совершенно не нужен.
Правило простое и понятное, тем не менее я сам нередко писал ошибочный код. А сегодня опять увидел это проблему при чтении чужих исходников.
Проблема усугубляется тем, что обычно .acquire() работает успешно, и лишь в редких случаях выбрасывает исключение. Которое мы видим в логах (все используют логи, верно?) и недоумеваем, что именно произошло.
Это замечание относится к любому коду, выполняемому в finally block.
Переменные, блокировки, захват ресурсов, открытие файлов и т.д. должны быть выполнены перед try.
P.S.
На открытие файлов хочу обратить особое внимание как на самый частый случай. Куда более частый чем работа с многопоточностью. Правильно писать:
f = open('filename')
try:
f.read()
finally:
f.close()
Надеюсь, последний пример запомнится хорошо и внесёт ясность в головы уважаемых молодых коллег.
Автор: Andrew Svetlov
Подвесные кашпо
Выращивать пряные растения можно не только на грядках, но и в обычных цветочных горшках круглый год. В зимнее время горшки размещаются на подоконнике, например, на кухне, а с наступлением теплой погоды их следует вынести на открытый воздух.
Но куда поставить все эти горшки? Вот тут как раз и следует сделать подвесные кашпо, где горшки можно разместить в несколько ярусов.

Украшения легко и просто
Как нам хочется щеголять весной во всей красе, не уставая удивлять окружающих все новыми и новыми нарядами и аксессуарами. С наступлением весны мы все сами пробуждаемся, у нас находится куча дел. Нужно все время куда-то бежать, что-то делать и с кем-то договариваться. Когда найти время на рукоделие? А ведь на украшения хэндмэйд нередко нужно потратить немало времени, запастить терпением и усидчивостью. Так бывает часто, но не в этот раз. Сегодня мы представляем мастер класс для ленивых или очень занятых девушек. Бижутерия легко и просто, и, самое важное, быстро представляется вашему вниманию, дорогие читательницы.


