Generator vs Iterator

Как ни странно, вопрос о разнице между генераторами и итераторами в Python — довольно частый. В общем‑то эти сущности сильно связаны (любой генератор — это итератор), их довольно часто путают, что иногда приводит к недопониманиям. Итератор — более общая концепция. Это объект, у которого определены два метода: __next__ и __iter__. С другой стороны, генератор — это итератор, но не наоборот. Генератор может получаться с использованием yield в теле функции: def squares(start, stop): for i in range(start, stop): yield i * i generator = squares(a, b) Либо с использованием так называемых generator expression — например, такого: ...

29 февраля 2016 г.

Сохраняем JSON в LibGDX

Предыдущую неделю просидел дома. Из‑за высокой температуры особо на рабочих задачах сконцентрироваться шансов не было. Но вот сторонними проектами удалось позаниматься. В очередной раз порадовался связке LibGDX и Kotlin. Задачка такая: прочитать список объектов из JSON. Я уже приготовился писать много строк кода. Оказалось, что инструменты чтения JSON уже встроены в LibGDX. Это немного странно. Я ожидал, что для этой задачи потребуется сторонняя библиотека. Хотя, с другой стороны, скин для UI описывается JSON, так что, по сути, разработчики LibGDX вытащили используемые хелперы в публичный API. ...

24 февраля 2016 г.

Как вы управляете своими pet-проектами?

Сотни моих начинаний остаются недоделанными и даже близко не достигают целей, которые ставились перед проектом. И это при том, что зачастую основная цель — просто изучить ту или иную технологию. Самих идей проектов хоть отбавляй. Конечно, далеко не на всё есть время. Но самые «сочные» идеи хотелось бы реализовать — пусть не быстро, но хоть в какое‑нибудь разумное время. Из испробованных приёмов у меня более или менее нормально работает выделение времени по утрам. Причём работает где‑то половину года, когда светает достаточно рано. Заставить себя выбраться из‑под одеяла зимой — дохлый номер. Не помогает и какой‑нибудь ритуал, который хорошо работает летом. Обычно всё скатывается к просмотру какого‑нибудь сериала лёжа в кровати. ...

16 февраля 2016 г.

Страсть к смене технологий: с Python на Lua

Брайан Майер из Distelli опубликовал любопытную статью «Using Lua for Our Most Critical Production Code». В статье расхваливается переход с одной технологии на другую и то, как это помогло решить кучу проблем. При этом совсем не упоминается, с какими проблемами при этом столкнулись, и совсем нет анализа, какие проблемы могут возникнуть в будущем. По большому счёту, смена технологии проекта в его середине — обычно очень плохая идея. Программистов надо вытащить из области, в которой они разбираются, в совершенно незнакомое окружение. Не могу сказать, что это всегда негативно сказывается на команде, но такие риски надо просчитывать. Если человека нанимали за его экспертные знания в Python, будет ли он счастлив писать на Lua? ...

8 февраля 2016 г.

В чем главная слабость Python, как языка программирования?

Я очень люблю Quora.com. В отличие от Stack Overflow, здесь можно найти интересные обсуждения, не связанные с конкретными вопросами, а с общими ощущениями от технологий. Недавно наткнулся, к примеру, на такое обсуждение: «What are the main weaknesses of Python as a programming language?». В основном Python ругают за тормознутость, сравнивая с компилируемыми языками. Я уже писал, что считаю это обвинение надуманным. Для меня скорость разработки гораздо важнее. Для CPU‑bound задач я бы в первую очередь подумал об алгоритмах, а потом использовал Cython. Да и не так уж много таких задач. А если ваш проект весь такой, то какого лешего вы выбрали скриптовый язык для этого? ...

25 января 2016 г.

Приватных полей в питоне нет

Достаточно часто встречаю вопросы о приватных полях и методах в Python от людей, которые раньше программировали на Java (или C++). Вот только в Python класс — это не совсем то же, что и в Java. В Python класс — это просто контейнер, содержимое которого доступно всем. «Приватные» поля — это всего лишь договорённость по именам, которая никак не мешает работать с такими полями из любого места кода. Добавление имени класса к имени переменной — слабая защита. ...

18 января 2016 г.

Я влюбился в Django. Снова. А вы что сделали за новогодние каникулы?

Ещё 31 декабря прошлого года у меня были гигантские планы на каникулы. Как минимум я должен был закончить один из своих сайт‑проектов. К сожалению, работе удалось уделить всего 4 часа. Но за это время я успел снова влюбиться в Django. Кажется, я где‑то уже об этом писал: Django — это мой проводник в мир Python. Именно благодаря этому фреймворку меня вырвало из хищных лап PHP. И первое время к Python я относился как к досадной необходимости, без которой Django не работает. ...

11 января 2016 г.

Постновогоднее. Целеполагательное

Наступил Новый год. Самое время разобраться с целями. Конечно, лучше бы это было сделать ещё в конце декабря, но лучше поздно, чем никогда. Сегодня я расскажу, как это делаю я. Почему‑то у меня не работает излюбленный народом метод: в новогоднюю ночь написать желание на бумажке, бумажку сжечь, пепел положить в бокал шампанского и выпить его. Наверное, всё из‑за того, что я не пью шампанское. И уже довольно давно. Так что за последние лет 7–8 я перепробовал кучу методик: от жёсткого тайм‑менеджмента до GTD. ...

5 января 2016 г.

Django или Flask?

Решил восстановить свой сайт о настольных играх — VseNastolki.ru. Когда‑то там был интернет‑магазин, но, поскольку теперь на столь серьёзный проект меня не хватит, я буду делать всего лишь базу настольных игр. Оформив идею, я, как настоящий программист, взялся за выбор фреймворка: Flask или Django. Другие фреймворки я не рассматривал. Причина проста: у меня нет опыта работы с ними. Проект хочется закончить, так что использовать неизвестный фреймворк для этого не хочется. Так что в кандидатах остались только Flask — наш текущий фреймворк на работе — и Django — фреймворк, из‑за которого я попал в мир Python. ...

28 декабря 2015 г.

Деление данных по коллекциям в MongoDB

Не надо лезть в MongoDB с реляционным подходом. Этот тезис вроде бы очевиден, но когда дело доходит до реализации, возникает множество вопросов. И стопроцентно одним из них будет: «Как делать join?». Правильный ответ: никак. Да, в версии 3.2 появился $lookup в агрегациях. Отчасти это замена классическому JOIN из реляционного мира. Но в целом агрегации — не самый быстрый в MongoDB инструмент. Лучше, когда запрос идёт к одной коллекции и это обычный find. ...

21 декабря 2015 г.