- Видео 44
- Просмотров 96 287
Python Clinic
Добавлен 8 мар 2023
Привет, меня зовут Никита Царевич, и я в IT больше 10 лет. Я занимаюсь архитектурой, управляю командами, но в первую очередь я инженер-программист. Уже несколько лет веду курсы по Python, и знаю, как и чему обучать людей с разным бэкграундом и опытом. Могу рассказать о Python и программировании так, что даже babushka поймёт.
Анализ данных на Python (pandas, matplotlib): кто имел больше шансов выжить на Титанике
Смотрим на известный датасет исторических данных о катастрофе на Титанике, который можно найти здесь - www.kaggle.com/competitions/titanic
Таймкоды:
00:00 - обзор датасета и гипотеза
03:03 - основы pandas
05:33 - средние цены на билеты
07:24 - классы билетов
08:26 - нехватка данных
09:28 - удаляем "плохие" записи
09:48 - дополняем "плохие" записи
11:47 - распределение цен
15:45 - группировка по классу, возрасту и полу
16:43 - простой вывод
Таймкоды:
00:00 - обзор датасета и гипотеза
03:03 - основы pandas
05:33 - средние цены на билеты
07:24 - классы билетов
08:26 - нехватка данных
09:28 - удаляем "плохие" записи
09:48 - дополняем "плохие" записи
11:47 - распределение цен
15:45 - группировка по классу, возрасту и полу
16:43 - простой вывод
Просмотров: 393
Видео
Пишем доморощенный веб сервер на Python
Просмотров 5693 месяца назад
в этом видео я опишу процесс создания и работы очень простенького веб сервиса с помощью модуля socket
Деревья на Python: бинарное дерево поиска (BST), красно-чёрное (BRT)
Просмотров 7164 месяца назад
Разбираемся с тем, как устроены разные виды деревьев и конечно же реализуем их на Python. Таймкоды: 00:00 - задача о директориях 04:24 - решаем через дерево 08:58 - определения и термины 16:25 - простейшее дерево 19:51 - бинарное дерево поиска 25:18 - реализация бинарного дерева поиска 30:11 - кривое дерево 38:00 - красно-чёрное дерево 45:20 - повороты 48:36 - алгоритм вставки 55:15 - уже не та...
Как устроены хэш таблицы и словари на примере Python (hash table / dict)
Просмотров 1,3 тыс.6 месяцев назад
Что там под капотом у типа dict? Что такое хэш функция? Можно ли избежать коллизий? Ответы в этом видео. Мы продолжаем разбираться со структурами данных на примере Python, как всегда, если у вас есть вопросы или предложения, смело пишите обо всём в комментариях. Таймкоды: 00:00 - подсчёт слов в тексте двойным циклом 01:59 - вариации подсчёта через словарь 08:36 - устройство хэш таблицы и хэш фу...
Стек/stack и очередь/queue в PYTHON
Просмотров 1,4 тыс.8 месяцев назад
Привет, в этом видео я расскажу о двух структурах данных, которые лежат в основе самого программирования, это stack/стек и queue/очередь. Посмотрим на разные реализации в Python, на задачи с интервью и практические примеры. Как всегда можете смело задавать вопросы в комментариях. 00:00 - задача с интервью 03:12 - решение с “депо” 10:54 - stack/стек 11:53 - queue/очередь 12:50 - формальный интер...
Большое О - ассимптотическая оценка сложности алгоритмов
Просмотров 1,5 тыс.9 месяцев назад
При проектировании решений мы стремимся к максимальной эффективности. Понимание сложности алгоритмов и умение их сравнивать критически важно для подбора наиболее эффективного решения, поэтому понимать принципы ассимптотической оценки - очень важно. Даже если вы считаете, что все алгоритмы уже написаны, а chatGPT подскажет решение в любой ситуации. Таймкоды: 00:00 - пример вопроса с интервью и к...
РеКуРсИя в Python (стэк вызовов, оптимизация хвоста и альтернативы)
Просмотров 99710 месяцев назад
Чтобы понять рекурсию, нужно понимать рекурсию, пока не поймёшь рекурсию. Тайм коды: 00:00 - интро 00:25 - что считать рекурсией 03:38 - сквозная сумма списка 08:11 - стэк вызовов 17:58 - хвосты и оптимизация 23:15 - Гвидо не хотел оптимизировать 26:13 - немного о быстродействии и удобстве 28:35 - замена на очередь 33:50 - ну и всё
Приципы SOLID и PYTHON - подробный разбор на практике
Просмотров 3,7 тыс.11 месяцев назад
Давно обещал выпустить это видео, и вот время пришло. Здесь будет подробный разбор применения техник SOLID в Python. Пример, как и само видео, будет достаточно сложным, так что не переживайте, если не получится всё это ухватить с первого раза, ну и не стесняйтесь задавать вопросы в комментариях. Так же в конце есть небольшая секция, где я делюсь своими мыслями о будущем этого канала. Таймкоды: ...
Методы классов в Python
Просмотров 1,5 тыс.Год назад
Объясняю в чём разница между classmethod и staticmethod в python, и немного рассказываю о том, где эти декораторы применяются, а где можно обойтись и без них. Вообще пайтон настолько гибкий, что в целом без них моджнобыло бы обойтись везде, но они дают нам немного дополнительного контроля над тем, как и где эти методы вызываются и переопределяются. Таймкоды: 00:00 - интро 00:22 - методы класса ...
Асинхронность в python
Просмотров 4,2 тыс.Год назад
Рассказываю о том, что вообще такое асинхронность, и как она реализована в python. Видео получилось очень поучительным, сразу понятно, что асинхронность это не серебряная пуля, а скорее осиновый кол, который нужно долго и методично строгать перед использованием. Таймкоды: 00:00 - интро 00:15 - что вообще такое асинхронность 07:20 - многопоточность? 09:02 - async 11:47 - await 13:28 - asyncio 15...
Абстрактные классы в Python
Просмотров 4,2 тыс.Год назад
Разбираемся с тем, как работает abstract base class или abc. Абстрактные классы позволяют в явном виде заставить дочерние классы переопределять поведения родителей, за счёт этого мы можем строить более гибкие иерархии наследования. Таймкоды: 00:00 - интро 01:06 - интерфейсы 04:17 - абстрактные классы 05:33 - необходимые инструменты 09:16 - расширяем дочерние классы 10:55 - результат 11:59 - аутро
Потоки ненастоящие? GIL в Python
Просмотров 1,8 тыс.Год назад
В этом видео мы разоблачим иллюзию относительно быстроты работы потоков в Python. GIL превращает все объекты в потокобезопасные, но платим за это мы производительностью, и на самом деле потоки очень редко работают по-настоящему параллельно. Разбираемся, в каких ситуациях их можно использовать с выгодой. Канал в тг, где я делюсь своими мыслями по видосам и не только - t.me/PythonClinicChnl Таймк...
Множественное наследование и алгоритм MRO в Python
Просмотров 2,2 тыс.Год назад
Пришло время поговорить о множественном наследовании в Python. Проблема множественного наследования на концептуальном уровне это конфликты. В пайтон они разрешаются с помощью алгоритма MRO, который стоит понимать, с тем чтобы правильно строить иерархии наследования и переиспользовать родительское поведение. Так же коротко рассказываю о принципе работы метода super(). Таймкоды: 00:00 - проблема ...
Потоки в Python
Просмотров 1,4 тыс.Год назад
Смотрим на интерфейс работы с потоками и сравниваем его с аналогичными инструментами для процессов. Заодно проверили и производительность тоже. Основной вывод - потоки (в Python и по жизни) стоит использовать для распараллеливания простейших задач, либо вещей которые зависят от IO. Для сложных вычислений лучше использовать всё же процессы. Группа в тг - t.me/PythonClinicChnl Таймкоды: 00:00 - и...
Механизм наследования в Python
Просмотров 1,2 тыс.Год назад
Как и всегда нас будет интересовать то, что происходит при наследовании под капотом - как работает типизация, как происходит "перенос" атрибутов и методов, как мы можем расширять поведение дочерних классов. Даже в простейшем случае линейного наследования можно поломать механику работы с проперти, если не соблюсти определённые правила, которые как раз зависят от этой механики. Канал в тг, где я ...
Борьба за ресурсы между процессами Python
Просмотров 594Год назад
Борьба за ресурсы между процессами Python
Разбор байткода Python с помощью модуля dis
Просмотров 712Год назад
Разбор байткода Python с помощью модуля dis
Pool процессов в Python - параллельность и асинхронность
Просмотров 1,8 тыс.Год назад
Pool процессов в Python - параллельность и асинхронность
Дескрипторы в Python - максимальная инкапсуляция
Просмотров 3,1 тыс.Год назад
Дескрипторы в Python - максимальная инкапсуляция
Компиляторы, интерпретаторы и когда всё-таки интернируются строки
Просмотров 1 тыс.Год назад
Компиляторы, интерпретаторы и когда всё-таки интернируются строки
Сборка мусора (garbage collection) в Python
Просмотров 4 тыс.Год назад
Сборка мусора (garbage collection) в Python
Properties в Python - во-первых это красиво
Просмотров 1,9 тыс.Год назад
Properties в Python - во-первых это красиво
Python не тратит ни одного лишнего байта
Просмотров 1,8 тыс.Год назад
Python не тратит ни одного лишнего байта
ОГРОМНЫЙ обзор и сравнение PyCharm и Visual Studio Code
Просмотров 12 тыс.Год назад
ОГРОМНЫЙ обзор и сравнение PyCharm и Visual Studio Code
Изменяемость объектов с точки зрения управления памятью в Python
Просмотров 1,5 тыс.Год назад
Изменяемость объектов с точки зрения управления памятью в Python
Спасибо. Лучший канал по питону. Надеюсь канал не заброшен
Люблю использовать ленивые вычисления, когда нужно сделать возврат результата из api: list_users = api.get_users() return list_users or [] Или, когда нужно вернуть только первый элемент: return list_users and list_users[0]
Спасибо большое. Довольно чёткое объяснение сложной темы! Я всё понял) Но остался вопрос. Сам Асинхронный код не сильно нагружает программу? Если тяжёлый юзер интерфейс сделать асинхронным, он для процессора станет проще? Для юзера то станет. Вот я к чему)
не, железу проще не станет) наоборот, придётся что-то делать вместо тупого ожидания ответа
@@pythonclinic т.е. получается асихронность не удел слабых ПК? Понятно) Спасибо за ответ!)
еее, бороду отрастил, взгляд у тебя стал строже XD. Cпасибо за видео
хаха, спасибо))
Суперполезное видео, спасибо. Продолжения нет?
пока нет((
Посмотрел весь цикл роликов, большое спасибо, много довольно подробной информации. Редко можно увидеть столько деталей. Про многопроцессорность вроде понятно. Но можно и отдельным процессом отправить запрос, верно? Наверное, очень затратно создавать его для такой пустяковой задачи.. Но а как же многопоточность? Можно же её применить для этих целей. Хотелось бы увидеть сравнительно видео, где все таки лучше применить тот или иной способ(многопоточность/многопроцессорность/асинхронность) И также интересно узнать как применить подобное ускорение на запросы к БД(видимо лучше с этим справяться потоки, но хотелось бы увидеть этот разбор)
насчёт процесса - да, это не очень рационально с точки зрения расхода ресурсов на создание и убийство нового процесса отдельные процессы лучше всего применять для отделения сложных с точки зрения cpu задач, например, рендеринг сотен часов видео без участия пользователя; многопоточность хорошо подходит для связанных между собой задач, например рендеринг пары часов видео- и звуковых дорожек по общим исходникам (тоже без участия пользователя), а асинхронность можно добавлять есть есть i/o операции или попросту интерфейс пользователя, при жедании можно скомбинировать асинхронность с любым из предыдущих примеров, будет ренедеринг видео с возможностью вывода прогресса на интерфейс так чтобы он не замирал при этом
Спасибо, очень полезно!
Приходится переходить на vscode для задач автоматизации на питоне. В пайчарм из-за санкций невозможно скачивать расширения, в частности Docker😢
а впн не поможет с расширениями?
24:30 разве? если 2 класса неявно наследуют object, то они не могу быть ромбовидными, ведь object всегда будет последним в иерархии mro, и соответственно поиск будет линейным, а не ромбовидным. Если бы было явное наследование, например, если бы и B() и C() явно были бы унаследованы допустим от А(), то тогда можно было бы говорить о ромбовидности. В Python 3 все классы неявно наследуются от object, но на конкретном тайм-коде не ромбовидная структура. Если было бы так, то не существовало бы не ромбовидных структур
"то они не могу быть ромбовидными, ведь object всегда будет последним в иерархии mro, и соответственно поиск будет линейным, а не ромбовидным" - всё верно, только причина и следствие перепутаны местами, сначала возникает ромбовидное наследование от object, а потом применяется mro как решение этой проблемы, без mro был бы ромб
Ты случайно Бауманку не оканчивал?
неа, мехмат бгу
Спасибо большое!
Пушка бомба 🔥🔥 красава. Спасибо большое за такое видео
чувак, ты можешь объяснить, мне всего лишь нужно знать Допустим: class MyDescriptores: def __get__(self, instanceу, owner): if instanceу is None: return self return f"Доступ к атрибуту через объект {instanceу}, класс {owner}" class MyClass: attr = MyDescriptores() obj = MyClass() print(obj.attr) каким образом в метод __get__ именно в self попадает экземпляр класса MyDescriptores, а в instance попадает экземпляр класса Myclass, а owner ссылается на сам класс Myclass? Мне именно этот момент не понятен. По какому принципу, и по каким механизмам это работает? Буду очень благодарен за обратную связь.
при обращении к obj.attr автоматически вызывается метод __get__ у дескриптора MyDescriptores. В методе __get__: self - это экземпляр дескриптора, то есть MyDescriptores. instance - это экземпляр класса, к которому принадлежит атрибут, в данном случае obj (экземпляр MyClass). owner - это сам класс, в данном случае MyClass. магия дескрипторов в том, что все эти параметры передаются в сам дескриптор автоматически, можно себе представить такую связь при условии что mc = MyClass(): mc.attr -> mc -> MyClass -> MyDescriptores -> __get__ по дороге как раз собрали ссылки на все нужные объекты
@@pythonclinic это получается какая-то жестко закодированная структура? self в __get__(self, instance, owner) - это всегда ссылка на экземпляр класса в котором он определен, instance - это всегда ссылка на экземпляр класса из которого этот дескриптор вызывается (Если брать в данном случай, как пример с выше, то это Myclass), и owner это всегда ссылка на класс из которого был вызван этот дескриптор(как в моем примере с выше Myclass)? То есть позиции данных объектов в методе __get__ заранее определены, и с этим ничего нельзя сделать? Допустим, если я захочу чтобы сначала во-второй позиции у меня шла ссылка на класс, а потом уже ссылка на экземпляр класса из которого был вызван этот дескриптор? или допустим я хочу оставить в __get__ 2 параметра, или больше 3 параметров? это заранее ошибка?
можно придумать, как передать больше аргументов, а вот меньше или поменять местами класс и инстанс - вряд ли
У вас очень монотонная речь почти без увеличения, уменьшения громкости, без пауз. Я начал засыпать на 4-й минуте. При этом информацию даёте очень интересную, полезную, а главное понятную. Спасибо.
Круто! Понравилось!
Спасибо большое за объяснение! В дескрипторе можно как-то реализовать логику получения модифицированного атрибута как будто сам obj.__name содержит в себе атрибут? Т.е. как бы вызывал модифицированное имя таким образом zephyrka.name.upper. При этом инстанс имеет только атрибут name.
да, точно так же как и для обычного геттера
спасибо мужик! Очень доходчиво обьясняешь!
Можно рассмотреть тему протоколов и дженериков?
Привет! Очень нравится твой контент. Скажи, а все ли переменные хранятся в стеке? Ты привел пример с локальными переменными в функции. Например, переменные, объявленные в глобальной области видимости тоже будут находится в стеке?
хэй, с глобальными переменными немного интереснее, по-сути они являются частью самого неймспейса, и поэтому будут храниться в очень похожей на словарь структуре в куче, она так и называется, globals, если я не ошибаюсь
Спасибо большое! Повторение, мать учения. Так ясно и лаконично!
Ну конструкция i+=1 - нечего не даст:) Да и разница в скорости между range и list com - несушественно. И у меня исход в пользу list com`a. Как по мне timeit, лучше для замеров.
Ютуб пусти! У меня сложилось впечатление, что вы не любите list com, больше, чем я не люблю while(требую его немедленного удаления). Начнём с базы. list com c одним цыклом/условием гораздо читабельнее, чем for. Поговорим о замерах в лекции(Как-же круто, что люди больше использую декотраторы). В чем показатель использования i += 1? Он же нечего не меняет, ну тип: локальные переменные и блаблабла lst = list(range(10)) for i in lst: i+=1 print(lst) #-> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] lst2 = [x+1 for x in lst] print(lst2) #-> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for i in range(len(lst)): lst[i] += 1 print(lst) #-> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] А вот, если мы будем использовать о конструкциях: append(x+1) и [x +1 for .....], то тут сразу фаваритом становится list_com. Внутренний оптимизации ( быйт код, можно подробнее узнать в ceval.c на python git, могу ошибаться с файлом) Ps. C enumerate почти то же самое.
Приятно что ты с нами. На твоих видосах уже доехал до мидла, ты - лучший 😍
спасибо) очень рад твоему прогрессу)
Комент сохранился еееееееееее, это проклятие Новой зеландии, спало.
Кстати, вы в курсе, почему комментарий под лекцией про списки не сохраняется?
иногда ютуб может тормозить комментарии (для модерации, например), но я не вижу, чтобы такое происходило конкретно с этим видео, не представляю
@@pythonclinic Спасибо за ответ!
Опа примеры в деньгах
Надо же было сравнить с проф версией
всё честно, сравниваем бесплатные версии))
@@pythonclinic Думаю было бы полезно рассмотреть в контектсе, когда для тебя не проблема купить лицензию. Тем более, получить проф версию очень легко, есть много способов на ютубе
в целом можно сделать отдельное видео, да
Привет, крутое видео , но может что-то посложнее возьмём. А так очень полезно наверное
можно и посложнее) вообще хотелось проверить интерес аудитории к теме более-менее простым обсуждением
Долгих лет тебе жизни
Спасибо за видео! Интересно было бы послушать развитие темы про интерфейсы. На канале есть видео про абстрактные классы, но хотелось бы послушать про их сравнение с Protocol из typing. Что и когда использовать. Отсюда оттолкнуться и рассказать про Dependancy Injection (можно на примере punq). Было бы прикольно.
запишу себе в список)
Отличный урок!
Немного не тему,но ты сильно похож на "Аньяна" из мультфильма "я,николя".Спасибо за видео!
действительно похож, это забавнно)
@@pythonclinic хаха
Круто, спасибо за разбор! И было бы действительно очень интересно с машинным обучением посмотреть похожие видео
вас понял)
Полностью поддерживаю! Ждем ролики по машинному обучению и нейронкам. 🙏
Круто
Какой чёрт заставляет вас добавлять музыку?
канал отличный! было бы классно иметь возможность иметь такого наставника как вы:)
спасибо за отзыв)
Очень хороший материал
Спасибо за представление, было оригинально и познавательно.
я тут проверила на практике перезапись кортежи получилось, что это работает и для очень больших кортежей (len 20000) а еще это работает для списков и у меня вот вопрос, а для списков исп-ся free-list или все это результат уже каких то других механизмов оптимизации? типо используются последние освободившиеся блоки в пуле? что характерно первые ~50 списков имеют разные id, а потом id внезапно начинают повторяться (некоторые просто подряд) py 3.9, а то мб все уже поменялось
да, этот процесс сложно отследить в ходе простых экспериментов, не прибегая к анализу самой памяти и free-list но вообще да, просто используются последние освобождённые блоки, это самый важный принцип работы интерпретатора с памятью, ну и могу предположить что как раз после создания условных 50 списков (тут важно и время, и количество объектов) у тебя начинает работать сборщик мусора, что и приводит к освобождению этих блоков
@@pythonclinic т е список freeblock в пуле все таки работает по принципу стека? а то я из 1го видео подумала, что там очередь
да, там скорее стек, это соответствует базовому принципу - чем дольше объект просуществовал в памяти, тем больше шанс, что он ещё понадобится
@@pythonclinicспасибо за исчерпывающий ответ) очень интересно у python там все устроено!
Все круто! Подскажите, пожалуйста, а где вы преподаете? Как можно найти?
спасибо) я преподаю онлайн в Минской IT Academy, курс по разработке web приложений на Python + очно веду курс по алгоритмам и структурам данных на специальности "информатика" в EHU в Вильнюсе
С одной стороны просто, с другой - здорово пощупать как это работает
Спасибо, очень интересно. Спасибо что без музыки, досмотрел до конца.
Как всегда обед Как всегда твое видео Огромное спасибо.
частично молодец, но у меня чувство что автор максимум мидл разработчик. Причина проста - for_with_range работает еще медленнее, ну конечно, вы же добавили дополнительную операцию создания списка, что в случае с for просто вынесено за предел функции. дальше - while работает медленнее потому что он низкоуровневый? нет, явно не потому. там вы банально делаете больше операций def while_loop_1(l): start_time = perf_counter() i = 0 while i < len(l): l[i] += 1 i += 1 end_time = perf_counter() elapsed_time = end_time - start_time print(f"Elapsed time: {elapsed_time:.6f} seconds") Elapsed time: 0.016325 seconds слегка оптимизируем def while_loop_2(l): start_time = perf_counter() i = 0 n = len(l) # Pre-calculate the length of the list to avoid recalculating it in each iteration while i < n: l[i] += 1 i += 1 end_time = perf_counter() elapsed_time = end_time - start_time print(f"Elapsed time: {elapsed_time:.6f} seconds") Elapsed time: 0.011326 seconds так что, неверно изложена причина, почему что-то работает медленнее а что-то быстрее. Надеюсь вам будет полезно, а может и кто-то прочтет мой коммент и разберется)
Очень нудно! Не смог даже досмотреть!
В окопе не нужны абстрактные классы
Очень хорошо все объяснили! Интересно было бы еще послушать про паттерны/методологию проектирования, про SOLID и eafp/lbyl было оч полезно! а если более приземленно, то про типизацию (аннотацию типов, typing,pydantic?, дженерики и тп).. юнит-тестирование, логгирование.. Короче, в исполнении профессионала все интересно) А еще момент, мб стоит такие длинные видео делить (например, на BST и RBT), это психологически легче воспринимается, и возможно увеличит число просмотров, а то народ возможно пугает хронометраж)
спасибо) все пожелания учитываются)
Ну хз. Только начал смотреть. Статический метод clean_folder возвращает или булеан или стринг, ну такое
пишу на spyder 🤡
моё почтение
"Читается как дек. Верьте мне" прекрасная манипуляция, почти как "не гуглите это", сразу побежала в гугл переводчик😂 ваши видео по Пайтону самые интересные и содержательные, а стиль кода глаз радует, супер!
спасибо)
Здравствуйте. Благодарю вас за отличное объяснение с прекрасными примерами. Вы рисовали в программе drawio, какой шаблон вы использовали и где его можно найти? подскажите пожалуйста
привет, спасибо за отзыв) я рисую без шаблонов, иногда просто во вкладке style включаю параметр sketch для всего документа, оно даёт такой вид