Усенко Михаил | Собеседование 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

  • @furiousrunner4388
    @furiousrunner4388 Жыл бұрын

    Андрей, вы как всегда превосходны) надо еще погонять молодых))

  • @Dakovalev
    @Dakovalev Жыл бұрын

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

  • @AndyPronin

    @AndyPronin

    Жыл бұрын

    МОжет быть другой тип колоды. Для Гвинта, например ;)

  • @tazman8187

    @tazman8187

    11 ай бұрын

    Ёбаный рот этого казино, ты бредишь что ли?

  • @7IdE
    @7IdE Жыл бұрын

    1. Передать в класс параметры - это совсем нехорошо, назовем это так. 2. Хотел использовать self на уровне атрибутов класса - нет понимания того, что такое self и зачем оно. 3. Забыл def написать - это прям совсем плохо. 4. "Глобалы хранятся в оперативке и если программа падает, то все данные стираются" - вот за такое прям сразу минус. И за то, что не знает, что такое глобальные переменные, и за то, что не знает, как хранятся данные, при выполнении программы. 5. Вот то высказывание про компрехеншены - ну, такое мог сказать только человек, который не знает, что компрехеншены работают на 20-60% быстрее, чем обычных for. Ну то есть у человека вообще нет понимания не столько ООП в целом, сколько синтаксиса Питона, на основании которого реализована ООП. И тут возникакет вопрос: зачем он всякие там боты пишет и тд, если у него такой большой пробел в знаниях? Или как он вообще писал приложения на Джанге без этих знаний? Банальный кастомный метод модели/вьюхи дописать - тоже в гугл? Вообще бессмысленно как-то, как по мне: большая часть Джанги (да и Питона в целом) без понимания питоновской ООП - это тупо магия. Да, он, возможно, знает, как написать того или иного бота, как использовать ту или иную библиотеку, Но это минусы. Из плюсов: он, в целом, посильнее, чем предыдущие N человек. И код достаточно неплохо пишет. Трабла в том, что для него вся подкапотня Питона - это магия. Думаю, месяц-два изучения питоновской ООП - набить руку на написании классов - и проблема решена. А на данный момент знания слишком поверхностные. Да, это, скорее всего, не помешает сделать какой-то быстро сайт на Джанге или написать бота - но только зачем это нужно? И если бы собес заканчивался на этом, я бы уверенно сказал "надо подучиться", но дальше был обзор проекта и, т.к. я из будущего, я еще и стрим с ним посмотрел. И тут я прям готов повернуть диван. Этот бот - прям титаническая работа - это не Джанго, где 80% кода из коробки. Весь код рукописный, писал, судя по всему, сам, кодстайл классный. Вот с моего стула я реально не смогу сказать, смог бы я такой проект написать или нет. Но тут возникает вопрос: как человек, не имея понимания об устройстве Питона, реализовал такой проект? Методом проб и ошибок? Странно это все, кароче. При этом общается реально классно, на стриме в некоторых моментах не растерялся, а нормально ответил - это уже о многом говорит. Еще и, судя по всему, неплохой стек технологий знает (в том же боте Редис используется, к примеру). В общем и целом, мой поинт вот в чем: что тут на видосе, что на стриме у меня проскачило ощущение, что человек просто "пользуется предоставленными интерфейсами в соответствии с рекомендациями" под флагом "а зачем мне это ООП, если я и без него могу кодить" - но это все лишь на гране ощущений. Если я ошибаюсь - то все супер. Месяцок-другой потратить на разбор питонячьего ООП - не столько общую теорию ООП (хотя и ее тоже) - сколько именно реализацию ООП в Питоне. И тогда можно будет понять, что Питон - это на 95% ООП. И с этими знаниями и на сам Питон можно будет совершенно иначе взглянуть - уберется составляющая магии. Так что, думаю, тут однозначно респект. P.S. А насчет девушек - ну, я за коктейли: то с ними, то без них, то с Русланом, то с Олегом. Дабы разнообразие было.

  • @Normaldaki777

    @Normaldaki777

    Жыл бұрын

    так у него опыт несколько месяцев. многие и за пару лет такого не набивают. я тоже не знал про важность ооп:) но теперь знаю, инвестирую в него больше времени. мой опыт четыре месяца с самого нуля. спасибо за советы по ооп.

  • @mak32
    @mak32 Жыл бұрын

    Опа! И снова я первый, кто поставил лайкос и написал комент 😁 Андрей, процветания, счастья, хорошего кода, лютых собесов и новых книжек на разборы😊

  • @AndyPronin

    @AndyPronin

    Жыл бұрын

    Самый быстрый лайкер Ютуба)

  • @assetdyussenov
    @assetdyussenov Жыл бұрын

    Михаилу удачи. Про колоду карт тоже вспомнил про "К вершинам мастерства"

  • @AndyPronin

    @AndyPronin

    Жыл бұрын

    Для того и читаем книжки) Но у Лусиано попроще реализация

  • @user-fg4og7mh1n
    @user-fg4og7mh1n Жыл бұрын

    Здравствуйте Андрей! Отличный собес получился! Можете посоветовать книгу по питону только про ООП?)

  • @AndyPronin

    @AndyPronin

    Жыл бұрын

    Отдельно по ООП не скажу Python. К вершинам мастерства. (спасибо подписчикам за помощь с приобретением) Есть прям неплохие места. Но стоит с компьютером в руках читать и самомоу пределывать код 2й том Лутца про ООП

  • @user-gq6kf4yc2z
    @user-gq6kf4yc2z9 ай бұрын

    Имеет ли смысл реализовать класс карта с помощью паттерна Приспособленец, чтобы не создавать и хранить кучу однотипных объектов? А в класс deck можно прокидывать параметр, в зависимости от которого будут валидироваться исходные данные, так как по сути колоды отличаются только картами, которые могут в них присутствовать.

  • @bjj1423
    @bjj1423 Жыл бұрын

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

  • @Pafel0684
    @Pafel0684 Жыл бұрын

    Лучше без барышень, так как не интересно слушать, как и почему было у потенциального стажёра. Охота сразу к тех части)

  • @Maine__Coon__1
    @Maine__Coon__1 Жыл бұрын

    😶‍🌫 спасибо 👍👍

  • @Maine__Coon__1
    @Maine__Coon__1 Жыл бұрын

    А и по поводу, барышней, они заряжают позитивом однозначно, пусть присутствуют, 😇

  • @ivanabdullaev859

    @ivanabdullaev859

    Жыл бұрын

    да прям.

  • @capstanfearless
    @capstanfearless7 ай бұрын

    Андрей, хочу изучить питон и фастапи. Очень долгое время писал на Php. Какие практические вещи стоит написать для начала? Может какой-то ряд задач интересных для новичков

  • @AndyPronin

    @AndyPronin

    7 ай бұрын

    t.me/KZreadPronin тут много интэерсного)

  • @seoonlyRU
    @seoonlyRU Жыл бұрын

    лукас от СЕООНЛИ!

  • @user-bu6iq2ot8k
    @user-bu6iq2ot8k Жыл бұрын

    Когда будут джуны с проектами хотя бы на 5к строк?)

  • @AndyPronin

    @AndyPronin

    Жыл бұрын

    У Михаила бот вполне себе. Если бы добавил тесты, было бы 5К)

  • @GuitaruSan
    @GuitaruSan Жыл бұрын

    Еще не посмотрел, а от Михаила уже несёт мудростью и эрудированностью❤

  • @user-iu2df5ey2v

    @user-iu2df5ey2v

    Жыл бұрын

    Вот гад, не слушайте его, он проплаченный

  • @nariztan8505
    @nariztan8505 Жыл бұрын

    Ждем барышней, а особенно улыбашку)

  • @AndyPronin

    @AndyPronin

    Жыл бұрын

    Улыбашка в большом Яндексе сейчас. (

  • @ivanabdullaev859

    @ivanabdullaev859

    Жыл бұрын

    Ты их в реальной жизни увидишь еще на собесах.

  • @vegzuzvegzuz2866
    @vegzuzvegzuz2866 Жыл бұрын

    Никак не могу понять для чего отдельный класс Карта? У него нет ни атрибутов, ни методов. И не подразумевается что появятся.

  • @furiousrunner4388

    @furiousrunner4388

    Жыл бұрын

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

  • @silkcode3178
    @silkcode3178 Жыл бұрын

    Барышень надо оставить , куда без них?

  • @wrestler91100
    @wrestler9110011 ай бұрын

    Вообще видно что у кандидата есть некоторый опыт разработки, но блин, так плавать в базовом python, то есть не помнить как __init__() и __str__() работает, не помнить методы списка. Немного это все удивляет.

  • @usernoname-wv6of
    @usernoname-wv6of Жыл бұрын

    А как на счет такого варианта? Есть атрибуты класса это набор всех размерность карт, всех мастей и колода которая из них получается - все три атрибута представлены последовательностями. При создании экземпляра колоды наполняется сама колода. При инициализации экземпляра колода перемешивается в хаотичном порядке. Через интерфейс 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

    @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

    @furiousrunner4388

    Жыл бұрын

    С лету оптимизация: здесь требуется всего один атрибут и один проход по картам. Никаких внешних дополнительных элементов создавать нельзя, пользоваться атрибутом и методом извне нельзя, кроме свойств, задавать новые атрибуты нельзя, практически ни под один критерий твой код не попадает... Надо в общем ещё помыслить, вариант твой не годен, но развитие есть, потому как проперти используешь и более менее суть задания уловил)

  • @usernoname-wv6of

    @usernoname-wv6of

    Жыл бұрын

    @@furiousrunner4388 спасибо. Помозгую еще)

  • @usernoname-wv6of

    @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

    @furiousrunner4388

    Жыл бұрын

    Есть колода, это объект, у него есть один атрибут - сама сущность колоды - её карты, которые в свою очередь описаны такими особенностями как масть и номинал. Теперь моделируй, ты берёшь карту из колоды, у колоды минус одна карту у тебя плюс одна. Метод использовать такое себе потому что ты просто берёшь карту. Значит, тебе надо сделать такое свойство, чтобы ты мог получить (getter) карту из колоды, которая в свою очередь защищена от переопределения и изменения извне, понял намёк? Один атрибут колоды, два доп. атрибута карты для описания карты в руке (побочная реализация), один проход по колоде, и одно свойство, которым тебе позволено получить карту из колоды. Колода -> Карта -> Игрок. Колода кончилась, объекта нет, аллес)

  • @user-jf8fp2um9s
    @user-jf8fp2um9s9 ай бұрын

    21 минута задачка с степика😁 сегодня решал ее)

  • @AndyPronin

    @AndyPronin

    9 ай бұрын

    90 процентов задач оттуда

  • @user-jf8fp2um9s

    @user-jf8fp2um9s

    9 ай бұрын

    @@AndyPronin Прикольно) Постараюсь хотя бы через годик тоже на собес попасть

  • @sergiybustrov8831
    @sergiybustrov88317 ай бұрын

    Так дико смотрится, что парень лишний раз чтоб не прописывать какое-либо слово ищет его в коде, копирует и вставляет, а потом еще редактирует его. Неужели так удобнее? Там же VScode сам предлагает варианты.

  • @atlant1707
    @atlant17077 ай бұрын

    Интересно сколько человек должен потратить времени, чтобы стать джуном. По этому интервью нужно знать git+docker+теств+ооп+лист коомпрехеншн+ стандартные вещи типа списков, вложеных функций и тд.+ Базы данных+ алгоритмы+практика, а не только теория+ проекты. Кажется года на это все будет мало. Получается судя по видео- джун это человек который больше года должен работать в этой теме.

  • @AndyPronin

    @AndyPronin

    7 ай бұрын

    Если пря копать по 3-4 часа в день, думаю, за полгода можно. Но таки да. Требования высоки нынче

  • @bixber819
    @bixber81911 ай бұрын

    Нужно оставить HR, я считаю

  • @virnus1
    @virnus1 Жыл бұрын

    Скрипач не нужен! Без вопросов от хрюш об любимом цвете или любимом блюде эти ролики явно немного потеряют.

  • @Konstantin_Stalnov
    @Konstantin_Stalnov Жыл бұрын

    Одно не могу понять, как при таком почти нулевом знании базы программировании, можно писать что-то большое, типа AI бота или чего-то на Django! Я вот всё понять не могу! Обращу внимание на барражирующую ошибку из видео в видео: ___init___ - это не конструктор, а Инициализатор состояния, а вот ___new___ - это Конструктор

  • @memesforbro

    @memesforbro

    Жыл бұрын

    Ai бота написать очень легко, тупо через апи опенэйай принимаешь/отправляешь запросы. Django так же легкие но если углубится будет уже сложнее

  • @furiousrunner4388

    @furiousrunner4388

    Жыл бұрын

    Он свой проект месяцами писал, по сути это его входная работа, но то что с такими знаниями работает как на собесе тут - то мне нужно в миддлы сразу)))

  • @Konstantin_Stalnov

    @Konstantin_Stalnov

    Жыл бұрын

    @@furiousrunner4388 Попробуй на Мидла! Это не шутка.

  • @user-iu2df5ey2v

    @user-iu2df5ey2v

    Жыл бұрын

    При чём тут знания ооп если джун работает только с готовыми библиотеками? Не задо умть дать определение полиморфизму чтобы унаследоваться от класса, добавить ему или переопределить метод и запихать в прод. ООП надо знать если ты проектируешь архитектуру на тысячи человек онлайна или пишешь библиотеку

  • @wonderwn3350
    @wonderwn3350 Жыл бұрын

    опять странные оценки какие-то. почему этот разработчик получает "нет", при условии что человек и позапрошлого собеса получил "да, ты бы у меня прошел на следующий этап" (kzread.info/dash/bejne/qYuuzZSjYMypYbQ.html), когда Михаил из этого видоса был значительно лучше чем человек из того видоса про который я говорил. я не говорю что Михаил сделал все идеально и ответил на все вопросы, я его сравниваю с тем кто прошел дальше, и считаю что это прям совсем необъективно. может стоит ввести систему баллов какую-то и по ней решать прошел/не прошел, а то выглядит будто все зависит от настроения

  • @AndyPronin

    @AndyPronin

    Жыл бұрын

    В голодных играх попробуем иначе сделать. Спасибо

  • @ivanabdullaev859

    @ivanabdullaev859

    Жыл бұрын

    @@AndyPronin что за голодные игры? Это эже теперь официально процесс набора дешевой раб силы в ит так называют? Я - то в шутку так раньше говорил.

  • @AndyPronin

    @AndyPronin

    Жыл бұрын

    @@ivanabdullaev859 не сказать, что дешёвой

  • @memesforbro
    @memesforbro Жыл бұрын

    Ему нужно прочитать про ооп :). Люблю писать ботов но уже тошнит(. ООП знаю немного лучше и видимо этот кандидат очень волновался раз уж забыл основы

  • @user-iu2df5ey2v

    @user-iu2df5ey2v

    Жыл бұрын

    Я эти основы нафиг забыл за пол года практики. Ни разу не пришлось писать класс и инитом за 3 месяца работы)

  • @memesforbro

    @memesforbro

    Жыл бұрын

    @@user-iu2df5ey2v Ты надеюсь смотрел его интервью? Он там все темы проверяет а ты без ооп пошел

  • @user-iu2df5ey2v

    @user-iu2df5ey2v

    Жыл бұрын

    @@memesforbro Смотрел, но мне некогда да и не охота было заново в это залезать. От этого собеса ничего не зависело, так что я просто пришёл с тем что было)

  • @memesforbro

    @memesforbro

    Жыл бұрын

    Это глупо, потому что к собесу всегда нужно относится серьезно

  • @user-iu2df5ey2v

    @user-iu2df5ey2v

    Жыл бұрын

    @@memesforbro у меня работа после которой не охота готовиться к ничего не значещему собесу. Я был готов когда подавал заявку - в феврале)

  • @user-rl4pv9bh7z
    @user-rl4pv9bh7z Жыл бұрын

    МНОГО БАРЫШЕНЬ!

  • @Konstantin_Stalnov
    @Konstantin_Stalnov Жыл бұрын

    Очень Слабо!

  • @0ver4ance
    @0ver4ance Жыл бұрын

    Андрей привет! Оцени мою реализацию. Мне показалось более интересно сделать так, что мы не просто берем случайную карту из колоды и потом обратно ее помещаем, а берем с концами. Таким образом колода будет со временем пустеть и для ее восстановления в исходное состояние необходимо применить соотвествующий метод в родительском классе. С такой колодой можно хотя бы в Блэк Джэк попробовать рубануться) 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

    @furiousrunner4388

    Жыл бұрын

    Сразу скажу: можно обойтись одним атрибутом, плюс я легко хакну твою программу, плюс где наследование с такой реализацией? Плюс многие методы можно сделать в один сеттинг, тобишь меню выбора колоды, очень много воды в общем у тебя и мало творчества, учись еще и будет тебе счастье)

  • @just_arthur_fu
    @just_arthur_fu Жыл бұрын

    Про первую задачу, вот так норм? 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

    @AndyPronin

    Жыл бұрын

    Кажется, стоит ещё подумать

  • @furiousrunner4388

    @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

    @furiousrunner4388

    Жыл бұрын

    @@AndyPronin Солидарен с вами, причем основательно думать;)

  • @just_arthur_fu

    @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

    @furiousrunner4388

    Жыл бұрын

    @@just_arthur_fu все равно не то)

Келесі