Собеседование junior python разработчик Евгений Путрин | Галина Трошкина и Василий Туртугешев
Конференция по кибербезопасности Positive Hack Days, 18-19 мая 2022
- Доклады и кейсы от экспертов кибербеза;
- 30-часовая кибербитва The Standoff.
Приходите на бесплатную трансляцию!
event.phdays.com/
Ваши лайки 👍 колокольчики 🔔 и подписки мотивируют продолжать.
Полное собеседование python разработчика (некоторые вопросы по сложности ближе к middle или junior+). На этот раз на вопросы отвечал мой подписчик. Надеюсь, в дальнейшем подобные вещи будем проводить с некоторой регулярностью.
00:00 Представляем участников
03:41 Начинаем. Немного рекламы и правила собеседования
05:30 Разминочные вопросы про python - плохо. Помогли Иван и Галина
11:57 Словари, списки, функции - скорее хорошо, но можно лучше
38:02 ООП. Паттерн фабрика - хорошо
52:20 Алгоритмы. Сложность - средне
55:40 Управление версиями и SQL-запросы - скорее хорошо. Помогла Галина
1:31:46 Стек - плохо. Помогла Галина
1:38:51 Общий фидбек
ИТОГО: В целом, неплохое впечатление. На оффер можно рассчитывать
🔔ПОДПИСЫВАЙТЕСЬ:🔔
🔗Вконтакте: CaptPronin
🔗Дзен: zen.yandex.ru/id/5fbd33919412...
#python #собеседование #phdays
Пікірлер: 384
00:00 Представляем участников 03:41 Начинаем. Немного рекламы и правила собеседования 05:30 Разминочные вопросы про python - плохо. Помогли Иван и Галина 11:57 Словари, списки, функции - хорошо 38:02 ООП. Паттерн фабрика - хорошо 52:20 Алгоритмы. Сложность - средне 55:40 Управление версиями и SQL-запросы - скорее хорошо. Помогла Галина 1:31:46 Стек - плохо. Помогла Галина 1:38:51 Общий фидбек
Спасибо большое за видео, вы молодец всегда что-то новое :) По видео, ребята те кто учатся сейчас, и думаю что у них не получится и думают что в IT одни гений, в данном видео можно убедится что это не так ))Вот тут надо было пару задач накинуть на алгосы ))
@AndyPronin
2 жыл бұрын
Надеюсь, будет полезно. Постарался хорошие вопросы подобрать. Мне Евгений признался, что смотрел-слушал мой канал перед сном) Не люблю алгосы, если честно) да ещё на полчаса бы видос затянули. Итак уже под конец устали, на самом деле. В другой раз.
Ну этот формат конечно намного по приятнее) Намного больше вопросов, разнообразие. Спасибо
@AndyPronin
2 жыл бұрын
Такое будет не всегда), но время от времени буду гонять большие собесы
@exe88cution
2 жыл бұрын
@@AndyPronin и это радует)
Класс !Смотрю и понимаю как же много всего нужно знать ....
@AndyPronin
2 жыл бұрын
Но эти знания вполне умещаются в одном человеке) Не переключайтесь. Закончим с Лутцем, будем другие книжки читать.
@karasik5695
2 жыл бұрын
@@AndyPronin Лучано Ромальо надо))
Спасибо большое! Отличный контент.) По мне так в задаче с вызовом функции с двумя списками для вывода словаря, вместо того, чтобы создавать еще одну функцию в условие length > len(first_list) просто вставить присвоение length = len(first_list).
@AndyPronin
2 жыл бұрын
Хороший вариант.
@Lena-bx4rq
2 жыл бұрын
я бы наверное так же сделала. А вообще ничего ты не понимаешь, чем сложнее написан код, тем меньше комментов будет в код-ревью, ибо сложно - знач так надо, и пусть живет / лень разбираться, соответственно меньше работы. (последнее предложение конечно ирония, но я проверяла, иногда так работает хД )
@AndyPronin
2 жыл бұрын
@@Lena-bx4rq простое лучше сложного
@user-zn5nr1cr4b
2 жыл бұрын
Можно было бы и присваивание не делать, а заодно и учитывать ситуацию, когда длина листов может быть разной. Например, for i in range(min(length, len(list_a), len(list_b)):
@lbbMHz
Жыл бұрын
а я бы просто в переборе в ренж написал вот так range(length if length < len(first_list) else len(first_list))
Классно, здорово, спасибо что делаете такой контент. Интересно смотреть. Учусь на бэкендера, такие видео помогают мне преодолевать синдром самозванца. Мне кажется, что такой уровень сложности собеседования сейчас сложно найти джуну.
@AndyPronin
2 жыл бұрын
нужно сложнее или проще?
@evgeniik6115
2 жыл бұрын
@@AndyPronin больше похоже на вопросы для стажеров, не для джунов. Быть может не прав, на реальных собесах не был.
@rostikniks
Жыл бұрын
@@evgeniik6115 Так иди тогда работать тогда, чего учишься ещё. Если это вопросы для стажёров - значит сможешь на них ответить! Через полгода напишешь, как у тебя там)
@katerinadevis9222
Жыл бұрын
ПРОНИН любит делать гадости и мелкие пакости другим. Так и не повзрослел дятел стучащий по клаве.
Очень достойно с вашей стороны Андрей, что вы даёте вашему собеседнику шанс не утопить себя, по темам ваших вопросов, сделал для себя вывод, что вдохновение вы черпаете у Дэна Бадэра, кстати очень хорошая книга и сам его проект
@AndyPronin
2 жыл бұрын
Дэн очень хорош. Да. Постараюсь, как Лутца закончим, его книгу в разбор взять.
По задачке с словарем сделал так: print({i+1 : string.ascii_lowercase[i] for i in range(20)})
Большое спасибо за ролик . Благодарю нему понял , что я не так уж и плохо знаю Python )
@AndyPronin
2 жыл бұрын
не переключайтесь
Andrey += Pronin спасибо за этот опыт! А Евгений молодец просто!
@AndyPronin
2 жыл бұрын
Хорошо получилось.
Спасибо за собес! Было позновательно)
@AndyPronin
2 жыл бұрын
Отлично получилось.
@ibrahimoglu
2 жыл бұрын
👍
задачку со словарем можно решить вот так result = {i: ascii_lowercase[i - 1] for i in range(1, int(input()))} . вывод у него был только z у всех чисел потому что range проходит по всем буквам и перезаписывает значение, то есть 1 == 'a' потом 1 =='b' и так до z. Это хорошо видно на отладчике если хотите посмотреть Ещё один вариант dict(range(int(input()), ascii_lowercase) :(
@Nemesis-dz6me
2 жыл бұрын
Ещё один вариант : dict = { i : chr(96+i) for i in range(1, input()) }
@yukikomarise1591
2 жыл бұрын
Или так dict1 = dict(list(zip(range(1,21), string.ascii_lowercase)))
Со словарём просто {(chr(ord('a')+i)): i for i in range(20)} {a: i for i, a in enumerate(ascii_letters, 1) if i < 20}
@AndyPronin
2 жыл бұрын
кстати, энумирейт очень клёвая идея.
@Sadownick
2 жыл бұрын
А добавить индекс к string.ascii_lowercase? В виде string.ascii_lowercase[a - 1], тогда как “a” в range будет от 1 до 20, а из строки букв алфавита будет выдёргиваться нужная по индексу буква p.s. enumerate да, действительно хорошая идея, если не ошибаюсь он на больших объёмах информации даже быстрее отрабатывает
20:30 запутали парня сказав сначала что функция два словаря принимает) Он потом slice от словаря пытался сделать вместо списка и потом в цикл полез, а решение только на 33:20 Вы уже помогли. У меня так на собесах было пару раз, когда волнуешься немного и за каждым словом интервьюера следишь - мозг может от одного слова сломаться) Из прикольного можно ещё в описание кидать репку с заданиями, чтобы можно было их параллельно с просмотром проходить, тогда полноценный курс подготовки к собесам уже получается) По сложности я бы сказал что часть со структурами данных и алгоритмами ультралёгкая, ни на одном собеседовании мне не попадалось ничего подобного, как минимум легкий уровень задач с литкода, two_sum и подобная веселуха) Так что было бы более реалистично эту часть расширить. Доброжелательность и поддержка на высоком уровне, буду держать кулачки чтобы мне такие интервьюеры попадались)
@AndyPronin
2 жыл бұрын
Отличный фидбек. Спасибо, учту. Постараюсь добавить сложности
dict1 = {a: x for a in range(1, 21) for x in string.ascii_lowercase[a-1]}
Спасибо!
@AndyPronin
2 жыл бұрын
Рад, что было полезно
Прикольно получилось очень
{ a : y for a, y in zip(range(1,21),string.ascii_lowercase)}, так ещё можно
Спасибо за годный контент! Мне кажется, что можно улучшить процесс поиска людей через Google Forms. Там можно организовать сбор нужной информации. В том числе можно добавить критерий для фильтра (предполагаемый уровень, реальный уровень (если работает), и тд).
@AndyPronin
2 жыл бұрын
Процесс отбора планирую изменить. Да. Спасибо
Для однострочников: {__import__('string').ascii_lowercase[x - 1]: x for x in range(1, 21)} (lambda x: {__import__('string').ascii_lowercase[x - 1]: x for x in range(1, x)})(some_x)
@nikitabbrv5947
2 жыл бұрын
эт джуновский уровень? )
@user-ij8jc7zm7i
Жыл бұрын
@@artyomby4125 Магические числа +1, +2. По заданию должно быть первых 20 букв, а у тебя - все. Ну и сама конструкция сложна для понимания, если человек видит её впервые
Ребята молодцы, может вам конечно было не слышно по ту сторону экрана, но я активно подсказывал по части SQL)))) особенно на агрегатках )))
@AndyPronin
2 жыл бұрын
Да, жаль что не услышали)
@agens9538
2 жыл бұрын
@@AndyPronin давайте онлайн собеседование с чатиком )
@AndyPronin
2 жыл бұрын
@@agens9538 по стране из края в край ходит чатик -помогай) я подумаю, спасибо
Функция в функции конечно хорошо, но if length>len(first_list): length=len(first_list)
@igor_k123
2 жыл бұрын
ещё проще min()
dict_1 = {a: string.ascii_lowercase[a - 1] for a in range(1, 21)}
Здорово, получается у меня почти достаточно знаний для джуна, хотя углублённо прогу не изучал
import string dict1 = dict(zip([i for i in range(1, 21)], [l for l in string.ascii_lowercase])) lst = [i for i in range(1, 21)] def func(l1, l2, length): return dict(zip(l1[:length], l2[:length])) func(lst, string.ascii_lowercase, 150)
Классный видос! Смотрел и по ходу старался решать. Со словарем вышло это (вроде без зипа даже): можно так? def func(qty): return {chr(96 + i):i for i in range(1, qty + 1)} print(func(3))
@AndyPronin
2 жыл бұрын
Наверное, да. Почему нет. Смущают магическое число 96 - но, в целом, вполне себе решение
@jeen9984
2 жыл бұрын
Еще так можно: from string import ascii_lowercase d = {c: i+1 for i, c in enumerate(ascii_lowercase)}
@AndyPronin
2 жыл бұрын
@@jeen9984 обычно хорошая задачка подразумевает собой нескольно решений
Подумать над простым словарём))
я бы задачу со словарем сделал так: dict1 = {letter: num for letter, num in enumerate(string.ascii_lowercase, start=1)} В целом спасибо за такой выпуск, сам формат вполне годный. Понравилось.
@AndyPronin
2 жыл бұрын
хорошее решение.
@d4vlL
2 жыл бұрын
только просили первые 20, так что нужно еще срезать строчку
@Vasile4e4ek
2 жыл бұрын
Найс, вот я и узнал, что энумерейт принимает ещё один аргумент. Годный коммент.
@nergal7537
2 жыл бұрын
Я её решил так: dict1 = {a: x for a in range(1, 21) for x in ascii_lowercase[a - 1]}
@Hamsters_Rage
2 жыл бұрын
i, chr(ord('a') + i)
Касательно задачки со словарем: dict_1 = {chr(64 + i): i for i in range(1, 21)} можно было использовать такую конструкцию
@liltousin
Жыл бұрын
dict_1 = dict(enumerate(chr(ord('a')+i) for i in range(20), start=1))
@mkalalaka
Жыл бұрын
немного ненадежно. chr(64). я делал с вариантом ord('a') и отталкивался от кода символа. тоже так себе решение, базируется на предположении что последовательность букв постоянна и непрерывна.
@mkalalaka
Жыл бұрын
@@liltousin enumerate дает обратный порядок полей. сначала будет буква, а потом цифра, а по заданию надо наоборот, цифра это ключ.
@alexseydugin8109
Жыл бұрын
{index: char for index, char in zip(range(1, 21), ascii_letters[:20])}
@derekstackboy6583
Жыл бұрын
{x: string.ascii_uppercase[x - 1] for x in range(1, 21)}
Генератор словаря, проще простого dictionary = {key : a[key - 1] for key in range(1, 21)}
11:20 - вывод неверный. Мы можем использовать и менять переменную, объявленную ранее в глобал скоуп внутри функции без объявления её глобальной. Ошибка вылезает не поэтому. А потому что у нас эта переменная находится по обе стороны от знака равно. Но если мы не будем так делать, а сделаем внутри функции вот так: X = 5, то не найдя в локальном скоупе ссылок на значения, интерпретатор перейдет в глобальный скоуп и переназначит ссылку с 10 на 5 для переменной Х. При этом никакой ошибки не возникнет.
@AndyPronin
2 жыл бұрын
x = 10 def foo(): x = 5 print(x) foo() print(x) >>> 5 >>> 10 Кажется, локальная x и глобальная x -- это таки разные x. x = 10 def foo(): print(x) x = 5 print(x) foo() print(x) UnboundLocalError: local variable 'x' referenced before assignment. Получается, что он даже не идет в глобальный скоуп, если есть локальная перменная с таким именем
@user-pw9sn6ih9e
2 жыл бұрын
@@AndyPronin да, если объявлена локальная переменная, то работаем только с ней. В вашем первом примере мы создали сначала глобальную переменную, затем локальную переменную, и у нас появилось две переменные, каждая в своем скоупе. Если просто начать обращаться к переменной внутри функции, то интерпретатор будет последовательно её искать: сначала в локальном скоупе. Если там не найдет, то в глобальном скоупе. Если и там не найдет, то в импортируемых модулях. Если и там не найдет, то во встроенном скоупе. Если и там не найдет - скажет, что такой переменной нет. В нашем втором примере, интерпретатор сначала смотрит весь код функции, и если там объявлена переменная (вне зависимости от того, в каком месте внутри функции это произошло), то он сразу же забывает про все вышестоящие скоупы и не лезет вверх. И поэтому во втором примере вылезает ошибка. Собственно, если бы мы изменили переменную немного по-другому, например, вместо X += 1 написали X = 11, то ничего бы не случилось. Потому что в конструкции X += 1 идет чтение и одновременно присваивание переменной Х. То есть, происходит некая коллизия - непонятно, мы должны создать новую локальную X со значением глобальной Х, к которой прибавили единицу, или это мы работаем с глобальной переменной Х, и к ней нам нужно прибавить единицу.
Хорошое и познавательное видео. Первую задачку можно было сделать через функцию chr(), у меня получилось так: dct = {chr(i+96): i for i in range(1, 21)}
@AndyPronin
2 жыл бұрын
да. можно и так. Но мне хотелось еще посмотреть, как он будет вести себя при использовании незнакомой библиотеки
@kostya2186
2 жыл бұрын
@@AndyPronin или в его случае dct = {d: string.ascii_lowercase[d - 1] for d in range(1, 21)}
@GloryToUkrainianRus
Жыл бұрын
@@kostya2186 отлично, у меня такое же решение)
@johannesgarin6559
Жыл бұрын
from string import ascii_lowercase as letters dict1 = {i+1: letters[i % len(letters)] for i in range(20)} как пример с модулем string, но я бы сделал тоже с использованием chr(): dict2 = {x+1: chr(x+97) for x in range(20)} Кстати, было интересно, с какой натяжкой была реализована функция для вывода этого же словаря с параметром длины, в то время, когда заранее уже были преобразованы 2 списка в словарь. Я бы сделал так: from string import ascii_lowercase as letters lst1 = list(range(1, 21)) lst2 = list(letters)[:20] def func(lst1, lst2, length): if length > len(lst2): length = len(lst2) return dict(zip(lst1[:length], lst2[:length])) for i in range(25): print(func(lst1, lst2, i))
задачка со словарем была почти решена в начале, немного не дотянул. Может так не корректно, но у меня заработало. dict1 = {a: x for a in range(1, 21) for x in string.ascii_lowercase[a-1]}
насколько я понял, сложность алгоритма фибоначчи заключается в том, что мы возвращаем fib(n-1) + fib(n-2), и так получается, что fib(n-1) неизбежно считает первое значение fib(n-2) , то есть предыдущие значения считаются по два раза, и весь процесс ветвится как бинарное дерево, следовательно сложность алгоритма растёт примерно как O(2**n). Если я не напутал ничего, конечно же
@AndyPronin
2 жыл бұрын
Ага. Хороший алгоритм) быстрый
@user-NisserBlahman
2 жыл бұрын
@@AndyPronin помимо этого , может еще быть лимит по вхождениям рекурсий, в Cpython он вроде 1000 по умолчанию
@AndyPronin
2 жыл бұрын
@@user-NisserBlahman не помню. Но да, что то типа такого
Спасибо
@AndyPronin
2 жыл бұрын
Рад, что нравиися
Я поставил на паузу и решил......... dict1 = {a+1 : str(x) for a in range(0, 26) for x in string.ascii_lowercase[a]} # Делаем смещение в индексе чтобы начиналось с 1 >>> {a+1: print(dict1)
Kstati, berite na zametku, esli nado sgeneriroat' list ot 1 do 20, to luchshe vsego eto sdelat' tak: list(range(1, 21))
не смог досмотреть до конца, ребята вы монстры :)
@AndyPronin
2 жыл бұрын
Там есть тайминги) всегда можно вернуться к просмотру. Но в целом, примерно так и выглядит хардовое собеседование полного цикла
@agens9538
2 жыл бұрын
@@AndyPronin позже досмотрю, Сишарперу трудновато понять Питониста :)
@agens9538
2 жыл бұрын
@@AndyPronin, есть с чем сравнить, особенно пару предыдущих через один собеседования...
@AndyPronin
2 жыл бұрын
@@agens9538 там кусок с скюэл будет боль менее понятным)
>ИТОГО: В целом, неплохое впечатление. На оффер можно рассчитывать куда?
@AndyPronin
2 жыл бұрын
Вообще, он уже работает. )
Как же я хорошо прогаю по сравнению с ними. Спасибо за поднятие самооценки
@AndyPronin
2 жыл бұрын
не переключайтесь
@san9blin
2 жыл бұрын
)))
@serhiipavlenko9024
2 жыл бұрын
Давай на стрим покажи скилл
@AndyPronin
2 жыл бұрын
@@serhiipavlenko9024 pvp или зассал?) увожаемо
@yan200go
2 жыл бұрын
@@serhiipavlenko9024 Я не стример, но уж явно пишу лучше этих. А то чел не знает что такое линтер или как решить простую задачу)
27:18 ------------- import string l1 = [1,2,3,4,5,6,7,8,9,10] l2 = ['a', 'b', 'c', 'd'] dict1 = {i: string.ascii_lowercase[i] for i in range(21)} print(dict1) def func(li_1, li_2, length): return {li_1[i]: li_2[i] for i in range(length) if i print(func(l1, l2, 500)) -------------- Имеет право на жизнь? Если что я только учусь. Дальше пока не смотрел но жутко интересно)
Чет как-то усложнили все. Задачки решаются в 1-2 строчки) В любом случае, очень познавательно. Спасибо!
@AndyPronin
2 жыл бұрын
Всегда можно лучше. Это первое правило инженеров)
@PsdmasterRu
2 жыл бұрын
@@AndyPronin Спасибо за такие видео, я прям залип на канал))) Столько для себя мелочей для собесов подчерпнул
@AndyPronin
2 жыл бұрын
@@PsdmasterRu жаль, что не выиграл)
@RushFuture
2 жыл бұрын
Расшифровку ASCII я ещё смог перетерпеть, но генерацию словаря через модуль string (причём это был совет автора канала) - это был уже перебор :)
@user-pw9sn6ih9e
2 жыл бұрын
@@RushFuture поддерживаю, CHR/ORD в помощь
Спасибо большое за видео и смотреть интересно и приятно, и порой заставляет задуматься. У меня несколько вопросов, повлияло б на впечатление, если б я не использовала к примеру zip а использовала простой цикл import string from collections import defaultdict dictionary = defaultdict() for i in range(1, 21): dictionary[i] = string.ascii_letters[i-1] или как альтернативный вариант ASCII_first_letter_a = 97 for i in range(1, 21): dictionary[i] = chr(ASCII_first_letter_a+i) Вопрос второй, я вот смотрю не первое видео, ребята результат смотрят через принт. Это не раскрытый потенциал, или правилами запрещенно поставить брейкпоинт и покопаться в том, что же у меня какая строка делает? И вопрос третий. Я работаю разработчиком, но меня часто кидают по темам и языкам. Я вполне могу сконцептировать проблему, но у меня с девичей памятью косяки с синтаксисом. Вопрос в следующем, насколько Ты бы обратив внимание на косяки в синтаксисе, если я правильно обьянила (и ты это понял), что надо сделать для решения задачи?
@AndyPronin
2 жыл бұрын
Для Джуна отладка через принт на мой взгляд приемлема. Но это, кнешн, не лучший вприант
@AndyPronin
2 жыл бұрын
На собеседовании если проговорить логику решения, а потом забыть что то а синтаксисе - не страшно. Адекватный интервьюер подскажет
@AndyPronin
2 жыл бұрын
По циклу - спросил бы другой способ реализации и постарался натолкнуть на дикт компрехеншн. Это, в моём понимании - более питоняче, чем цикл. Но, как первое решение - норм
@AndyPronin
2 жыл бұрын
А зачем дафаултдикт? Чем простой словарь не нравится?
@AndyPronin
2 жыл бұрын
Рад, что понравилось
Здраствуйте, хорошее видео, познавательное очень. Не подскажите где можно обучиться отправлять запросы по базам данных SQL. Какие-нибудь информативные видосы, каналы на эту тему. Буду очень благодарен за ответ!
@AndyPronin
2 жыл бұрын
Довольно много курсов на степике бесплатных видел. Думаю, там можно
@nikitabbrv5947
2 жыл бұрын
на степике есть хороший бесплатный. там даже оконки есть.
@AndyPronin
2 жыл бұрын
@@nikitabbrv5947 название напишешь? Ссылку ютуб не пропустит
@nikitabbrv5947
2 жыл бұрын
@@AndyPronin " Интерактивный тренажер по SQL "
Ого, давно не заходил, 85к просмотров, вот это да))
@AndyPronin
Жыл бұрын
Время бежит)
Привет, подскажите, спрашивают ли по поводу асинхронного программирования? И еще, возможно ли что бы Вы проводили собес в стили написать, к примеру, веб сервис на джанге, где будут задания по ооп, алгоритмах и sql?
@AndyPronin
2 жыл бұрын
И сделать это за час? Камон) сторонники такого обычно дают тестовое задание, а потом на собеседовании его обсуждают, с наводящими вопросами, сам ли это кандидат написал или нет
@black_grizzly
2 жыл бұрын
@@AndyPronin этот подход лучше, как мне кажется. Могу ошибаться.
@AndyPronin
2 жыл бұрын
Асинхронку спрашивают. Обычно на уровне понимания. По джанге проведу с типовыми вопросами. Прям сервис не получится. Но определённый кусочек, пожалуй, да.
@AndyPronin
2 жыл бұрын
@@black_grizzly вполне подход. Да. Включу что нибудь по стеку
можно было в начале словарь сделать функцией enumerate данная функция говорит индекс текущего элемента если в цикле for
52:40 Сложность этой реализации Фибоначчи O(2^n) по времени и O(n) по памяти. Реальная загадка - почему анализ сложности это "угадайка" и "загадка".
учу Python 1.5 мес вот что придумал на скорую руку по заданию со словарями import string x = {i+1: string.ascii_lowercase[i] for i in range(20)} def func(dict1, keys): if keys >= len(dict1): return dict1 dict2 = {i: dict1[i] for i in range(1, keys + 1)} return dict2 print(func(x, 2))
@AndyPronin
2 жыл бұрын
Очень хорошо. Кажется, имеет смысл продолжать учить)
@smbatadamyan220
Жыл бұрын
@@AndyPronin Здравствуйте а если так? x = dict(zip((i+1 for i in range(20)), string.ascii_lowercase)) print(x) а функция так def func(keys:list, values:list,length:int): length = min(len(keys), length) return dict(zip(keys[:length], values))
На сколько корректно в классметоде использовать название класса? Не правильней ли будет юзать cls?
@AndyPronin
2 жыл бұрын
правильней cls, канешн
@PurpleDaemon_
2 жыл бұрын
Максимально некорректно. Весь смысл классметода исчезает.
@RusShbreak1
Жыл бұрын
Смотря для чего, если вызывается статик метод, лучше использовать имя класса, т.к. ни к классу, ни к экземпляру статик методы отношения не имеют. Второй случай - если идет доступ к члену класса, расшаренной переменной, тогда имя класса будет читаться лучше, чем cls. Есть и другие кейсы.
небольшое наблюдение, на канале Хекслет (на который подписано 80к человек) собеседование python разработчика посмотрело всего 4.4к, в то время, как здесь за день уже 9к просмотров, так что, Андрей, направление взято верное=)
@AndyPronin
2 жыл бұрын
Хочу верить, что это из-за моей всепобедимой харизмы))) Спасибо за лестное сравнение
@user-yy3ox1mp1p
Жыл бұрын
А че толку то смотреть собеседования? на них самому ходить нада-)
29:30 не проверятся длина второго списка следовательно если второй список будет короче первой а параметр length больше то опять будет ошибка
@AndyPronin
Жыл бұрын
Надо сказать, у задачи есть более изящное решение. Да.
дикт надо было делать так: d = {x+1: y for x in range(0, 20) for y in string.ascii_lowercase[x]}
круто 👍 спасибо, даёшь раз в пару месяцев фейковые собесы 😇
@AndyPronin
2 жыл бұрын
А я реальные и не выкладываю. Это nda
@x-user-agent
2 жыл бұрын
@@AndyPronin я имел в виду с «простыми» людьми с ютуба) предыдущие это вроде участники курсов, а тут живой шанс попробовать свои силы)
@AndyPronin
2 жыл бұрын
@@x-user-agent Ага. Евгений хорошо выступил. Мне понравилось
import string dict1 = {i: string.ascii_lowercase[i - 1] for i in range(1, 21) } print(dict1) Для особо умных
@TheUsersName
2 жыл бұрын
dict1 = {i + 1: chr(97 + i) for i in range(20)} print(dict1) Для гениев (нет)
и это на джуниора собес?? скорее на стажировку бесплатную d = {i: j for i, j in zip(range(1, 21), ascii_lowercase)}
А можете мне объяснить? Я в ступор впал, с примером spam(), если мы объявляем переменную в глобальном контексте мы потом в любой функции можем его использовать как угодно, т.к. если переменной нет в локальном контексте она подхватывается с глобального контекста, а вот "x += 1" или ему аналогичная x = x + 1 не работает
@AndyPronin
2 жыл бұрын
Области видимости будут в главе 17. ) Когда питон видит вот такое: x = он пытается инициализировать локальную переменную x и ожидаемо ломается
@user-qj3ij4ux6r
2 жыл бұрын
@@AndyPronin т. Е. Всё дело тут в инициализации? Как то не очень прозрачно)
@AndyPronin
2 жыл бұрын
@@user-qj3ij4ux6r скорее, в области видимости. Ну маемо шо маемо
Добрый день! Отличный контент, благодарю :) И ребята молодцы ;) Правда, у меня остался вопрос по SQL, может, кто разъяснит: В последнем запросе 1:30:39 в части group by находится только sub_name, а в области select используются агрегатные функции только для price, а для name не используются. Насколько я помню везде в select должны быть агрегатные функции, кроме тех полей, что прописаны в group by. И почему-то запрос сработал у вас. Почему? :)
Добрый день! Первую задачу по генерации словаря можно таким образом решить или криво? dict_1 = {key: string.ascii_lowercase[key:key+1] for key in range(1, 21)}
@x_107
2 жыл бұрын
А зачем ключу слайс значением делать? Почему не просто key - 1?
@TheDeiterium
2 жыл бұрын
@@x_107 Во, так изящнее! ps. я же вкатывыльщик, плохо соображаю :)
в задаче с словарем намутили конечно вот как мне кажется более оптимальное решение def make_dict(lst1, lst2, lenght): if lenght > 26: lenght = 26 return {k: v for (k, v) in zip(lst1[:lenght], lst2)}
@AndyPronin
Жыл бұрын
Возможно. Нужно понимать, что писать код в режиме онлайн - это стресс. И мозги работают иначе
@pythonForEvOne
Жыл бұрын
@@AndyPronin даб да я об этом тоже подумал и принял во внимание
Андрей, доброго времени суток, подскажите, пожалуйста, как можно было бы попасть на такое событие
@AndyPronin
2 жыл бұрын
Приветю Следите за каналом. Буду набирать время от времени
Нравиццо! Моя приятная! )
@AndyPronin
2 жыл бұрын
Пжалста, смотри.
Прикольно, что питон это не мой профиль. dict1 = {a: x for a, x in zip(string.ascii_lowercase[ : 20], range(1, 21) ) } потом, если делать функцию, то вот так: def merge_to_dict ( list_1, list_2, length): return dict( zip( list_1[:length], list_2 ) ) Она и работает не за O(n**2), как у собеседуемого, и проверки лишние не нужны, хоть миллиард суй, больше длины листа не выдаст Дальше пока не посмотрел. UPD: убрал второй slice, узнав в видео, что он не нужен Спасибо за собес!)
@AndyPronin
2 жыл бұрын
хорошее решение
Уровень участников разный , один как батя все тащить и двое как дети наблюдают 🤣
Интервью понравилось, вопросы хорошо подобраны, все темы затронуты. Сам сейчас ищу работу, хожу по немногочисленным собесам. Наблюдаю тенденцию что джуновских вакансий почти нет, или зачастую компанию ищут мидлов на ЗП Джуна. Что думаешь Андрей по этому поводу?
@AndyPronin
2 жыл бұрын
Мидл по цене Джуна - это классика. Всегда так было. Я бы сказал, что можно на мидловые собесы смело ходить
@nullptr_or_null8301
2 жыл бұрын
Так это нормально, если просто разместить вакансию на питон разработчика мидла с окладом по рынку, налетит много на нее, причем независимо от уровня (там будут как соответствующие этому уровню, так и нет) , а вот если разместить вакансию с нормальной за, на Data Science, с применением питона, откликаться на нее будет только одни даже близко не соответствующие этому уровню, у питона входной порог слишком низкий, так что соискателей требующих норм зп и соответствующих уровню мидла и выше более чем достаточно на рынке, а вот чтобы найти ниже рынка это задачка, впрочем думаю в ближайшее время их будет более чем достаточно даже на пониженную зп.
@nullptr_or_null8301
2 жыл бұрын
@@AndyPronin "Я бы сказал, что можно на мидловые собесы смело ходить" - теперь понятно, кто гадит работодателям.
@AndyPronin
2 жыл бұрын
@@nullptr_or_null8301 Если скилл позволяет - то чеб нет) Вот, например, у Евгению из этого видео чуток подкачаться и вполне имеет смысл
не программирую на питоне) но логично было бы def func(first_list, second_list, length): if (length > len(first_list)): length = len(first_list) тут цикл))
@AndyPronin
2 жыл бұрын
отлично, кстати.
@Kirill0094
Жыл бұрын
@@AndyPronin length = min(length, len(first_list))
@smbatadamyan220
Жыл бұрын
По любому надо проверить еще и с длиной второго списка. на видео не выдало ошибок так как второй список не был короче первого.
@smbatadamyan220
Жыл бұрын
@@Kirill0094 length = min(length, len(first_list), len(second_list))
А что, вы используете для таких онлайн-собеседований
@AndyPronin
2 жыл бұрын
Zoom
камеры чуть больше надо, а так спасибо, за материал))
@AndyPronin
2 жыл бұрын
что значит: больше камеры?
@poplor
2 жыл бұрын
@@AndyPronin в правой стороне людей почти не видно
@AndyPronin
2 жыл бұрын
@@poplor зум так устроен( ок. Попробую что-нибудь придумать
что за книга
def spam(length): return {idx: string.ascii_lowercase[idx - 1] for idx in range(1, length + 1) }
@vaccino3668
2 жыл бұрын
клоун, у тебя выход за границы массива не обрабатывается
Я хоть и новичок, но смог решить первую задачу в одну строчку: Dict = {i: chr(96+i) for i in range(1, 21)} Я использую элементы из asii таблицы
@user-ur3mc6hb5d
Жыл бұрын
хороший вариант. Я через енумерейт с импортом сделал. Как вариант. Но твой без библиотек даже лучше
Простите, а можно на собеседовании гуглить? Я бы да)
У Вас опечатка на экране заставки в Вашем любимом слове «Python».
@AndyPronin
2 жыл бұрын
Так и задумано)
Объясните, правда ли существуют такие собеседования? Мне кажется, что формат собеседования довольно странный, множество заданий просто теряют смысл, если интервьюемый не знает какой-то функции, а в реальной работе гуглится это на раз-два. На собеседовании - главное понять как человек соображает и насколько он обучаемый (интервьюер может помочь подсказкой и посмотреть на его реакцию). Кажется, с этим хорошо справляются задачи с литкода.
@kanatatakonys5318
Жыл бұрын
@@RMDiscovery опять же, потерять потенциального лучшего из-за забытой функции - так себе удовольствие
@karington1168
Жыл бұрын
@@RMDiscovery Что за бред Плохой программист не пройдёт испытательный и пойдёт дальше проходить собесы. Задача собеседования, а тем более собеседования на джуна, понять что перед тобой человек который не первый раз видит компьютер, и печатает быстрее бабушки. А если человек отвечает на вопросы по ООП, сложности алгоритмов, декораторы и фабрики, то это уже собеседование на мидла "Крупные компании могут позволить себе лучших из лучших, поэтому им немного не до "соображающих и обучаемых" -- Это откуда такая мысль? Как раз таки мелкие компании не могут себе позволить кого-то кто будет учиться и раскачиваться, им нужны люди, которые будут показывать результат. В то время как большие компании с большими бюджетами могут себе позволить взять 30 человек на испытательный, и оставить из них троих через 3 месяца, что будет сильно эффективнее и дешевле чем пытаться найти этих троих через собеседования
👍
обнять и плакать 🥲
Что бы сформировать массив из первых 20-ти символов алфавита ушло 6 строк =), забавно, а что мешало написать в три строки? import string dict_abc = {a: x for a in range(1, 21) for x in string.ascii_lowercase[a]} print(dict_abc)
В примере с Фибоначчи (если я все правильно помню) - сложность линейная: время выполнения линейно зависит от количества элементов которые надо посчитать.
@AndyPronin
2 жыл бұрын
Не
@jtprogru_channel
2 жыл бұрын
@@AndyPronin точно! O(n^2)
@AndyPronin
2 жыл бұрын
@@jtprogru_channel неа. там рекурсия. Еще версия?)
@rinput
2 жыл бұрын
@@AndyPronin поразбирался вчера с фибоначи, и насколько понял, сложность алгоритма зависит от количества элементов, если возьмем один элемент, то О(1), и чем больше элементов, тем сильнее разрастается рекурсия, и соедовательно зависимость становится экспоненциальной. Am i right?)
@x_107
2 жыл бұрын
@@rinput Не, там 2 вызова функции в рекурсии. Это будет что то вроде дерева вызовов, мне кажется будет 2^n сложность
Блин, вот этот вопрос "вы помните агрегатные функции?". Я такой: чиво? А потом такой: не, че-то где-то я видел это слово. Полез в гугол иии... Думаю, задавая такой вопрос стоит сказать вещь вида "одна из агрегатных функций - min(), к примеру". Да, наводящий вопрос. Но как по мне: запоминать слово "агрегатные" - ну такое. :D
16:50 мб поздновато и кто-то такой вариант присылал, я бы сделал вот так import string dict1 = {a+1: sorted(string.ascii_lowercase)[a] for a in range(0,20) } print(dict1) не красиво не элегантно, но и я не программист :)
@alexandrpodmaskin7016
2 жыл бұрын
но есть еще вариант более изощренный к примеру вот так, без модулей. a = {} i=0 for b in range(97,123): i+=1 a[i] = chr(b) print(a)
@AndyPronin
2 жыл бұрын
dict1 = {a: string.ascii_lowercase[a-1] for a in range(1, 21)} а почему мне так?)
@alexandrpodmaskin7016
2 жыл бұрын
@@AndyPronin тоже как вариант )) но в голову первый вариант такой пришел ))
Можно рассчитывать на оффер??? А можно у вас пройти интервью?)
@AndyPronin
Жыл бұрын
Обычно делаю интервью со студентами Практикума. Если есть спонсор - приглашаю подписчиков.
Вот бы услышать мнение Евгения про его учебу , интересно , если прочтёшь отпишись почему именно Итмо плиз
@rinput
Жыл бұрын
Привет, на самом деле просто пошёл по рекомендации друга. По итогу не разу не пожалел, там дали структурированные знания по базе Питона и по вебу + домашки были интересные. Но учеба довольна плотная, по 4 часа онлайн занятий 3 раза в неделю + домашки иногда до 10 часов занимали, а домашку давали после каждого занятия. Вообщем после 3 месяцев такого плотного обучения, я бы сказал, что можно пробовать проходить собесы на джуна, вполне реальный шанс есть.
@nekituall9217
Жыл бұрын
@@rinput привет привет, спасибо за ответ. Вот я не дождавшись ответа=) уже учусь там же, в целом все нравится, хотя какие то вещи сам уже освоил по книжкам. Непонятно только, что лучше: тут инфы и теории больше, чем практики на яплощадке. На какие темы стоит сделать упор для работы?
Кто нибудь расскажите ему про enumerate(), chr() и ord()!!!
1. Вот бы я ещё парился с импортами: {chr(x): x - ord('a') + 1 for x in range(ord('a'), ord('a') + 20)} 2,. Вопрос, честно говоря не понял, сказано - "Принимаем два словаря", но в параметрах пишем списки... Тут , как раз, уместен zip с дальнейшим срезом: dict([*zip(l1, l2)][:length]) PS. В итоге к этому и пришли. По SQL, как сказал Антон М . - "Пока не тормозит - не парься", так, что, возможно, было бы проще в этот запрос просто дописать LIMIT 1 (и прятаться от DBA), в любом случае, СУБД придётся перебрать все значение, но MAX, наверное эффективнее сортировки.
@AndyPronin
2 жыл бұрын
Два списка канешн. Насчёт работы - не всё решают задачки и их решение
Я даже не джуниор, но епта чел уже при работе и не знает, что срезы для словарей не работают)) Я в шоке
почему бы не использовать enumerate в задаче с алфавитом?
@AndyPronin
Жыл бұрын
Можно и его
if len(first) > l: l = len(first) Вот таким способом решается намудренная функция ваша
@codingjerk
11 ай бұрын
Это минимум называется :) l = min(l, len(first))
@vrabosh
11 ай бұрын
@@codingjerk а не max? Но сокращение классное
Словарь создать: dict1 = {a + 1: b for a, b in enumerate(string.ascii_lowercase[:20])} соответственно вторая задача: from string import ascii_lowercase def my_dict(count): if count raise ValueError("Число элементов должно быть больше 0") return {a + 1: b for a, b in enumerate(ascii_lowercase[:20][:count])} print(my_dict(10))
@AndyPronin
2 жыл бұрын
функция из 2й задачи не так должна была выглядеть
@nvitar
2 жыл бұрын
@@AndyPronin Я просто упростил задачу. Там вроде бы нужно было словарь получить с ограничением количества элементов, а то, что его из двух списков предварительно сделанных взялись создавать результат не очень оптимального начала кода. Там из подводных камней первый список может быть передан с дубликатами например, надо тогда тоже проверять и это только на вскидку.
Элементарный код по Sqlite 3. как его можно не понимать.
@AndyPronin
2 жыл бұрын
Если не сталкивался и работал через ORM или редактор, который за тебя это все делает - то легкие тормоза в понимании - ок.
@phillstolyarov9559
2 жыл бұрын
@@AndyPronin Да, ОРМ это, конечно, интересно. Главное что бы мозг не расслабился. Все эти упрощалки делают из сотрудика самого пользователя, а ему необходимо оставаться создателем продукта, что бы другие потльзовались.
По-моему, паттерн "Фабрика" реализован неправильно. Должен был быть класс "Пиццерия", у которой был бы метод (или методы) по созданию экземпляров другого класса "Пицца". А какой смысл в классе Пицца создавать метод по созданию объектов этого же класса, если для этого и существуют инициализатор)
На питоне реально так плохо sql джуны знают?) Я никого не хочу обидеть, просто интересуюсь, т.к. для java эти запросы - элементарнейшие вещи з.ы. тут inner join скорее нужен)
@PurpleDaemon_
2 жыл бұрын
На питоне почти всегда ормки.
Уасяяя, я тож таксист)
За какое время реально научиться кодить хотя бы на таком уровне?
@AndyPronin
Жыл бұрын
полгода-год
И ни одного интервьюера не нароягло, что ни один класс-метод "фабрики" не обратился к переданному классу. Получается они сами не понимают когда нужен класс-метод, а когда статик?
на задачу со словарем ушло 40 минут. для собеса наверно многовато :)
долго смеялся над превью картинкой к ролику
по моему сложность рекурсии по фибоначи O(2^n)
@AndyPronin
Жыл бұрын
Почему?
Уж не знаю, ответит ли автор видео, но как бы вы отнеслись к ситуации: Вы задаете вопрос, а отвечающий: хм, ща глянем и при вас же гуглит и пишет правильный ответ. т.е. человек, например, знает, как построить алгоритм, но не знает наизусть синтаксис.
@AndyPronin
Жыл бұрын
Какой именно синтаксис? Как пишется цикл? Условие? Или чтто? Скорее, это в минус человеку сыграет, чем в плюс. Но можно и меня спросить как правильно написать
:-)
А если кандидат просит обратиться в доку по скулю- это ок? т.е. не мучать что зачем идёт, а пусть смотрит синтаксис и делает.
@AndyPronin
2 жыл бұрын
Тут проще спросить интервьюера, как правильно пишется.