CoolPython
4.68K subscribers
20 photos
44 links
Канал об основах Python и хороших практиках разработки. Создаём системность в обрывочных знаниях.

Тем, кто хочет понимать, что пишет!
Download Telegram
Работа с JSON

Хотела собрать для менти ссылок по работе с JSON, но не нашла, чтобы в одном месте последовательно, исчерпывающе и без воды рассказали бы все самое важное, что питонисту нужно знать о работе с этим форматом.

Поэтому сделала лонгрид по JSON'у сама и делюсь с вами! Статью в PDF можно посмотреть на моем Patreon'e, она бесплатная. Рассчитана на уровень джуниоров и стажеров. В канал выложить не могу, потому что слишком много текста, а в тексте картинки, схемы и даже один мем!

Из головных болей: не получилось сверстать так идеально, как хотелось. Начала с LaTeX, поняла, что верстается долго, перешла в markdown, но там некрасиво легли картинки. Наконец, сделала в Notion и все равно недовольна. Дайте знать, если умеете красиво верстать без боли и адских страданий или можете рассказать, на какой платформе вам удобнее читать лонгриды.

🐠

Один из отзывов: Прочитал твою статью про json! Восторг! Ты так хорошо и спокойно объясняешь! Ты смогла мои обрывочные знания систематизировать.

Спасибо вам за такие хорошие слова🤍 Стараюсь для вас.
Открываю курс по Python.

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

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

О курсе:
🐟 Теория и задачи ждут вас на платформе Stepik.
🐟 Сейчас курс продается за 2700 рублей и можно пройти первые 5 модулей. Остальные 7 модулей я открою для прохождения в течение 7 недель.
🐟 Я внимательно слежу за комментариями и буду обновлять и дополнять материал там, где это будет нужно.
🐟 Когда я открою последний модуль, цена вырастет в полтора раза. Так что предлагаю заинтересованным опередить меня!

Научиться писать на Python под моим наблюдением можно здесь.
Блок else в циклах

Многие теряются при виде блока else в циклах. А между тем в Python он используется не только в условных конструкциях. Рассмотрим на примере цикла for:
 
for i in range(1, 3):
print(i)
else:
print("loop finished normally")
# 1
# 2
# loop finished normally

Блок else выполняется, если выполняется условие выхода из цикла. Это значит, что если цикл прерывается как-то иначе, например, ключевым словом break или исключением, то блок else выполнен не будет:
 
for i in range(1, 4):
if i == 2:
raise Exception("error occurred")
else:
print("loop finished normally")
# Exception: error occurred

Чаще всего этим пользуются, когда ищут что-нибудь в цикле с использованием ключевого слова break:
 
numbers = [1, 3, 11, 5]
for number in numbers:
if number % 2 == 0:
print ("even number found")
break
else:
print ("no even numbers in the list")
# no even numbers in the list

С циклами while можете попробовать самостоятельно. 🐠

#циклы #for #while #else
Печать списков

Если вдруг на собеседовании вам понадобится вывести список (или множество) чисел на печать одной строкой, то вот изящный способ это сделать:
 
>>> numbers = [1, 2, 3, 4, 5]
>>> print(*numbers)
1 2 3 4 5


Пользуйтесь! 🐠

#списки #множества #iterables #print
Прямой эфир о резюме

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

Поэтому предлагаю вам вот такой формат: мы с моей коллегой, senior разработчицей и основательницей школы IT girl school Алисой проведем в четверг в 20:00 прямой эфир, на котором разберем и перепишем три джуниорских резюме. Увидите на примерах, как лучше писать, чтобы вас заметили работодатели.

Перерабатывать резюме будем прямо в эфире и еще будем задавать уточняющие вопросы, чтобы представить опыт кандидата в самом выгодном свете. Поэтому ищем троих добровольцев, готовых участвовать в эфире. В конце участники получат переработанные нами версии своих CV, а зрители — набор рекомендаций и инсайты на тему того, как видят их резюме работодатели.

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

Ссылка на эфир: https://us02web.zoom.us/j/86743972942?pwd=eHVIeUFvSklGaUZaK3N2WnlUSDFxZz09
Резюме для разбора можно прислать мне или Алисе.

Ставьте огонек, если собираетесь прийти, чтобы я понимала, сколько нас будет🔥
Вот запись вчерашнего эфира с разбором резюме. Сначала там рассказ минут на 10 от меня про самые частые ошибки в резюме, а дальше мы с Алисой разбираем и комментируем 4 совершенно разных документа и отвечаем на вопросы из чата.

Запись вот: https://youtu.be/AZe4_XVRuxA

Если то, что мы делаем на эфире, кажется вам полезным и близким, но все равно непонятно, как именно вам получить повышение или работу, то приходите в личку @chakchurina, обсудим, что можно сделать в вашем случае.
Прикольные новости Jupyter: теперь его можно запустить прямо в excel'е. Кому-то покажется, что это дорога в ад, а кого-то избавит от необходимости выбирать между привычными инструментами для аналитики. Что думаете?

Источник: https://www.pyxll.com/blog/python-jupyter-notebooks-in-excel/
Замена в списке

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

>>> a = [1, 2, 3, 4, 10]
>>> b = [5, 6, 7]

нужно получить:

[1, 5, 6, 7, 10]

Делаем:

>>> a[1:4] = b

Получаем:

>>> a
[1, 5, 6, 7, 10]

Готово, вы восхитительны!

#списки #коллекции #слайсы
Релиз NumPy

Вчера вышел самый крупный в истории NumPy релиз: версия 1.20.0. Библиотека в этой версии поддерживает Python 3.7 — 3.9, а ниже нет. Если работаете с NumPy, посмотрите полный список изменений. 🐠

#новости
Друзья, я закончила свой курс по Python для начинающих.

🐙 Несколько мест переработала по отзывам.
🐙 Когда я пишу, промахиваюсь по клавишам и в курсе было много опечаток, которые мы со студентами исправили.
🐙 Сделала чат поддержки, в котором помогаю и отвечаю на вопросы (после регистрации приходит ссылка на почту).
🐙 Курс одобрен командой Степик и попал в рекомендации платформы.
🐙 Как и обещала, когда закончила делать материалы, подняла цену на курс.
🐙 Добавила сертификат о прохождении.
🐙 Вернула историческое название, так что в сертификате будет именно оно.

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

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

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

Группа стартует 15 февраля и я рассчитываю на 6 недель: по 2 раздела в неделю. Получится плотно, но я буду помогать с задачами в чате, созваниваться по Зуму, делать review решений в группе. Набираю всего 30 человек, потому что больше мне самой будет сложно.

Если давно хотели выучить Python, но не знали, с чего начать, то давайте начнем вместе. 🐠

PS: после регистрации на почту придет ссылка на группу, не пропустите ее.
Круглый стол по Kubernetes

Допустим, в вашей компании решили перейти на Kubernetes. Это должно было повысить стабильность сервисов, увеличить скорость разработки... Но в реальности этого не произошло. В чем причина: Kubernetes не работает или процессы не отлажены?

Приходите на бесплатный круглый стол 11 февраля в 19:00. Поговорим о том, кто какие задачи решает в кластере Kubernetes, как уменьшить количество необходимых ресурсов для перехода на k8s, за счет чего сокращается time-to-market и причем тут вообще разработчик.

На встрече будут инженеры эксплуатации и разработчики из Mail.ru Cloud Solutions, Слёрм и Southbridge.

#ad
Музыкальная пауза

Песни, которые слышим чаще, чем хочется

1. func (1)
2. dct ['key'] = lst [index]
3. ham[ 1 ]
4. counter +=1
5. complex(real, imag = 0.0)
6. import sys, os
7. except Exception:
8. if type(obj) is
int:
9. if len(values)
== 0:
10. if flag == True

https://youtu.be/hgI0p1zf31k
Задача про скобки.

Супер распространенная задача со скрининг-собеседований.

На вход подается строка, состоящая из круглых скобок. Выведите True, если скобки вложены правильно и False, если нет.

Например, если входная строка
(()(())), то ответ должен быть True.
А если ()), то False.

Это базовая задача на алгоритмы и решается она за один проход по строке (O(n)). Идея здесь следующая: нужно завести переменную-стек, которая будет хранить состояние скобки на i-том шаге и в зависимости от состояния принимать решение о том, валидная строка или нет.

Вот видео с более подробным описанием решения.

Я видела варианты, в которых люди пишут свой класс для стека, но в качестве него сработает и обычный список, если использовать только методы append() и pop().

Вот возможное решение, которое мне нравится:

def if_balanced(string):
stack = []
for i in string:
if i == "(":
stack.append(i)
elif i == ")":
if not stack:
return False
stack.pop()
if stack:
return False
return True


print(if_balanced("()()())"))

Усложненная форма этой же задачи: на вход подаются строка со скобками разных видов, например, ([]{}) -> True, ({}([]{)}) -> False.

Можете решить ее самостоятельно. 🐠

UPD: в комментарии накинули решение без стека:)
Задача о циклическом сдвиге

Предложила ее менти как тренировочную.

Циклический сдвиг массива — это когда каждый элемент кроме последнего сдвигается вправо, а последний элемент массива становится первым.

На вход подаются массив A и целое число K. Сделайте циклический сдвиг входного массива K раз и верните получившийся массив.

Например, для данных:

A = [2, 5, 1, 4, 6]
K = 3


Циклический сдвиг должен быть выполнен трижды:

[2, 5, 1, 4, 6] -> [6, 2, 5, 1, 4]
[6, 2, 5, 1, 4] -> [4, 6, 2, 5, 1]
[4, 6, 2, 5, 1] -> [1, 4, 6, 2, 5]

И программа должна вернуть

[1, 4, 6, 2, 5]


Если K = 0, то сдвиг не делается.

Для K = 5:

[2, 5, 1, 4, 6] -> [2, 5, 1, 4, 6]


Наивное решение:

1. Определяем, что такое ротировать массив один раз.
2. Делаем это K раз.

def rotate(A, K):
""" Rotates a list K times """
if not A:
return []

for i in range(K):
A = rotate_once(A)
return A


def rotate_once(A):
""" Rotates a list once """
A.insert(0, A[-1])
del A[-1]
return A


Это решение не оптимальное, потому что каждый insert() передвигает все элементы исходного списка. Также оно не учитывает, что после len(A) ротаций список возвращается в исходное состояние.

Как решила ученица. Она заметила, что индексы элементов в новом массиве несложно рассчитать аналитически:

def rotate(A, K):
""" Rotates a list K times """
result = []
if K == 0:
return A
else:
for i in range(len(A)):
new_index = (i - K) % len(A)
result.append(A[new_index])
return result


Это круче, потому что
🐙 результат получается за один проход
🐙 и время работы не увеличивается на больших K.

Очень радуюсь, когда получается у учеников!
Параметры map

А вы знали, что у функции map три параметра?

Функция map используется для того, чтобы делать однотипные операции над наборами данных. Например, с ее помощью удобно приводить типы данных:
 
>>> chr_nums = ['1', '2', '3', '4', '5']
>>> list(map(int, chr_nums))
[1, 2, 3, 4, 5]

или округлять значения:
 
>>> floats = [2.2865, 3.6420, 6.6418, 8.7231, 3.1528]
>>> list(map(round, floats))
[2, 4, 7, 9, 3]

Но у map есть еще третий параметр, который используют, чтобы передать аргументы в обрабатывающую функцию.

Например, если мы хотим возвести все числа в квадрат, то двойки в аргументы можно передать как список:
 
>>> list(map(pow, range(10), [2]*10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

То же с округлением:
 
>>> floats = [2.2865, 3.6420, 6.6418, 8.7231, 3.1528]
>>> list(map(round, floats, [3]*len(floats)))
[2.287, 3.642, 6.642, 8.723, 3.153]

Либо так:
 
>>> from itertools import repeat
>>> list(map(round, floats, repeat(1)))
[2.3, 3.6, 6.6, 8.7, 3.2]

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

Больше в доке: map, repeat. 🐠
Follow-up о map

Обожаю то, как вы не даете мне быть неточной или ошибиться в тексте:) Вот что написали:

Я бы ещё не сказал, что у map три параметра: у map 1 + n параметров. Первый из них — функция, а из итерации по n ≥ 1 оставшимся получаются её аргументы.

Можно, например, передать четыре:
 
>>> from itertools import repeat
>>> list(map(lambda x, y, z: x*y*z, range(5), range(0, 10, 2), repeat(1)))
[0, 2, 8, 18, 32]

Если что, у этого канала есть чат (откуда собственно этот комментарий). Чат работает в экспериментальном режиме, сейчас мы там обсуждаем новости, посты и Python.

Сразу скажу, что мне в чате нужна уютная и поддерживающая атмосфера. Поэтому я баню за троллинг, переход на личности, неконструктивную критику (за конструктивную не баню). Какая реплика норм, а какая нет, решаю интуитивно, справедливости нет.

Но если это ок, то добро пожаловать:

https://t.me/joinchat/U77F142Y0dQBAW_W
Без aspera ad astra

Мне часто задают вопросы вида «хочу заниматься разработкой, имеет ли смысл сначала устроиться тестировщиком?» Или, например, если человек хочет в аналитику, то иногда пытается двигаться через BI. То есть, люди пытаются иногда вкатываться в новую область через смежную.

Я сама искала первую работу в IT, когда заканчивала универ и работала младшим научным сотрудником в лабе. У меня было резюме с пет-проектами, но, естественно, без опыта на реальных задачах.

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

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

В детстве самым активным из нас говорят «в каждой бочке затычка», а когда вырастаешь, оказывается, что это ценное профессиональное качество. Мне кажется, надо сразу браться то, что нравится. Бесплатно, недорого, либо на стажировке — но не теряя время на ненужные задачи и задерживаясь только на проектах, работа на которых приближает к желаемой картинке будущего.

Но, может, у кого-то из вас был успешный опыт вкатывания в область не напрямую? Например, через BI в аналитику или через разработку в ML. Не когда переквалифицировались, уже будучи зрелым специалистом, а когда специально шли сначала в одну область, чтобы потом попасть другую. Поделитесь в комментариях! 🐠
Одна особенность filter

Синтаксис встроенной функции filter такой:

filter(function, iterable).

Эта функция фильтрует значения переданной последовательности с помощью функции function. Если function получает очередной элемент последовательности и возвращает True, то элемент попадает в результат работы filter, иначе нет.

Например, таким способом можно отфильтровать только строки, состоящие из чисел:
 
>>> strings = ['two', 'list', '', 'dict', '100', '1', '50']
>>> list(filter(str.isdigit, strings))
['100', '1', '50']

Или только четные значения:
 
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list(filter(lambda x: x % 2 == 0, numbers))

Часто в качестве фильтров используют лямбда-функции или член-функции классов.

А еще (внезапно) вместо функции можно использовать None:
 
>>> random = [1, 'a', 0, False, True, '0', '']
>>> list(filter(None, random))
[1, 'a', True, '0']

И тогда filter вернет только truthy значения. 🐠
Что здесь хорошего

Расскажу тем, что здесь недавно (и напомню тем, кто давно), что за движ в этом канале.

Сначала обо мне. Канал авторский, автора зовут Маша Чакчурина (это я). До IT я занималась астрофизикой, а в программировании начинала как C++ разработчица в компании StarLine в СПб. Там я перешла на Python, писала API, микросервисы, поучаствовала в их беспилотнике. После этого работала в Kaspersky, была техничсеким кофаундером в стартапе, делала голосового помощника в Сбере. Всего я в бэкенде шесть лет, последние два преподаю.

Итак, что здесь хорошего.

👶 Тут есть посты об основах языка и стиле кода для junior коллег. Например, что такое мутабельность и иммутабельность, какая сложность добавления операции в список, чем is отличается от ==, как инициализировать контейнеры в функциях и многие другие.

👩‍🔧 Поменьше постов о низкоуровневых особенностях языка для middle и senior, например, развернуто о том, как работает TimSort.

😽 Есть о софт-скиллах в IT, например, о том, как онбордиться на новый проект, или о вопросах коллегам. Еще у нас с основательницей школы IT Girl School Алисой был эфир с разбором резюме подписчиков.

Бывают новости Python: о свежих либах, обновлениях или о новых крутых курсах от гуру вроде Дэна Бейдера.

🧐 Иногда пишу об истории языка (как здесь и здесь).

🎪 Есть шютки, например, послушайте песню про PEP8.

🧭 Есть старая подборка бесплатных материалов по computer science (давно хочу обновить).

Еще я веду курс по Python для тех, кто еще никогда не писал программы. Курс составила сама, с моей фирменной подачей «просто о сложном». Время от времени я набираю группы на этот курс и много сил трачу на поддержку учеников. Для меня это важный личный проект🤍

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

И оставайтесь в CoolPython 🐠
Live stream started