Александр (Новосибирск) собеседование python backend разработчик
Вставка
- Опубліковано 1 лют 2024
- t.me/UA-camPronin
Чат для общения python разработчиков и им сочуствующих. Свободное общение, тестовые и вопросы с собесов и прочее. Заходите, вам рады.
Моя тележка andpronin -- стучите, если что.
Поддержать канал: www.tinkoff.ru/rm/pronin.andr...
Обычно денежка идёт на книжки про питончик. Но иногда на светлое и тёмное.
Если Тиньков не даёт перечислить, стукните в личку телеги andpronin, придумаем что нибудь
Виш лист
Хорошие книги по Питончику, которые могу рекомендовать (и хочу купить с вашей помощью).
Изучаем Python. Двухтомник. Марк Лутц. Очень подробно и структурно (Хочу дождаться 6го издания.. )
• Изучаем Python с Марко...
Читаем и разбираем ее тут
Куплено (огромное спасибо зрителям)
Знакомство с Python | Бейдер Дэн (2023) - выглядит приятно для новичка
Чистый Python. Тонкости программирования для профи | Бейдер Дэн (2022) - хорошо для продолжения
Высоконагруженные приложения. Программирование, масштабирование, поддержка | Клеппман Мартин
Python. К вершинам мастерства | Рамальо Лучано - 2е издание - сложно для новичка, но интересно
Паттерны разработки на Python: TDD, DDD и событийно-ориентированная архитектура -- хорошо про то, когда какой фреймворк применять
Видимо, дальше появтся еще нескромные желания. Но пока - так
Мой канал про обучению python с нуля и до мидла Андрей+=Пронин
/ @pypronin
Я в других сетях
🔗Вконтакте: CaptPronin
🔗Дзен: zen.yandex.ru/id/5fbd33919412...
#python #питон #программирование #Андрей_Пронин #собеседование #
Самое показательное видео о том, кого выпускают с псевдо-курсов Яндекса/скиллбокс и тд.
Ребят, строго не судите. В своё оправдание только скажу, что последние полгода занимался чисто алгоритмами на Python, а к интервью вообще не успел подготовиться 😅
Помню месяца 3-4 назад интервью смотрел. Там наоборот ситуация была)))))
Молоток! Продолжаем двигаться к цели!
Палиндром жеж базовая база, какие алгоритмы?
@@user-zl5sp9yh1nКнута-Морриса-Пратта наверное:)
@@user-zl5sp9yh1n да обычная задачка, ну я её не выбирал, но решил
Ох, когда вижу, как кто-то тупит на собесах даже на элементарных вопросах и рука уже тянется писать гневно-саркастический комментарий - каждый раз одергиваю себя, ибо понимаю, что тупил бы не меньше, скорее всего:)
Александру - удачи!
Спасибо 😊
Уже говорил, что вообще не успел подготовиться и голова в итоге была забита сессией, а так даже рад что за полгода ещё не всё забыл)
Удачи парню!
А задачу с палиндромом нельзя было решить срезами? Сравнивая первую строку с второй перевёрнутой [::-1]. Или по условию надо было другим способом ?
Можно, хотел, но сбился и пошли уже так
Это было бы не кошерное решение, Андрей об этом прямо сказал вроде бы. На интервью хотят увидеть более "алгоритмическое" решение
Золотое у Вас терпение😂😂😂
Простой способ через while:
```
def is_polindrome(string):
head = 0
tail = len(string) - 1
while head < tail:
if string[head] != string[tail]:
return False
head += 1
tail -= 1
return True
```
самое красивое решение в одну строку)
def isPalindrome(x):
return x[::-1] == x
И сразу будет засчитано как провал
@@justman073 а почему? изза сложности? тогда надо было бы вводить изначальное условие с ограничением сложности. Но такое ограничение введено не было, а следовательно позволялось его додумывание на основании объема задачи. При таком объеме это не существенно. Поэтому это скорее был бы не провал, а вопросы, типа "а еслибы слово было из миллиарда букв?" и т.д.
Проходил эту задачку у Сергея Балакирева. Задачка изи на 3 минуты)
def is_palindrome(string):
for index in range(len(string) // 2):
if string[index] != string[len(string) - index - 1]:
return False
return True
Меня возьмут в Яндекс?
так же сделал, если что я следующий в яндекс за тобой)
Либо я чего-то не догоняю, допустим длина строки 10, цикл пробегается по значениям от 0 до 5, на первой проверке if сравнивает первый элемент с 4? Что за глупость
@@user-wh4pf7dt8w Как ты получил 4? len(string) = 10, index = 0, len(string) - index - 1 = 9.
@@UserName-xp4dkпринял
В YP только один ревьюер, это легенда (нельзя говорить его имя)
Мистер Кви не хочет вести собесы. Увы(
1вариант решения палиндрома (он же колхозный) def foo(value): return value==value[::-1]
2 вариант (уровень илита)
def foo(value):
If len(value) ==0:
return True
If value[0] != value[-1] :
return False
return foo(value[1:-1])
Мб что то и забыл, ибо пишу с телефона но суть такова
неиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсиюнеиспользуйрекурсию
Люди такие забавные тут сидят, наверно смотрят и думаю какие они умные, и могут все решить, поднимают свою самооценку
возможно, для неторых это важно
Ну, это было крайне слабо.
Первая задача, ИМХО, крайне лютая для собеса - там нужно посидеть и подумать насчет subquery или annotated - а, мб, и погуглить. Только если часто такое пишешь, то можно написать в пределах собеса.
Однако, это многое показало:
1. SQL он вообще не знает. После SELECT * там какая-то лютая дичь началась. Знал бы SQL, можно было бы, хотя бы, .raw() запрос кинуть.
2. Зачем-то ORDER BY туда приплетал, post_id...
3. Запрос, который он написал через ORM - тоже было крайне слабый: навскидку - у него фильтрация в методе .all().
4. Начал писать запрос не от модели, а от request - тут сразу минус за знание Джанги: 2 доп вопроса вида "что такое request" и "что такое objects, где он есть и зачем" - и все, фиаско.
Дальше перешли к алгосам. Человек ниже комментах написал, что пол полгода изучал алгосы. Это же он добавил в интервью. И еще добавил, что изучал сам Питон.
Ну, когда я увидел, что задача - проверка на палиндром, то для человека с базой в алгосах в полгода я предположил, что через 2 минуты он напишет готовый код. Особенно после того, как он дал наиболее эффективный алгоритм для этой задачи. Еще и пафосно так назвал это "наивным алгоритмом, который первый пришел в голову".
Но когда я увидел, как он код пишет...
5. Как можно пропустить двоеточие в конце if? Я такого не смог бы понять, даже если бы код писался без подсветки синтаксиса. Но тут даже Пичарм сам подсвечивает место синтаксической ошибки...
6. Положить в head и tail определенные символы строки - сомнительно, ну окай. А дальше он это назвал указателями и писал код совершенно для другого.
7. Сравнить конкретный символ строки со срезом?
8. Его совсем не смутило то, что его код 2 раза проверяет одни и те же пары символов.
9. Оценка сложности - тоже тотальнейший провал. О(n) по времени, а потом начал считать, сколько элементов проходит его алгоритм. Это не совсем минус, а, скорее, звоночек.
10. А вот на оценке памяти уже был колокол: О(n) по памяти? Ладно, это не самое плохое. Но говорить о том, что дальше будут вызовы функции и это нужно учесть в оценке алгоритма в самой функции?...
И вот этот человек полгода алгосы изучал? Ну вообще хз. Как по мне, лучше бы он этого не озвучивал и пытался таким образом оправдаться - бы меньше вопросов и претензий возникло.
Как по мне, если человек полгода изучает алгосы, то он при этом решает задачи. А если человек решает задачи, то он пишет код. И не может человек вот с такой скоростью писать такой код через полгода реального изучения алгосов.
Как итог:
SQL, ОРМ, Джанго, алгосы и, что самое главное, Питон - все это очень слабо.
P.S. Есть те, кто на Джанге запрос составил из первой задачи? Скиньте, плз, хочу посмотреть на то, что в итоге получается.
У меня вышло:
SQL: SELECT * FROM Group AS g WHERE (SELECT COUNT(*) FROM Post AS p WHERE p.group_id = g.id) > 10
ORM:
post_cnt = Post.objects.filter(group_id=OuterRef("pk")).count()
groups = Group.objects.annotate(cnt=Subquery(post_cnt))
Но тут groups - это, кажись, словарь будет, где будут айдишники всех групп, а не нужные объекты. И по этому всему нужно будет еще и филтрацию обеспечить и сами объекты достать. А это уже N + 1...
Кароче, покажите мне правильный ответ! :D
from django.db.models import Count
Groups.objects.alias(count_posts=Count('posts')).filter(count_posts__gt=10)
@@Chel1k7, ого.
Это, я так понимаю, мало того, что Count через related_name отработает, так еще и фильтрация прям на месте доступна.
Весьма любопытно.
А как сам SQL запрос будет выглядеть? N + 1 не появится?
@@7IdEN+1 нету, тулбар вот так показывает запрос:
SELECT "category"."id",
"category"."title"
FROM "category"
LEFT OUTER JOIN "movie"
ON ("category"."id" = "movie"."category_id")
GROUP BY "category"."id"
HAVING COUNT("movie"."id") > 10
у меня вместо groups таблица category, вместо posts - movie
@@7IdE
```
SELECT "category"."id",
"category"."title"
FROM "category"
LEFT OUTER JOIN "movie"
ON ("category"."id" = "movie"."category_id")
GROUP BY "category"."id"
HAVING COUNT("movie"."id") > 10
```
нет n+1
@@7IdE ютуб почему то удаляет sql запросы, не могу скинуть его сюда, N+1 нету, всё окей
ббл штриф больше
Деточка, какие 50к? В других странах такие как ты сами за стажировку платят что бы с ним возились.
К вашему сведению у меня в портфолио 30+ учебных проектов и расценки я выбирал исходя из региона. Не надо обрушать ранок в угоду корпорациям и гнать людей работать за еду
@@dazzline7800 ключевая фраза "такие как ты". Потому что это был тотальный треш. Худший собес у Пронина за последние два года
@@dazzline7800 Реальные проекты (это те которыми хоть кто то пользуется) у тебя есть? Что то мне подсказывает что нет. А за рынок и корпорации не переживай, ты никому и даром не нужен.
Вот иди и сам за еду работай9
@@dazzline7800к вашему сведению вы на интервью полностью облажались, пусть у вас хоть миллион проектов на гите будут, с таким интервью они приравниваются к списанным проектам
1)
from django.db.models import Count
Groups.objects.alias(count_posts=Count('posts')).filter(count_posts__gt=10), запрос легкий, но надо вспоминать ситаксис джанго орм, я лично с первого раза не вспомнил это)
2)
def is_palindrome(string: str) -> bool:
first = 0
last = -1
center = len(string) // 2
while first < center:
if string[first] != string[last]:
return False
first += 1
last -= 1
return True
first < last - будет достаточно, если инициализировать через len(string) - 1.
Там надо вывести не 10 постов, а все посты, где их больше 10
@@dazzline7800 ну вот тут ты показал всю мощь своих знаний, красава
@@Chel1k7 ну я потом глянул вспомнить как вообще Джанго выглядело и половина сразу написал 😅
Как он сдал диплом и как он сдавал задания с такими знаниями .
Сам учился и понимаю как это не просто временами , даж если представить что он все списывал ,есть ведь ревью и защита .
Плюс только за смелость.
Как раз потому что и не записывал, так за полгода у меня уже всё повылетало из головы 😅
@@dazzline7800 про orm верю , но как индексы и срезы могли вылететь.
В любом случае удачи тебе , я сам волнуюсь на собеседование и многое забывается .
def is_palindrome(s: str)->bool:
return all((x==y for x,y in zip(s, s[::-1])))
лучше так: def is_palindrome(s: str)->bool:
if s == s[::-1]:
return True
return False
@@user-ok7xl2hl7t тогда проще return s == s[::-1]
В этом решении потребуется дополнительная память
@@over3089 единственное, для чего нужна дополнительная память - это построить обратный срез из s. если использовать reversed(s), она не потребуется
Хм. А я вот так сделал:
def is_palindrome(string: str) -> bool:
new_string = string[::-1]
return True if new_string == string else False
Нормальное ли это решение с точки зрения алгоритмов? Может оно жрет дофига памяти, я в этом очень плохо разбираюсь. Мурыжу пока Codewars, до leetcode не добирался