Яндекс.Метрика

Рассылка обновлений по электронной почте

понедельник, 15 июля 2013 г.

Муром-Ковров, Ковров-Муром

Ехали из Мурома в Ковров, как полагается, через Красную Горбатку. Откуда такие названия берутся, я удивляюсь.


Дорожная фотка, сделанная на ходу:


Пруд по дороге в Ковров. Кажется в деревне Иваново. Отличное место для купания, правда мы решили не рисковать, очередной раз замерзнув на мотоцикле.


В лесу много ягод. Мы ели землянику и малину, например.


В самом Коврове обнаружили парк с атракционами. Не знала, что в Коврове хоть что-то есть :)

Собственно, по дороге из Коврова решили заехать в Маринино в усадьбу Танеевых. По дороге увидели празднующих.


Усадьба так себе. За вход пришлось заплатить 20 рублей :) Хотели взять за то, что я буду фоткать еще 50. Вообще, меня поражает, почему люди сразу не включают это в цену билета. Ну что за глупость?


Кажется, празднующие направлялись сюда. Не очень понятно, что тут делать им.


Ресепшн.


Немного геологии.


Ну, а внутри прикольно, но места маловато.




Ведуньин мостик.


Не очень древняя скульптура.


В усадьбе только один дом, где и находится ресепшн.



Есть туалет, что, кстати, редкость.


Уехали и посмотрели на дом, который построил Сашкин прадедушка. Правда, он не уверен, что именно этот дом. И не уверен, что прадедушка :)


Гонщик.


Типичный пейзаж по дороге Ковров-Муром :) Очень приятная дорога: почти никого нет, тихо, и воздух отличный!


Проезжая Красную Горбатку.



Как это называется, снопы?




Они прелестны.





В общем, мы нагулялись. А потом поехали поездом в Москву. В Муроме появилась навигация на английском. Модно.


Но по традиции не работают терминалы чего-нибудь очень нужного. Нам нужны были терминалы для получения билетов.


Минимузейчик на вокзале.


На этом наше путешествие закончилось. Мы побывали на многих дорогах, во многих деревнях. Посетили Меленки, Судогду, Муромцевский замок, Танеевскую усадьбу в Маринино, и Муром, Ковров как остановочные пункты. Ничего, мне понравилось. Но Меленки я бы пропустила, там совсем уныло :) Хотя ехать в любое из этих мест очень приятно. Для небольших поездок по 1-2 часа мотоцикл подходит идеально. Трасса Муром-Ковров отличная для обучения вождению. В общем, хорошо покатались. В следующий раз поедем в города покрупнее. Наверное, побываем в Нижнем Новгороде.

На этом всё, до встречи!

Зачем нужны генераторы в Питоне (What for Python generators are invented)

Решила написать техническую статью, а то поговаривают, что блог стал совсем несерьезным. Придадим серьезности моему бложику.

Кстати, меня с недавних пор начал мучить вопрос как правильно «бложик» или «бложек»? Вы как думаете?

А теперь, генераторы.


Шучу.

1. Что такое генератор?

Напомню, что генератором-функцией является та функция, которая содержит в себе инструкцию yield. При вызове метода next объекта этой функции мы получим значение, указанное за yield, и весь контекст, включая значение локальных переменных, будет запомнен в том состоянии, в котором он находятся при выполнении строчки с yield. Например.

def gener(stop):
    i = 0
    while i < stop:
        yield i
        i += 1

Так, создав объект

g = gener(7)

и вызвав метод next

g.next()

получим сначала

0

После чего параметры функции i = 0 и то, что выполнение функции находится внутри тела цикла, будет запомнено до следующего вызова next. Следующий вызов next, вернет 1.

g.next()
1

Так будет происходить, пока условие i < stop выполняется, а именно до тех пор, пока i не достигнет значения 7.

...
g.next()
6

g.next()
StopIteration

Таким образом, при достижении «конца» итераций, возвращается исключение StopIteration. Выход из генератора можно вызвать явно, написав где-либо в функции инструкцию return, при достижении которой опять же вернется исключение StopIteration.

То есть объявление типа

def gener(stop):
    i = 0
    while i < stop:
        yield i
        i += 1
    return

равнозначно предыдущей функции gener.

Часть 2. Зачем нужны такие на первый взгляд бесполезные функции, возвращающие генераторы?

Известно, что объекты типа питоновских списков занимают память пропорционально количеству элементов. Скажем список [0, 1, 2, 3, 4, 5, 6] будет затрачивать память как минимум под шесть целочисленных значений. Если нам нужно будет итерироваться по такому списку, то мы можем явно написать что-то вроде

for i in [0, 1, 2, 3, 4, 5, 6]
    print i

и получить на стандартный вывод последовательность от 0 до 6.

Если же нам понадобится итерироваться по списку с гораздо большим количеством целых чисел, скажем, от нуля до нескольких миллиардов с шагом 1, то неужели придется хранить все эти числа в памяти? Это не нужно. Достаточно знать начало, конец и шаг итераций. Для этого в Питоне 2.x используют функцию xrange, она возвращает генератор, который в каждый момент времени хранит только начальное, конечное значения, шаг, и текущее значение, что намного меньше, чем несколько миллиардов чисел. Такую функцию можем и написать мы сами, используя yield. Возможно, правда, xrange будет работать чуть эффективнее, потому что разработчики постарались как-нибудь ее оптимизировать.

И это еще не всё. Что, если мы захотим хранить объект из бесконечного числа субобъектов? Мы можем оперировать этим понятием в жизни, но не в программировании? Не может быть! Конечно не может. Чтобы убедиться в этом, достаточно допустить ошибку в предыдущей функции.

def gener():
    i = 0
    while True:
        yield i
        i += 1

Вы видите описанный бесконечный цикл. Итерироваться по объекту, возвращенному такой функцией, можно бесконечно. Сам объект будет символом бесконечного множества.

g = gener()

И все дела.

Часть 3. Загадочный метод send.

У объектов-генераторов еще есть метод send, который на первый взгляд тоже кажется довольно бесполезным ;)

Если вызвать метод send у генератора, тогда yield внутри функции-генератора вернет значение, отправленное методом send. По умолчанию yield возвращает значение None.

Напишем такую функцию-генератор. Если yield возвращает None, то к i прибавляется единица, если же нет, то i становится равным x. Так можно в генератор посылать новое значение, с которого начнет итерироваться i снова.

def gener():
    i = yield
    while True:
        x = yield i
        if not x:
            i += 1
        else:
            i = x


g = gener()

g.next()
0

g.send(2)
2

g.next()
3

И т. д. С помощью send в данном случае можно определять значение, с которого нужно итерироваться, создав только один объект-генератор.

Вообще мне тут сказали, что генератор, в который можно посылать начальное значение не очень имеет смысл, так как вместо этого можно создать просто еще один объект-генератор с фиксированным начальным значением, но все же я решила, что это неплохой пример действия метода send.

Часть 4. Как использовать объекты с бесконечной генерацией чисел?

Во-первых, есть такая библиотека itertools, в которой много полезных функций для оперирования такого рода объектами.

В пример приведу одну из них islice. Функция islice принимает как минимум объект-генератор и значение, до которого нужно итерироваться. Возвращает конечный итератор.

from itertools import islice

def gener():
    i = 0
    while True:
        yield i
        i += 1

for i in islice(gener(), 5)
    print i,

0 1 2 3 4

Можно написать аналог такой функции, используя генератор.

def gener(*args):
    if args == []:
        step = 1
    else:
        step = args[0]
    i = yield
    while True:
        x = yield i
        if not x:
            i += step
        else:
            i = x

def slice(gen, start, stop, step):
    g = gen(step)
    g.send(None)
    x = g.send(start)
    yield x
    while True:
        x = g.next()
        if x < stop:
            yield x
        else:
            raise StopIteration

for i in slice(gener, 0, 10, 2):
    print i,

0 2 4 6 8

На этом всё. Кажется последние два пункта получились хуже, чем первые два, это потому что первые два я писала до обеда, а вторые — после. Ну, ничего. Лучше, ищите ошибки.

четверг, 11 июля 2013 г.

Рок-н-ролл как танец


Правила мотоциклиста

Я тут в первый же день длинной поездки усвоила несколько правил, которым нужно следовать, если едешь на мотоцикле более двадцати минут. Хотя нет, это не правила, это советы и наблюдения.

1. Одеваться надо тепло. Или хотя бы брать с собой теплую одежду. Даже если на улице +25, на мотоцикле ветер этой температуры со скоростью 60-90 будет дуть на вас. В общем, просто возьмите с собой теплую куртку, желательно непродуваемую. Хорошо, если постелете теплую ткань на сиденье. Ноги тоже очень хорошо продуваются, носки, кроссовки --- хорошее решение.

2. Шлем. Без шлема не только опасно, но и неприятно: в лицо дует ветер, сдувает ресницы, волосы путаются и пачкаются. Да, в лицо также могут лететь камни, мелкие и не очень. Что касается безопасности: лучше одевать наиболее закрытый шлем: подбородок, глаза и голова должны быть защищены.

3. Встречные и обгоняющие машины создают нехилый воздушный поток против вас. Нужно справиться с управлением в этот момент, поэтому лучше снизить скорость, так, на всякий случай.

4. Если вас обгоняют, то прижмитесь к обочине и снизте скорость.

5. При поворотах лучше сначала снизить скорость, а во время изменения траектории чуть-чуть  прибавить. Снижение скорости увеличит безопасность, а прибавление --- устойчивость.

6. Лушче переждать, чем поторопиться. Пропустите тучу машин, перед тем, как тронуться, это лучше, чем поторопиться и создать аварийную ситуацию.

7. Не бойтесь медлить. Лучше сзади вам будут много раз сигналить, чем вы окажетесь виновником ДТП.

Мне кажется эти пункты помогут избежать многие неприятности.




среда, 10 июля 2013 г.

Для Викиного блога

Мама испекла вкусный пирок со смородиной. Думаю, Вике фотка должна пригодиться.


И огурцы и помидоры с чьей-то грядки. Оч вкусные. Да, и черный перец. А вы пробовали черный перец?


Замок в Муромцево


Сегодня ездили в усадьбу Муромцево. Если вам интересна историческая часть (а она вполне себе ничего), то прочитайте статью в Википедии.

А если интересно путешествие по Владимирской области, то читайте дальше мой бложе.

Муромцево находится неподалеку от Судогды. Выезжали мы из Мурома, от Мурома ехать примерно километров 100. На мотоцикле это вышло около 2-х часов. Мы прошли техосмотр и смело поехали пробовать Ямаху.

Сначала мы покатались по Мурому, после чего поняли, что нужно одеться намного теплее, нежели мы были одеты для 22-х градусов. На мотоцикле мы продуваемся почти насквозь :) Я прикупила шерстяные носки.


На следующих фотках моя сестра Люда узнает свои штаны и боты. Спасибо, что не выкинула их, а оставила для кого-нибудь в Муроме. Они мне пригодились ;)

Дорога от Мурома до Судогды выглядит так как всегда :)


В общем, похожий пейзаж все 2 часа. Сама же Судогда по виду тоже не сильно отличается от Мурома, только состоит из двух-трех домов с каждой стороны главной дороги :) Ну, я немного преуменьшаю, но город и правда маленький. Фоток города, к сожалению, нет, мы его проехали очень быстро, а на ходу вытаскивать лучшего друга опасно. Поэтому скорее перейдем к замку. У замка был народ и кучка местных байкеров.


Замок необычный. Красивый. Чем необычный? Европевидный, а если верить Википедии, европейского средневековья.


Разрушенный он выглядит лучше, чем, мне кажется, в целом виде.


Вид сзади:






И внутрь тоже можно войти. Но будьте осторожны. Некоторые ступеньки лесенок могут быть скользкими, а вместо пола во многих частях замка простые дыры.



Особенно осторожно идите по лестнице вверх:





Потому что посередине замка большая такая дырень, через которую видны нижние или верхние ступени квадратной лестницы.


Вот и я, если вдруг соскучились.


Осмотревшись, пошли в прудам. Издали замок выглядит тоже очень хорошо.


Постройка рядом с прудом. Не знаю, что это.


Рядом с прудом офигенные лавочки, вырезанные из гигантских бревен.



Пруд.


К пруду пришел кот. Мое недавнее желание погладить кота сбылось.



Но он оказался черезчур слюнявым, что заставило меня волноваться и мыть руки больше и тщательнее, чем это обычно бывает. Не знаю, смыла ли всё. А кот после ласк как ни в чем не бывало пошел греться на барской скамье.


Уезжая, увидели деревянный монумент.


На этом почти все. Дальше мы хотели попить горячего чаю, но объехав два раза Судогду только на второй нашли открытую кафешку.


Там терпимо. Но пиццу надо ждать 35 минут. Пицца + салат + два раза по два чая вышло на 350 рублей, кажется. Рядом сидела школота и праздновала что-то очень важное. Забавные ребята.


Квест называется "Перемешайте салат". Я справилась с совсем небольшими потерями.


На этом все. Ждите продолжения.