Навигация
Хэштеги внутри блога, по которым можно найти посты на интересующие вас темы:
#py_basic - инсайты и лайфхаки для начинающих в Питоне, а также разборы несложных задач. Основано на большом опыте преподавания Питона с нуля.
#py_advanced - более продвинутые и специфические трюки и инструменты, разборы сложных задач.
#ml - про машинное обучение, интеллектуальный анализ данных, особенно в сфере обработки текстов. Истории из опыта (правда, не обо всём можно рассказывать из-за NDA).
#career - советы по продвижению карьеры в IT, прохождение собеседований, как найти первую работу и т.д.
#soft_skills - как эффективно общаться с коллегами, управлять временем, эмоциями, своим развитием.
Голосование:
https://t.me/plush_python/5
Об авторе:
https://t.me/plush_python/4
Хэштеги внутри блога, по которым можно найти посты на интересующие вас темы:
#py_basic - инсайты и лайфхаки для начинающих в Питоне, а также разборы несложных задач. Основано на большом опыте преподавания Питона с нуля.
#py_advanced - более продвинутые и специфические трюки и инструменты, разборы сложных задач.
#ml - про машинное обучение, интеллектуальный анализ данных, особенно в сфере обработки текстов. Истории из опыта (правда, не обо всём можно рассказывать из-за NDA).
#career - советы по продвижению карьеры в IT, прохождение собеседований, как найти первую работу и т.д.
#soft_skills - как эффективно общаться с коллегами, управлять временем, эмоциями, своим развитием.
Голосование:
https://t.me/plush_python/5
Об авторе:
https://t.me/plush_python/4
Telegram
Плюшевый Питон
Какие темы наиболее интересны? Также можете писать свои варианты в комментариях.
Базовый Питон / Продвинутый Питон / Машинное обучение и искусственный интеллект / Поиск работы, собеседования, карьера / Работа с людьми, гибкие навыки (soft skills)
Базовый Питон / Продвинутый Питон / Машинное обучение и искусственный интеллект / Поиск работы, собеседования, карьера / Работа с людьми, гибкие навыки (soft skills)
4 ключевые идеи программирования
#py_basic
Мой путь к написанию кода за деньги, а не просто как хобби, был долог и тернист. К настоящему моменту я пробовал программировать на 10 разных языках, включая Python, Java, C++. Когда я (несколько лет) преподавал Питон с нуля, я обычно начинал с того, что знакомил студентов с четырьмя "ключевыми идеями программирования". Если хорошо усвоить эти идеи, то можно научиться писать код любой сложности, так как всё остальное, что есть в программировании, - лишь надстройка над этими четырьмя идеями.
1. Функции - это действия, которые умеет выполнять ваша программа. Программу можно представить в виде робота, который умеет, например, танцевать, делать уборку, ходить в магазин за хлебом и т.д. Все эти "умения" робота - это функции. Отдельно взятая сложная функция может состоять из более простых функций (действий). Например, функция "сходить за хлебом" может состоять из действий: "взять деньги", "построить маршрут до магазина", "дойти до магазина", "найти в магазине хлеб" и так далее.
2. Переменные - это то, как программа хранит знания о мире. Говоря образно, это такие коробочки с этикетками, на каждой из которых написано название. То, что написано на коробке, - это название переменной, а то, что внутри коробки, - это содержимое, которое переменная хранит (числа, текст, или более сложные объекты). В почти любой программе есть свой "склад коробок" - это все переменные, в которых хранятся знания о мире, заложенные в программе. Следуя нашему примеру про поход за хлебом, можно представить себе переменную-коробку с этикеткой money. Тогда внутри этой коробки должно лежать число, которое обозначает, сколько у нас есть денег.
3. Ветвления - это логика принятия решений внутри нашей программы. Её можно представить в виде простых правил, на которые наша программа-"робот" ориентируется при совершении действий. Например, наш робот решает, покупать ему французский багет или нет. Он может сравнить стоимость багета (которая, допустим, "лежит" в коробке-переменной baguette_price) с количеством денег, которое у него осталось (переменная money). Если стоимость хлеба ниже, чем количество оставшихся денег, то нужно покупать. Конечно, логика робота может быть сколь угодно более сложной. :)
4. Циклы - это просто многократное повторение одних и тех же действий. Например, пока робот не нашёл подходящее хлебо-булочное изделие, он должен идти вдоль витрины и оценивать каждый товар в ассортименте. Когда хлеб найден, нужно прервать цикл (ведь дальше искать нет смысла) и идти к кассе оплачивать товар. Ещё может быть "маленький" цикл (оценить сегодняшний ассортимент в магазине) внутри "большого" цикла (каждый день ходить в магазин). В заключение можно вспомнить фильм "День сурка", где герой, по сути, застрял в бесконечном цикле, но в результате выполнения определённых действий ему всё-таки удаётся "вырваться".
#py_basic
Мой путь к написанию кода за деньги, а не просто как хобби, был долог и тернист. К настоящему моменту я пробовал программировать на 10 разных языках, включая Python, Java, C++. Когда я (несколько лет) преподавал Питон с нуля, я обычно начинал с того, что знакомил студентов с четырьмя "ключевыми идеями программирования". Если хорошо усвоить эти идеи, то можно научиться писать код любой сложности, так как всё остальное, что есть в программировании, - лишь надстройка над этими четырьмя идеями.
1. Функции - это действия, которые умеет выполнять ваша программа. Программу можно представить в виде робота, который умеет, например, танцевать, делать уборку, ходить в магазин за хлебом и т.д. Все эти "умения" робота - это функции. Отдельно взятая сложная функция может состоять из более простых функций (действий). Например, функция "сходить за хлебом" может состоять из действий: "взять деньги", "построить маршрут до магазина", "дойти до магазина", "найти в магазине хлеб" и так далее.
2. Переменные - это то, как программа хранит знания о мире. Говоря образно, это такие коробочки с этикетками, на каждой из которых написано название. То, что написано на коробке, - это название переменной, а то, что внутри коробки, - это содержимое, которое переменная хранит (числа, текст, или более сложные объекты). В почти любой программе есть свой "склад коробок" - это все переменные, в которых хранятся знания о мире, заложенные в программе. Следуя нашему примеру про поход за хлебом, можно представить себе переменную-коробку с этикеткой money. Тогда внутри этой коробки должно лежать число, которое обозначает, сколько у нас есть денег.
3. Ветвления - это логика принятия решений внутри нашей программы. Её можно представить в виде простых правил, на которые наша программа-"робот" ориентируется при совершении действий. Например, наш робот решает, покупать ему французский багет или нет. Он может сравнить стоимость багета (которая, допустим, "лежит" в коробке-переменной baguette_price) с количеством денег, которое у него осталось (переменная money). Если стоимость хлеба ниже, чем количество оставшихся денег, то нужно покупать. Конечно, логика робота может быть сколь угодно более сложной. :)
4. Циклы - это просто многократное повторение одних и тех же действий. Например, пока робот не нашёл подходящее хлебо-булочное изделие, он должен идти вдоль витрины и оценивать каждый товар в ассортименте. Когда хлеб найден, нужно прервать цикл (ведь дальше искать нет смысла) и идти к кассе оплачивать товар. Ещё может быть "маленький" цикл (оценить сегодняшний ассортимент в магазине) внутри "большого" цикла (каждый день ходить в магазин). В заключение можно вспомнить фильм "День сурка", где герой, по сути, застрял в бесконечном цикле, но в результате выполнения определённых действий ему всё-таки удаётся "вырваться".
Задача от Google про разложение на полные квадраты
#py_basic
У этой задачи есть история. Моя знакомая (она NLP / бэкенд-разработчик) много гуглила по работе, и поисковик однажды предложил ей решить несколько задач на программирование. Оказывается, Google следит за вашими поисковыми запросами не только для того, чтобы показывать вам более релевантную контекстную рекламу. Если вы много гуглите про бэкенд-разработку, то Google может предложить вам такой челлендж. Если его успешно пройти, то дальше зовут на собеседование. Там было несколько задач, я покажу вам самую первую из них. Она не сложная, но сможете ли вы решить её эффективно?
На входе положительное целое число, нужно разложить его на сумму квадратных чисел так, чтобы слагаемых было наименьшее количество. Слагаемые-точные квадраты нужно расположить в списке в порядке убывания. Например, если нам пришло число 7, то нужно разложить его на [4, 1, 1, 1], но не на [1, 1, 1, 1, 1, 1, 1] (не наименьшее количество слагаемых), не на [5, 1, 1] (первое число не является квадратом целого числа), не на [1, 4, 1, 1] (неправильный порядок) и так далее. Ещё несколько примеров:
12 -> [9, 1, 1, 1]
16 -> [16]
1 -> [1]
Завтра покажу решение и сделаю разбор.
#py_basic
У этой задачи есть история. Моя знакомая (она NLP / бэкенд-разработчик) много гуглила по работе, и поисковик однажды предложил ей решить несколько задач на программирование. Оказывается, Google следит за вашими поисковыми запросами не только для того, чтобы показывать вам более релевантную контекстную рекламу. Если вы много гуглите про бэкенд-разработку, то Google может предложить вам такой челлендж. Если его успешно пройти, то дальше зовут на собеседование. Там было несколько задач, я покажу вам самую первую из них. Она не сложная, но сможете ли вы решить её эффективно?
На входе положительное целое число, нужно разложить его на сумму квадратных чисел так, чтобы слагаемых было наименьшее количество. Слагаемые-точные квадраты нужно расположить в списке в порядке убывания. Например, если нам пришло число 7, то нужно разложить его на [4, 1, 1, 1], но не на [1, 1, 1, 1, 1, 1, 1] (не наименьшее количество слагаемых), не на [5, 1, 1] (первое число не является квадратом целого числа), не на [1, 4, 1, 1] (неправильный порядок) и так далее. Ещё несколько примеров:
12 -> [9, 1, 1, 1]
16 -> [16]
1 -> [1]
Завтра покажу решение и сделаю разбор.
Как научиться хорошо решать алгоритмические задачи?
#py_basic #py_advanced
Мы уже говорили о важности решении задач для развития алгоритмического мышления и подготовки к собеседованиям. Затем я предложил вам пару задач разной сложности с последующим разбором, знаю, что некоторым из вас удалось их решить. Теперь поделюсь лайфхаками из своего опыта - надеюсь, что они помогут вам научиться хорошо решать алгоритмические задачи и чувствовать себя увереннее на собеседованиях.
1. Когда начинаете решать новую задачу, рекомендую сначала разобрать её на бумаге, нарисовать схему, диаграмму, таблицу и т.п. Я считаю, что это самый важный шаг (и навык) - так обычно получаются более эффективные решения, чем если сразу садиться писать код.
2. При этом часто помогает вопрос: "а как человек (а не компьютер) решал бы эту задачу?" Вручную пошагово разобрать несколько примеров ввода, от простых до более сложных.
3. Если за 10-15 минут не появилось идей (иногда полезно и дольше поломать голову для тренировки), нужно сесть за код и попробовать запрограммировать хотя бы неполное решение, начав с простых случаев. Обычно в процессе этого приходят новые идеи.
4. Если на одних примерах ваше решение работает, а на других нет, это уже большой прогресс. Дальше нужно просто разобрать сложные случаи и понять, как их включить в ваше решение, сделав его более общим.
5. Если задача "не поддалась" за час-два и вы устали, лучше сделать перерыв и отдохнуть. Мозг так устроен, что он не может очень долго напряжённо работать над одной сложной задачей. Возможно, задача пока что вам не подходит и нужно какое-то время порешать более простые задачи, либо вы её всё-таки решите за несколько дней в "фоновом" режиме. И то, и другое - хорошо.
6. Не нужно ругать себя, если не получилось решить, потому что это нормальный процесс саморазвития. Помните, что мозг лучше всего учится на неудачах. Настоящая цель - не решить задачу, а повысить свои навыки.
7. Рекомендуют подбирать себе задачи таким образом, чтобы было где-то 15% неудач. Это оптимальный уровень сложности, когда из, скажем, 20 задач вы можете решить 17, а остальные не можете. Если процент успеха выше, значит, вы недостаточно себя нагружаете и ваш прогресс идёт медленнее, чем мог бы. Если же процент успеха ниже, значит, вы выбираете слишком сложные задачи, а это опасно для вашей мотивации и самооценки.
Ну и достаточно пока о задачах) В ближайших постах поговорим на другие темы.
#py_basic #py_advanced
Мы уже говорили о важности решении задач для развития алгоритмического мышления и подготовки к собеседованиям. Затем я предложил вам пару задач разной сложности с последующим разбором, знаю, что некоторым из вас удалось их решить. Теперь поделюсь лайфхаками из своего опыта - надеюсь, что они помогут вам научиться хорошо решать алгоритмические задачи и чувствовать себя увереннее на собеседованиях.
1. Когда начинаете решать новую задачу, рекомендую сначала разобрать её на бумаге, нарисовать схему, диаграмму, таблицу и т.п. Я считаю, что это самый важный шаг (и навык) - так обычно получаются более эффективные решения, чем если сразу садиться писать код.
2. При этом часто помогает вопрос: "а как человек (а не компьютер) решал бы эту задачу?" Вручную пошагово разобрать несколько примеров ввода, от простых до более сложных.
3. Если за 10-15 минут не появилось идей (иногда полезно и дольше поломать голову для тренировки), нужно сесть за код и попробовать запрограммировать хотя бы неполное решение, начав с простых случаев. Обычно в процессе этого приходят новые идеи.
4. Если на одних примерах ваше решение работает, а на других нет, это уже большой прогресс. Дальше нужно просто разобрать сложные случаи и понять, как их включить в ваше решение, сделав его более общим.
5. Если задача "не поддалась" за час-два и вы устали, лучше сделать перерыв и отдохнуть. Мозг так устроен, что он не может очень долго напряжённо работать над одной сложной задачей. Возможно, задача пока что вам не подходит и нужно какое-то время порешать более простые задачи, либо вы её всё-таки решите за несколько дней в "фоновом" режиме. И то, и другое - хорошо.
6. Не нужно ругать себя, если не получилось решить, потому что это нормальный процесс саморазвития. Помните, что мозг лучше всего учится на неудачах. Настоящая цель - не решить задачу, а повысить свои навыки.
7. Рекомендуют подбирать себе задачи таким образом, чтобы было где-то 15% неудач. Это оптимальный уровень сложности, когда из, скажем, 20 задач вы можете решить 17, а остальные не можете. Если процент успеха выше, значит, вы недостаточно себя нагружаете и ваш прогресс идёт медленнее, чем мог бы. Если же процент успеха ниже, значит, вы выбираете слишком сложные задачи, а это опасно для вашей мотивации и самооценки.
Ну и достаточно пока о задачах) В ближайших постах поговорим на другие темы.
Как удобно выводить на экран вложенные структуры?
#py_basic
Иногда приходится иметь дело со сложными питоновскими структурами данных: например, у нас есть список словарей, в котором ключи являются кортежами, а значения списками. Что делать, если нужно быстро разобраться, как организованы подобные данные? Можно использовать дебаггер, но иногда это бывает неудобно. Что если нам просто хочется быстро и красиво вывести данные на экран?
Рассмотрим простой пример (скриншот 1). Выводить сложную структуру на экран "в лоб" обычным вызовом print не всегда наглядно - данные отображаются в одну строку, их структуру довольно сложно считать.
В качестве альтернативы можно применить стандартный модуль pprint (сокращённое pretty print). Становится чуть лучше (скриншот 2). Кстати, из функции pprint.pprint / pprint.pp можно легко записывать в файл, а отображение данных можно настраивать с помощью аргументов. На RealPython даже целый тьюториал про это написали:
https://realpython.com/python-pretty-print/
Есть ещё один чуть менее очевидный способ - воспользоваться преобразованием данных в формат строки JSON с отступами (скриншот 3). У этого подхода есть свои существенные ограничения, но иногда бывает очень удобно. Лично мне форматирование стандартных питоновских структур данных в json.dumps нравится больше, чем использование pprint.pprint.
В качестве бонуса - полезно знать о сторонней библиотеке rich, в которой есть функция print с таким же интерфейсом, как и стандартный питоновский print. Отличие в том, что rich при выводе на экран раскрашивает в разные цвета числа, строки, булевы значения и т.д. (скриншот 4). Это, конечно, не решает проблему вывода на экран сложных структур с глубокой вложенностью, но иногда помогает легче считывать то, что выводится на экран, особенно в консоли. А для сложных структур в rich есть свой pprint (скриншот 5).
#py_basic
Иногда приходится иметь дело со сложными питоновскими структурами данных: например, у нас есть список словарей, в котором ключи являются кортежами, а значения списками. Что делать, если нужно быстро разобраться, как организованы подобные данные? Можно использовать дебаггер, но иногда это бывает неудобно. Что если нам просто хочется быстро и красиво вывести данные на экран?
Рассмотрим простой пример (скриншот 1). Выводить сложную структуру на экран "в лоб" обычным вызовом print не всегда наглядно - данные отображаются в одну строку, их структуру довольно сложно считать.
В качестве альтернативы можно применить стандартный модуль pprint (сокращённое pretty print). Становится чуть лучше (скриншот 2). Кстати, из функции pprint.pprint / pprint.pp можно легко записывать в файл, а отображение данных можно настраивать с помощью аргументов. На RealPython даже целый тьюториал про это написали:
https://realpython.com/python-pretty-print/
Есть ещё один чуть менее очевидный способ - воспользоваться преобразованием данных в формат строки JSON с отступами (скриншот 3). У этого подхода есть свои существенные ограничения, но иногда бывает очень удобно. Лично мне форматирование стандартных питоновских структур данных в json.dumps нравится больше, чем использование pprint.pprint.
В качестве бонуса - полезно знать о сторонней библиотеке rich, в которой есть функция print с таким же интерфейсом, как и стандартный питоновский print. Отличие в том, что rich при выводе на экран раскрашивает в разные цвета числа, строки, булевы значения и т.д. (скриншот 4). Это, конечно, не решает проблему вывода на экран сложных структур с глубокой вложенностью, но иногда помогает легче считывать то, что выводится на экран, особенно в консоли. А для сложных структур в rich есть свой pprint (скриншот 5).