Девман для питонистов
532 subscribers
144 photos
3 videos
186 links
Веб-разработка на Python. Канал от практиков.

Сайт школы Девман: https://dvmn.org/
Контакт для связи: @yulya_devman
Download Telegram
К сожалению, опросник не поддерживает форматирование с переносом строк, поэтому продулирую сюда более читаемые варианты:
Вариант А.
>>>print(a == b, a is b, sep=', ')
True, False
>>> print(c == d, c is d, sep=', ')
True, False

Вариант B.
>>>print(a == b, a is b, sep=', ')
True, True
>>> print(c == d, c is d, sep=', ')
True, False

Вариант C.
>>>print(a == b, a is b, sep=', ')
True, True
>>> print(c == d, c is d, sep=', ')
True, True
🔥1
🥳 Итак, правильный ответ - B!

Оператор == вызывает магический метод __eq__() объекта и проверяет равенство значений объектов. Если этот метод не реализован у кастомного класса объектов, то == по умолчанию сравнивает адреса памяти двух объектов, т.е. проверяет идентичность объектов. А значит, результат сравнения может быть неожиданным для программиста.

c = 16789
d = 16789
>>> print(c == d)
True

Оператор is проверяет идентичность объектов. В Python все является объектом, а каждый объект размещается в памяти по определенному адресу. Оператор is проверяет, ссылаются ли две переменные на один и тот же объект в памяти. Для проверки адреса, используйте функцию id():

>>> id(a)
9776800
>>> id(b)
9776800
>>> id(c)
139766195519312
>>> id(d)
139766195945264


Но почему же c и d указывают на разные объекты в памяти, а a и b на один и тот же? Здесь включается механизм интернирования объектов Python, иначе он называется кэшированием объектов.

Для экономии ресурсов самые часто используемые объекты хранятся в фиксированном месте памяти в единственном экземпляре. Пример — сколько бы переменных вы не создали со значением 2, все они будут привязаны к одному и тому же адресу памяти. По умолчанию в CPython интернируются следующие типы объектов:
- None,
- True, False
- простые строки
- числа от -5 до 256

Интернирование позволяет использовать уже существующие неизменяемые объекты в некоторых случаях вместо того, чтобы каждый раз создавать новый объект. Для экономии памяти и ускорения работы программы вы можете интернировать часто используемые строковые значения принудительно, используя функцию sys.intern():

>>> str1 = 'hello world'
>>> str2 = 'hello world'
>>> str1 is str2
False
>>> str1 = intern(str1)
>>> str2 = intern(str2)
>>> str1 is str2
True


Рекомендуется использовать оператор is для сравнения с None вместо оператора ==. Он не только быстрее, поскольку сравнивает адреса памяти, но и безопаснее, поскольку не зависит от логики каких либо методов __eq__() класса.

Поскольку булевые значения True и False интернируются, то оба оператора дадут одинаковый результат. Мы рекомендуем и вовсе отказаться от сравнения с ними, т.к. это позволяет упростить код, не ограничивая функциональность:

c = 5
d = 3

if c > d is True:
do_something()

# высушим код, но получим тот же результат
if c > d:
do_something()

result = c > d # True


Подведем итоги:
Используйте операторы Python == и != для сравнения равенства объектов.
Используйте операторы Python is и is not для сравнения с None. Сравнивать с None по адресу памяти быстрее и безопаснее, чем с помощью методов класса.
Используйте операторы Python is и is not, если хотите сравнить идентификатор объекта, т.е. указывают ли переменные на один и тот же адрес в памяти
Избегайте сравнений с True/False, используйте готовые результаты логических операций, чтобы высушить код.
🔥4
Курсам Девмана уже 8 лет. Изначально они появились как решение собственной проблемы дефицита программистов для заказной разработки, необходимости долго и дорого дообучать новых сотрудников. Поэтому в приоритете было качество и высокая доходимость до конца.

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

➡️ Шаги и модули. Добавили в уроки шаги — сложность снизилась. Разбили уроки на тематические мини-курсы. Проходить стало легче, но ученики часто терялись, учились медленно, часто забрасывали.

➡️ Менторы. Прорыв случился в 2021 году, когда мини-курсы объединили в единый трек и добавили менторов. Доходимость ступени курса «Профессия Middle Python/Django разработчик» длительностью 5 месяцев увеличилась до 60% даже с учётом времени ожидания код-ревью, локальных проблем с уроками и проектами при доработке курса и из-за изменений условий использования сторонних веб-сервисов, используемых в уроках.

➡️ Проблема выделения времени. И все ещё ученики уходят с курса по схожим причинам — не выделяют время на обучение, теряют мотивацию и силы.

С менторами собрали частные ошибки, которые значительно влияют на на шансы дойти до конца курс:
👍1
Обязательная часть техинтервью — Live coding. Live coding позволяет дать оценку способности кандидата разбираться с основными концепциями языка или фреймворка, применять алгоритмический подход к решению задач, а также оценить навыки отладки и тестирования кода. И один из самых распространенных видов задач — алгоритмические. И тут важно регулярно тренироваться, т.к. такие задачки не встречаются в реальной практике и нужно набить руку для успешного прохождения собеса.

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

☑️ Задача

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

👉 Примеры палиндромов:
«Шалаш»
«А роза упала на лапу Азора»
«И темен город. Мороз, узором дорог не мети»
«Кинь лед зебре, бобер — бездельник!»

➡️Рекомендации для нашего интерактива и для реального собеса:
Постарайтесь решить задачу без импортов библиотек, даже стандартных – на собеседованиях они часто запрещены
Не забудьте про нейминг и чистоту кода
Задайте вопросы, если не до конца понятна задача или критерии приемки
Не жульничайте — попытка загуглить решение или воспользоваться ChatGPT может закончится разоблачением и провалом собеса
Смотреть документацию можно
По возможности добавьте тесты, хотя бы те же assert
🔥3
☑️ Возвращаемся к вам с нашим вариантом решения:

def is_palindrome(input_line: str) -> bool:
cleared_line = ''.join([symbol for symbol in input_line.lower() if symbol.isalpha()])
return len(cleared_line) > 1 and cleared_line == cleared_line[::-1]

test_palindromes = [
'Шалаш',
'А роза упала на лапу Азора',
'И темен город. Мороз, узором дорог не мети.',
'Кинь лед зебре, бобер - бездельник!',
]
test_not_palindromes = [
'Шалаши',
'12f21',
'Кинь лед зебре, бобер - крутой зверь!',
]

for palindrome in test_palindromes:
assert is_palindrome(palindrome)

for not_palindrome in test_not_palindromes:
assert not is_palindrome(not_palindrome)


Это не единственная возможная реализация решения.

В данном решении учтены следующие детали:
не забыли вычистить строку и преобразовать регистр букв к единому нижнему
воспользовались встроенными возможностями для инвертирования строки
использовали list_comprehension для простого цикла, чтобы упростить код
код отформатирован согласно PEP8
переменным и функции даны понятные названия
не забыли про корнер-кейсы — когда после удаления лишних символов остается пустая строка или всего один символ, который не является палиндромом
добавлены простые автотесты assert как для палиндромов, так и для строк, которые не являются палиндромами


У @LuSP7 получился отличный вариант, близкий к нашему. Вынос чистки от лишних символов в отдельную функцию приветствуем и оставляем обоим вариантам право на существование. Спасибо всем, кто поделился идеями здесь и в ВК!

На курсе «Профессия Middle Python/Django разработчик» мы готовим к прохождению технического интервью и разбираем похожие задачки.

➡️ Был опыт live coding на технических интервью? Делитесь своим опытом в комментариях!
👍1
⚡️ 17-19 октября примем участие в форуме Innovation week и расскажем о том, как сделать свою рабочую систему контрактов и не сойти с ума 🔥

От нас выступают спикерами Евгений Евсеев — основатель и технический директор Devman и Артем Каменев — операционный директор подразделения заказной разработки PelidTeam

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

🔣Дата мероприятия: 17-19 октября.

🔣Место: Москва, ВЭБ центр. Новинский бульвар д.31

➡️ Будете там же? Отмечайтесь в комментариях и увидимся на форуме!
🔥3
Каждый разработчик-бэкендер на Python умеет и регулярно пользуется Git-ом. В консоли, в десктопном клиенте или встроенным в IDE интерфейсе. Git позволяет управлять исходным кодом:
➡️ не перетирать изменения других разработчиков,
➡️ иметь несколько версий кода, смотреть предыдущие версии,
➡️ служит дополнительной документацией и помогает делиться кодом.

Об умении работать с Git спрашивают почти на каждом собеседовании на вакансию разработчика.

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

👉 Изучить работу с Git и Github можно в нашем мини-курсе
🔥51👍1