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

Тем, кто хочет понимать, что пишет!
Download Telegram
Задача о циклическом сдвиге

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

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

На вход подаются массив 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
Прямо сейчас в голосовом чате с крутыми специалистами по DS и бэку обсуждаем:

🐠 Python фреймворки,
🐠 Асинхронность,
🐠 GPT-3,
🐠 достижения машинного зрения,
🐠 студию Артемия Лебедева 😅,
🐠 версии Python,
🐠 плохой и хороший код.

Присоединяйтесь. Записи не будет)

Кто был, поделитесь, пожалуйста, как вам? Делать еще такие эфиры?
Магические методы

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

Давно хотела о них написать вводную и вот авторы канала @it_resume любезно подготовили для нас с вами карточки.

Наслаждайтесь!
Про культуру коммитов

Работаю над куском кода, который опирается на json файл. Файл этот длиной 7к+ строк (только не спрашивайте, как так вышло). И кусок этот одновременно
- сложный
- используется большим количеством пользователей.

И тут из мастера в этот json прилетают изменения. В которых во всем файле пробелы заменены на табы. То есть, дифф слишком большой и отсмотреть глазами не получается. Поправлю, конечно, но досадно -- и небезопасно.

В связи с чем напоминаю, как коммитить (вот, например, хорошая статья от другого автора)

Для меня главное в этом тексте:
Один коммит = одна атомарная задача

И от себя бы еще добавила:
Дифф удобно смотреть ривьюеру

Чтобы этого добиться, перед каждым коммитом нужно отсматривать изменения в каждом файле, которые хотите залить в репо: с помощью git diff или в IDE.

И еще я никогда не делаю

git add .

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

Поделитесь, какие хорошие практики работы с git вы усвоили за время работы?
​​Уже больше часа лежит весь Фейсбук. Вместе с продуктами компании (WhatsApp, Instagram, мессенджером), отвалились даже DNS и страница статусов https://status.fb.com. И может не работать всё то, что опиралось на fb.

Интересно, что случилось.
Вопрос по Python. Как думаете, является ли тип complex составным?
Anonymous Quiz
19%
Это простой тип
36%
Это составной тип
45%
Что такое complex?