Усенко Михаил | Собеседование python разработчик
Моя тележка: andpronin
ref.proninteam.ru/ моя реферальная программа. Стажировки и деньги в обмен на рекомендации.
t.me/KZreadPronin
Чат для общения pyhton разработчиков и им сочуствующих. Свободное общение, тестовые и вопросы с собесов и прочее. Заходите, там вам рады.
Поддержать канал: www.tinkoff.ru/rm/pronin.andr...
Обычно денежка идёт на книжки про питончик. Но иногда на светлое и тёмное.
Если Тиньков не даёт перечислить, стукните в личку телеги andpronin, придумаем что нибудь
Виш лист
Хорошие книги по Питончику, которые могу рекомендовать (и хочу купить с вашей помощью).
Изучаем Python. Двухтомник. Марк Лутц. Очень подробно и структурно (Хочу дождаться 6го издания.. )
• Изучаем Python с Марко...
Читаем и разбираем ее тут
Куплено (огромное спасибо зрителям)
Знакомство с Python | Бейдер Дэн (2023) - выглядит приятно для новичка
Чистый Python. Тонкости программирования для профи | Бейдер Дэн (2022) - хорошо для продолжения
Высоконагруженные приложения. Программирование, масштабирование, поддержка | Клеппман Мартин
Python. К вершинам мастерства | Рамальо Лучано - 2е издание - сложно для новичка, но интересно
Паттерны разработки на Python: TDD, DDD и событийно-ориентированная архитектура -- хорошо про то, когда какой фреймворк применять
Видимо, дальше появтся еще нескромные желания. Но пока - так
Моя тележка andpronin -- стучите, если что.
Мой канал про обучению python с нуля и до мидла Андрей+=Пронин
/ @pypronin
Я в других сетях
🔗Вконтакте: CaptPronin
🔗Дзен: zen.yandex.ru/id/5fbd33919412...
#python #питон #программирование #Андрей_Пронин #собеседование #
Пікірлер: 80
Андрей, вы как всегда превосходны) надо еще погонять молодых))
Как в запечатанной колоде могут быть карты по-другому разложены? Вы что, в киосках их заряжаете?
@AndyPronin
Жыл бұрын
МОжет быть другой тип колоды. Для Гвинта, например ;)
@tazman8187
11 ай бұрын
Ёбаный рот этого казино, ты бредишь что ли?
1. Передать в класс параметры - это совсем нехорошо, назовем это так. 2. Хотел использовать self на уровне атрибутов класса - нет понимания того, что такое self и зачем оно. 3. Забыл def написать - это прям совсем плохо. 4. "Глобалы хранятся в оперативке и если программа падает, то все данные стираются" - вот за такое прям сразу минус. И за то, что не знает, что такое глобальные переменные, и за то, что не знает, как хранятся данные, при выполнении программы. 5. Вот то высказывание про компрехеншены - ну, такое мог сказать только человек, который не знает, что компрехеншены работают на 20-60% быстрее, чем обычных for. Ну то есть у человека вообще нет понимания не столько ООП в целом, сколько синтаксиса Питона, на основании которого реализована ООП. И тут возникакет вопрос: зачем он всякие там боты пишет и тд, если у него такой большой пробел в знаниях? Или как он вообще писал приложения на Джанге без этих знаний? Банальный кастомный метод модели/вьюхи дописать - тоже в гугл? Вообще бессмысленно как-то, как по мне: большая часть Джанги (да и Питона в целом) без понимания питоновской ООП - это тупо магия. Да, он, возможно, знает, как написать того или иного бота, как использовать ту или иную библиотеку, Но это минусы. Из плюсов: он, в целом, посильнее, чем предыдущие N человек. И код достаточно неплохо пишет. Трабла в том, что для него вся подкапотня Питона - это магия. Думаю, месяц-два изучения питоновской ООП - набить руку на написании классов - и проблема решена. А на данный момент знания слишком поверхностные. Да, это, скорее всего, не помешает сделать какой-то быстро сайт на Джанге или написать бота - но только зачем это нужно? И если бы собес заканчивался на этом, я бы уверенно сказал "надо подучиться", но дальше был обзор проекта и, т.к. я из будущего, я еще и стрим с ним посмотрел. И тут я прям готов повернуть диван. Этот бот - прям титаническая работа - это не Джанго, где 80% кода из коробки. Весь код рукописный, писал, судя по всему, сам, кодстайл классный. Вот с моего стула я реально не смогу сказать, смог бы я такой проект написать или нет. Но тут возникает вопрос: как человек, не имея понимания об устройстве Питона, реализовал такой проект? Методом проб и ошибок? Странно это все, кароче. При этом общается реально классно, на стриме в некоторых моментах не растерялся, а нормально ответил - это уже о многом говорит. Еще и, судя по всему, неплохой стек технологий знает (в том же боте Редис используется, к примеру). В общем и целом, мой поинт вот в чем: что тут на видосе, что на стриме у меня проскачило ощущение, что человек просто "пользуется предоставленными интерфейсами в соответствии с рекомендациями" под флагом "а зачем мне это ООП, если я и без него могу кодить" - но это все лишь на гране ощущений. Если я ошибаюсь - то все супер. Месяцок-другой потратить на разбор питонячьего ООП - не столько общую теорию ООП (хотя и ее тоже) - сколько именно реализацию ООП в Питоне. И тогда можно будет понять, что Питон - это на 95% ООП. И с этими знаниями и на сам Питон можно будет совершенно иначе взглянуть - уберется составляющая магии. Так что, думаю, тут однозначно респект. P.S. А насчет девушек - ну, я за коктейли: то с ними, то без них, то с Русланом, то с Олегом. Дабы разнообразие было.
@Normaldaki777
Жыл бұрын
так у него опыт несколько месяцев. многие и за пару лет такого не набивают. я тоже не знал про важность ооп:) но теперь знаю, инвестирую в него больше времени. мой опыт четыре месяца с самого нуля. спасибо за советы по ооп.
Опа! И снова я первый, кто поставил лайкос и написал комент 😁 Андрей, процветания, счастья, хорошего кода, лютых собесов и новых книжек на разборы😊
@AndyPronin
Жыл бұрын
Самый быстрый лайкер Ютуба)
Михаилу удачи. Про колоду карт тоже вспомнил про "К вершинам мастерства"
@AndyPronin
Жыл бұрын
Для того и читаем книжки) Но у Лусиано попроще реализация
Здравствуйте Андрей! Отличный собес получился! Можете посоветовать книгу по питону только про ООП?)
@AndyPronin
Жыл бұрын
Отдельно по ООП не скажу Python. К вершинам мастерства. (спасибо подписчикам за помощь с приобретением) Есть прям неплохие места. Но стоит с компьютером в руках читать и самомоу пределывать код 2й том Лутца про ООП
Имеет ли смысл реализовать класс карта с помощью паттерна Приспособленец, чтобы не создавать и хранить кучу однотипных объектов? А в класс deck можно прокидывать параметр, в зависимости от которого будут валидироваться исходные данные, так как по сути колоды отличаются только картами, которые могут в них присутствовать.
Понятно. Прошел несколько курсов. Сейчас изучаю машинное обучение. Но вижу что нужно делвть упор на ООП, потому что вобще его не знаю.
Лучше без барышень, так как не интересно слушать, как и почему было у потенциального стажёра. Охота сразу к тех части)
😶🌫 спасибо 👍👍
А и по поводу, барышней, они заряжают позитивом однозначно, пусть присутствуют, 😇
@ivanabdullaev859
Жыл бұрын
да прям.
Андрей, хочу изучить питон и фастапи. Очень долгое время писал на Php. Какие практические вещи стоит написать для начала? Может какой-то ряд задач интересных для новичков
@AndyPronin
7 ай бұрын
t.me/KZreadPronin тут много интэерсного)
лукас от СЕООНЛИ!
Когда будут джуны с проектами хотя бы на 5к строк?)
@AndyPronin
Жыл бұрын
У Михаила бот вполне себе. Если бы добавил тесты, было бы 5К)
Еще не посмотрел, а от Михаила уже несёт мудростью и эрудированностью❤
@user-iu2df5ey2v
Жыл бұрын
Вот гад, не слушайте его, он проплаченный
Ждем барышней, а особенно улыбашку)
@AndyPronin
Жыл бұрын
Улыбашка в большом Яндексе сейчас. (
@ivanabdullaev859
Жыл бұрын
Ты их в реальной жизни увидишь еще на собесах.
Никак не могу понять для чего отдельный класс Карта? У него нет ни атрибутов, ни методов. И не подразумевается что появятся.
@furiousrunner4388
Жыл бұрын
Представление модели: есть Колода с атрибутом кейс - в нем содержатся значения класса Карта, а Карта в свою очередь описывается наличием масти и номинала, т.е. два атрибута в элементе Карты уже есть)
Барышень надо оставить , куда без них?
Вообще видно что у кандидата есть некоторый опыт разработки, но блин, так плавать в базовом python, то есть не помнить как __init__() и __str__() работает, не помнить методы списка. Немного это все удивляет.
А как на счет такого варианта? Есть атрибуты класса это набор всех размерность карт, всех мастей и колода которая из них получается - все три атрибута представлены последовательностями. При создании экземпляра колоды наполняется сама колода. При инициализации экземпляра колода перемешивается в хаотичном порядке. Через интерфейс take_card получаем любое количество карт, по умолчанию 1 карта. Возвращает текущее состояние 'руки' игрока. Если карты кончились получаем уведомление, что колода кончилась и вывод всей руки игрока. Колоды различаются по набору размеров карт, можно добавлять новые типы колод, наследую от базовой колоды и определяя набор величин карт. from abc import ABC class BaseDeck(ABC): default_cards_suits = ["\u2663", "\u2665", "\u2666", "\u2660"] default_deck = [] def __new__(cls, *args, **kwargs): for card in cls.default_cards: for suit in cls.default_cards_suits: cls.default_deck.append(card + ' ' + suit) return super().__new__(cls, *args, **kwargs) def __init__(self): self.deck = self.shuffle_deck self.player_hand = [] @property def shuffle_deck(self): deck_set = set(self.default_deck) deck = list(deck_set) return deck def take_card(self, quantity=1): for _ in range(quantity): try: card = self.deck.pop() self.hand.append(card) except IndexError: return f'{self.player_hand} Deck is over. Get shuffle it again' return self.player_hand class FranceDeck(BaseDeck): default_cards = [str(x) for x in range(2, 11)] + ['J', 'Q', 'K', 'A'] class RussianDeck(BaseDeck): default_cards = [str(x) for x in range(6, 11)] + ['J', 'Q', 'K', 'A'] deck = RussianDeck() deck.take_card(3) deck.take_card(1) ...
@usernoname-wv6of
Жыл бұрын
Только заметил, что метод перетасовки нужно скорректировать. Дефолтную колоду (условно после покупки колоды она упорядочена) нужно копировать а не работать с ней напрямую. тусовка shuffle модуля random. Руку игрока нужно обнулять (сборка карт для тусовки колоды). Вроде все работает, можно симулировать процесс, как в жизни. Если колода кончилась, карты собираются и тусуются. Если карты не кончились, также можно собрать карты и перетусовать в любой момент. @property def shuffle_deck(self): deck = copy(self.default_deck) random.shuffle(deck) self.deck = deck self.hand = [] return deck
@furiousrunner4388
Жыл бұрын
С лету оптимизация: здесь требуется всего один атрибут и один проход по картам. Никаких внешних дополнительных элементов создавать нельзя, пользоваться атрибутом и методом извне нельзя, кроме свойств, задавать новые атрибуты нельзя, практически ни под один критерий твой код не попадает... Надо в общем ещё помыслить, вариант твой не годен, но развитие есть, потому как проперти используешь и более менее суть задания уловил)
@usernoname-wv6of
Жыл бұрын
@@furiousrunner4388 спасибо. Помозгую еще)
@usernoname-wv6of
Жыл бұрын
@@furiousrunner4388 1 проход по колоде. 1 атрибут. Единственное я не совсем понял "пользоваться ... методом извне нельзя" - то есть методом (в моем случае) take_card нельзя вызывать следующую карту? Если так, то есть еще второй вариант Вариант 1. import random from abc import ABC class BaseDeck(ABC): cards_collection = None def __init__(self): cards_suits = ["\u2663", "\u2665", "\u2666", "\u2660"] self.cards_collection = [] for card in self.cards_weight: for suit in cards_suits: self.cards_collection.append(card + ' ' + suit) random.shuffle(self.cards_collection) @property def take_card(self): while True: try: return self.cards_collection.pop() except IndexError: return 'Deck is over' class FranceDeck(BaseDeck): cards_weight = [str(x) for x in range(2, 11)] + ['J', 'Q', 'K', 'A'] class RussianDeck(BaseDeck): cards_weight = [str(x) for x in range(6, 11)] + ['J', 'Q', 'K', 'A'] deck = FranceDeck() for _ in range(52): print(deck.take_card) print(deck.take_card) # output: Deck is over Вариант 2. next(deck), где deck экземпляр класса Deck, вызывается следующая карта из последовательности import random from abc import ABC class BaseDeck(ABC): cards_collection = None def __init__(self): cards_suits = ["\u2663", "\u2665", "\u2666", "\u2660"] self.cards_collection = [] for card in self.cards_weight: for suit in cards_suits: self.cards_collection.append(card + ' ' + suit) random.shuffle(self.cards_collection) def __iter__(self): return self def __next__(self): if not self.cards_collection: raise StopIteration return self.cards_collection.pop() class FranceDeck(BaseDeck): cards_weight = [str(x) for x in range(2, 11)] + ['J', 'Q', 'K', 'A'] class RussianDeck(BaseDeck): cards_weight = [str(x) for x in range(6, 11)] + ['J', 'Q', 'K', 'A'] deck = FranceDeck() for card in deck: print(card) # output every card until deck is over
@furiousrunner4388
Жыл бұрын
Есть колода, это объект, у него есть один атрибут - сама сущность колоды - её карты, которые в свою очередь описаны такими особенностями как масть и номинал. Теперь моделируй, ты берёшь карту из колоды, у колоды минус одна карту у тебя плюс одна. Метод использовать такое себе потому что ты просто берёшь карту. Значит, тебе надо сделать такое свойство, чтобы ты мог получить (getter) карту из колоды, которая в свою очередь защищена от переопределения и изменения извне, понял намёк? Один атрибут колоды, два доп. атрибута карты для описания карты в руке (побочная реализация), один проход по колоде, и одно свойство, которым тебе позволено получить карту из колоды. Колода -> Карта -> Игрок. Колода кончилась, объекта нет, аллес)
21 минута задачка с степика😁 сегодня решал ее)
@AndyPronin
9 ай бұрын
90 процентов задач оттуда
@user-jf8fp2um9s
9 ай бұрын
@@AndyPronin Прикольно) Постараюсь хотя бы через годик тоже на собес попасть
Так дико смотрится, что парень лишний раз чтоб не прописывать какое-либо слово ищет его в коде, копирует и вставляет, а потом еще редактирует его. Неужели так удобнее? Там же VScode сам предлагает варианты.
Интересно сколько человек должен потратить времени, чтобы стать джуном. По этому интервью нужно знать git+docker+теств+ооп+лист коомпрехеншн+ стандартные вещи типа списков, вложеных функций и тд.+ Базы данных+ алгоритмы+практика, а не только теория+ проекты. Кажется года на это все будет мало. Получается судя по видео- джун это человек который больше года должен работать в этой теме.
@AndyPronin
7 ай бұрын
Если пря копать по 3-4 часа в день, думаю, за полгода можно. Но таки да. Требования высоки нынче
Нужно оставить HR, я считаю
Скрипач не нужен! Без вопросов от хрюш об любимом цвете или любимом блюде эти ролики явно немного потеряют.
Одно не могу понять, как при таком почти нулевом знании базы программировании, можно писать что-то большое, типа AI бота или чего-то на Django! Я вот всё понять не могу! Обращу внимание на барражирующую ошибку из видео в видео: ___init___ - это не конструктор, а Инициализатор состояния, а вот ___new___ - это Конструктор
@memesforbro
Жыл бұрын
Ai бота написать очень легко, тупо через апи опенэйай принимаешь/отправляешь запросы. Django так же легкие но если углубится будет уже сложнее
@furiousrunner4388
Жыл бұрын
Он свой проект месяцами писал, по сути это его входная работа, но то что с такими знаниями работает как на собесе тут - то мне нужно в миддлы сразу)))
@Konstantin_Stalnov
Жыл бұрын
@@furiousrunner4388 Попробуй на Мидла! Это не шутка.
@user-iu2df5ey2v
Жыл бұрын
При чём тут знания ооп если джун работает только с готовыми библиотеками? Не задо умть дать определение полиморфизму чтобы унаследоваться от класса, добавить ему или переопределить метод и запихать в прод. ООП надо знать если ты проектируешь архитектуру на тысячи человек онлайна или пишешь библиотеку
опять странные оценки какие-то. почему этот разработчик получает "нет", при условии что человек и позапрошлого собеса получил "да, ты бы у меня прошел на следующий этап" (kzread.info/dash/bejne/qYuuzZSjYMypYbQ.html), когда Михаил из этого видоса был значительно лучше чем человек из того видоса про который я говорил. я не говорю что Михаил сделал все идеально и ответил на все вопросы, я его сравниваю с тем кто прошел дальше, и считаю что это прям совсем необъективно. может стоит ввести систему баллов какую-то и по ней решать прошел/не прошел, а то выглядит будто все зависит от настроения
@AndyPronin
Жыл бұрын
В голодных играх попробуем иначе сделать. Спасибо
@ivanabdullaev859
Жыл бұрын
@@AndyPronin что за голодные игры? Это эже теперь официально процесс набора дешевой раб силы в ит так называют? Я - то в шутку так раньше говорил.
@AndyPronin
Жыл бұрын
@@ivanabdullaev859 не сказать, что дешёвой
Ему нужно прочитать про ооп :). Люблю писать ботов но уже тошнит(. ООП знаю немного лучше и видимо этот кандидат очень волновался раз уж забыл основы
@user-iu2df5ey2v
Жыл бұрын
Я эти основы нафиг забыл за пол года практики. Ни разу не пришлось писать класс и инитом за 3 месяца работы)
@memesforbro
Жыл бұрын
@@user-iu2df5ey2v Ты надеюсь смотрел его интервью? Он там все темы проверяет а ты без ооп пошел
@user-iu2df5ey2v
Жыл бұрын
@@memesforbro Смотрел, но мне некогда да и не охота было заново в это залезать. От этого собеса ничего не зависело, так что я просто пришёл с тем что было)
@memesforbro
Жыл бұрын
Это глупо, потому что к собесу всегда нужно относится серьезно
@user-iu2df5ey2v
Жыл бұрын
@@memesforbro у меня работа после которой не охота готовиться к ничего не значещему собесу. Я был готов когда подавал заявку - в феврале)
МНОГО БАРЫШЕНЬ!
Очень Слабо!
Андрей привет! Оцени мою реализацию. Мне показалось более интересно сделать так, что мы не просто берем случайную карту из колоды и потом обратно ее помещаем, а берем с концами. Таким образом колода будет со временем пустеть и для ее восстановления в исходное состояние необходимо применить соотвествующий метод в родительском классе. С такой колодой можно хотя бы в Блэк Джэк попробовать рубануться) from random import shuffle class DeckEmptyError(Exception): pass class Card: def __init__(self, rank, suit): self.rank = rank self.suit = suit def __repr__(self): return f'{self.rank} {self.suit}' class CardDeck: high_ranks = 'JQKA' suits = 'DHCS' def __init__(self): self.init_deck() def init_deck(self): ranks = (*self.low_ranks, *self.high_ranks) self.deck = [Card(rank, suit) for suit in self.suits for rank in ranks] shuffle(self.deck) def get_random_card(self): if self.deck: return self.deck.pop() raise DeckEmptyError('Deck is empty. If you if you want to create a new deck, use method "init_deck"') class RussianCardDeck(CardDeck): low_ranks = range(6, 11) class FrenchCardDeck(CardDeck): low_ranks = range(2, 11)
@furiousrunner4388
Жыл бұрын
Сразу скажу: можно обойтись одним атрибутом, плюс я легко хакну твою программу, плюс где наследование с такой реализацией? Плюс многие методы можно сделать в один сеттинг, тобишь меню выбора колоды, очень много воды в общем у тебя и мало творчества, учись еще и будет тебе счастье)
Про первую задачу, вот так норм? import random class Deck: def __init__(self): self.card_deck = [] chars = ['Kresti', 'Peki', 'Chervi', 'Bubi'] for i in chars: for j in range(1, 15): self.card_deck.append(self.num_to_men(j) + ' ' + i) random.shuffle(self.card_deck) def num_to_men(self, n): if n == 11: return 'J' if n == 12: return 'Q' if n == 13: return 'K' if n == 14: return 'T' return str(n) def get_card_by_index(self, idx): if idx >= len(self.card_deck): return 'f u' out = self.card_deck[idx] self.card_deck.pop(idx) return out def get_random_card(self): idx = random.randint(0, len(self.card_deck) - 1) out = self.card_deck[idx] self.card_deck.pop(idx) return out Просто первое решение которое пришло в лоб
@AndyPronin
Жыл бұрын
Кажется, стоит ещё подумать
@furiousrunner4388
Жыл бұрын
from random import shuffle class Deck: __slots__ = (__case) def __init__(self, num_rank_range=(2,3,4,5,6,7,8,9,10,'J','Q','K','A'), suits=('s','c','d','h')): if isinstance(num_rank_range,(tuple,list)) and isinstance(suits,(tuple,list)): self.__case : iter = iter(Deck.__shuffle_deck([(n,s) for n in num_rank_range for s in suits])) else: raise ValueError('Колода задана некорректно') @property def take(self): try: return next(self.__case) except StopIteration: return 'Карты закончились' @property def case(self): return list(self.__case) @staticmethod def __shuffle_deck(deck): shuffle(deck) return deck def __str__(self): return f"Карт осталось: {len(tuple(self.__case))}" # время на реализацию с подготовкой: до 15 минут
@furiousrunner4388
Жыл бұрын
@@AndyPronin Солидарен с вами, причем основательно думать;)
@just_arthur_fu
Жыл бұрын
Немного подумал, использовал ABC, добавил комментарии, добавил наследование import random from abc import ABC, abstractmethod class Deck(ABC): def __init__(self): """ Инициализируем колоду """ self.deck = [] rng = self.get_card_range() for i in ['Heart', 'Diamonds', 'Spades', 'Clubs']: for j in rng: if j == 11: self.deck.append(f'J {i}') elif j == 12: self.deck.append(f'Q {i}') elif j == 13: self.deck.append(f'K {i}') elif j == 14: self.deck.append(f'T {i}') else: self.deck.append(f'{j} {i}') def pick_random_card(self): """ Берем случайную карту """ if self.is_empty(): return None card = random.choice(self.deck) self.deck.remove(card) return card def is_empty(self): """ Пустая ли колода """ return len(self.deck) == 0 @abstractmethod def get_card_range(self): """ Переопределяемая функция для других колод """ return range(1, 15) class FrenchDeck(Deck): def get_card_range(self): return range(1, 15) class RussianDeck(Deck): def get_card_range(self): return range(6, 15) print('Creating deck') my_deck1 = RussianDeck() print('picking cards') length = 0 card = my_deck1.pick_random_card() while card: length += 1 print('I pick', card) card = my_deck1.pick_random_card() print(' Length: ', length)
@furiousrunner4388
Жыл бұрын
@@just_arthur_fu все равно не то)