Собеседование Python 2023. Разбор базовых вопросов

Подготовка к собеседованию на Python Developer

Транскрипция видео:

  • Всем привет Меня зовут Слава Я сеньорцев твой инженер и работу с папином уже много лет сегодня мы разберём базовые вопросы которые задают на Python собеседованиях вопросы повышенной сложности в свою очередь мы разберём в следующем видео что ж поехали [музыка] начнем с основ Что такое пед или предложение по развитию языка Python эти документы являются механизмом для предложения новых возможностей или для документирования уже готовых решений которые вошли в язык Pipe в свою очередь это стоял гайд того как должен быть

    00:00:00 - 00:01:08

  • оформлен код написан на языке Python и которому должны следовать все разработчики которые пишут на этом языке Какие типы данных есть Pine или Какие типы данных изменяемые а какие неизменяемые типы данных поэтому можно разделить на изменяемые и неизменяемые к неизменяемым можно отнести строки байты целые числа числа с плавающей точкой комплексные числа были вы значения NAN кортеже и фразенсеты к изменяемым типам данных можно отнести списки сеты словари байт массивы Что такое виртуальное окружение Зачем

    00:00:43 - 00:01:49

  • оно может быть нужно и какие инструменты для этого используются представим себе такую ситуацию что на одном компьютере нам нужно запустить два pyton проекта которые используют одну и ту же библиотеку только разных версий как раз таки виртуальные окружения помогают нам разрешить самый конфликт когда мы используем виртуальное окружение Мы тем самым создаем что-то по типу песочницы где мы изолируем локальный Python от глобального пальто на это позволяет нам ставить различные библиотеки локально не

    00:01:18 - 00:02:04

  • влияя на Python который установлен глобально нас на компьютере Возможно ли изменить элемент в кортеже если кортеж неизменяем эти данных хоть сам по себе кортеж Это неизменяемый тип данных но он может содержать изменяемое значение допустим у нас есть кортеж который в себе содержит список и единицу хоть кортеж и неизменяемая это значит что мы не можем менять его структуру Но если он содержит изменяемые элементы то мы можем их изменять Например если Мы попытаемся добавить в кортеж третьим элементом двойку

    00:01:41 - 00:02:42

  • то мы получим ошибку потому что они изменяемый тип данных но если мы возьмем нулевой элемент это список и попытаемся добавить в него двойку в конец выведем на экран снова наш кортеж и видим что у нас получилось изменить нулевой элемент то есть коротыш неизменяемость данных меняет структуру его нельзя Но если есть изменяемые элементы внутри то их можно менять Что такое лист по факту лист Эдит компрессию это сокращение для следующей записи Например у нас есть переменная A допустим это пустой список далее У нас есть цикл for

    00:02:11 - 00:03:20

  • и in Range 5 возьмем наш список ставим это элемент и выведем на экран то что у нас получилось видим что мы получили список от 0 до 4 так вот listed comprecational это просто сокращение для вот этой вот записи чтобы получить тот же самый результат Допустим или равно список мы должны указать следующим образом и элемент который мы будем вставлять наш список далее пишем цикл for и in Range 5 если далее этот самый список L то я получу точно такой же результат Как из цикла ранее также в лисса дико compressions можно использовать условия

    00:02:48 - 00:04:13

  • для этого нужно после коллекции либо после генератора указать ключевое слово и указать условия по которым мы будем выбирать элементы которые будем вставлять в этот список Например я напишу и два равно нулю таким образом я выберу только четные числа видим что результат изменился теперь я получил только 024 Как написать разница между лист и сетками в том что используется квадратные скобки используются круглые скобки то есть квадратные скобки на круглые то я плачу сет компрессию видим что в результате у нас получился

    00:03:31 - 00:04:45

  • В чем разница между лист сет и дикомприхером чтобы получить дикомприханшен у меня должен должен быть тут не один уже элемент А должно быть два элемента то есть один для ключа второй для значения мы все также используем фигурные скобки допустим напишем и как ключ и квадрате как значение в итоге мы получаем уже compression выполним наш код и видим результат для нуля ключа будет 0 значение 2 ключа его квадрат будет 4 для 4 его квадрат будет 16 как примеры использования листа это просто распаковка каких-то коллекций

    00:04:08 - 00:05:26

  • либо каких-то генераторов либо просто замена какого-нибудь очень простого цикла когда это не мешает читабельности кода какая разница между операторами равно иис чтобы разобраться в чем разница между равно и задавайте создадим список которого будет значение 1 2 3 допустим и создадим точно такой же список равно так вот оператор равно он сравнивает два операнда по их значениям данном случае у нас списки равны мы получаем True Если бы у нас во втором списке была допустим четверка на последнем месте мы получили бы false

    00:04:47 - 00:05:59

  • вернем тройку на свое место как работает оператор is оператор is он проверяет что две переменные то есть A и B они ссылаются на один и тот же объект в данном случае у нас один список B ссылается на другой список соответственно мы должны получить false Как видим Мы получили false Что будет если мы не присваиваем не новый список а при своем мы получим труп потому что и B ссылается на один и тот же объект Что такое глубокое поверхностная копия зачем они нужны и как их сделать чтобы разобраться что такое глубокое Что такое

    00:05:26 - 00:06:33

  • поверхностная копия Давайте разберем следующий пример допустим у меня есть переменная которая будет списка которая внутри будет один допустим и какой-то вложенный список который будет внутри двойка далее что мы сделаем создадим переменную B которая присвоему соответственно у нас один и тот же список далее произведем следующую манипуляцию в сделаем тройки а в be первое сделаем apend 4 сам список мы добавляем тройку в внутренний список мы добавляем четверку Что произойдет если я принтану A так они ссылаются на один и тот же

    00:06:00 - 00:07:22

  • объект памяти то И у меня тоже поменялся не всегда это то поведение которое мы ожидаем для этого у нас и существует копии соответственно у нас есть два типа копий глубокой поверхностные как их можно сделать самый простой способ это импортировать модуль копии и вместо присваивания и мы можем сделать копии точка копии в данном случае мы создаем поверхностную копию Что это значит поверхностная копия она создает копию самого объекта но ссылки на все внутренние объекты они будут сохранены они не будут скопированы

    00:06:41 - 00:07:53

  • допустим наш пример еще раз видим что когда мы вставляли в тройку она не вставилась потому что у нас сам объект он скопировался в Новую память но когда мы вставляли в первый объект четверку то он также вставился и в переменной Потому что первый объект в первый объект Это один и тот же объект Как сделать глубокую копию нужно просто поменять копию на дипкопе снова запустим наш код и видим что в данном кейсе лист который был присвоен переменной он не поменялся потому что мы сделали его полную копию В итоге еще раз как

    00:07:16 - 00:08:42

  • работает поверхность копия к поверхно копия она копирует сам объект все внутренние объекты она не копирует они доступны по тем же ссылкам глубокая копия на мало того что копирует внешний объект она рекурсивно копирует все внутренние объекты в Новую память если мы меняем Новый объект то предыдущее становится неизменным Как можно создать глубокую поверхность на копию в первую очередь используем метод копии Если же мы рассматриваем список то существует много способов как можно еще создать поверхностную копию

    00:08:00 - 00:09:03

  • например мы можем передать список переменную и это будет поверхностная копия можем использовать срез можем использовать лист компрессию Ну а также можно использовать функцию которая встроена в сам список функцию копия Как работает операторы ent.o.inot что они возвращают очень часто на этот вопрос дают неправильный ответ на собеседование Давайте разбираться почему и как это работает в первую очередь давайте рассмотрим император нот оператор нот действительно приводит объект к какому-то болевого значению

    00:08:31 - 00:09:41

  • Например если мы напишем not пустой список это будет True если мы напишем список сет который содержит какие-то элементы это будет false но операторы and и or они работают немного по-другому они не приводят объекты были вам значениям они возвращают сами объект Например если я возьму пустой список and раз два три то он не вернет пустой список почему это так работает Почему не возвращается false Как работает на самом деле проверяет является ли первая операция True либо если первый оператор является True то

    00:09:09 - 00:10:26

  • end возвращает второй операнд потому что этого достаточно для всего условия Если же первый оператор равняется false то он возвращает просто его то есть еще раз первый оператор если эквивалентен возвращаем первый оператор если True возвращаем второй Как работает or он работает немного по-другому Чтобы что-то было чтобы он было правдой нам достаточно чтобы какой-то из императоров был правдой соответственно мы проверяем первую операнд если он эквивалентен True то мы возвращаем его Если же он эквивалентен false то возвращаем второй

    00:09:47 - 00:11:02

  • оператор Например если у нас пустой список раз два три мы вернем раз два три если у нас список с единицей то мы вернем список с единиц Как работает разрешение пространствами он впадин или как работает правило lgb разрешение пространств поэтому работает По правилу lgb это аббревиатура значит Local and closing globalt разберем следующий пример у меня есть переменная STR в глобальной области видимости я ей задам значение globall дальше определяя функцию аотеры внутри которой я переменной Stern изучаю closing строку

    00:10:25 - 00:11:36

  • далее определяет переменную внутри этой функции где переменной STR придает значение Local STR далее выполняя функцию ener выполняя функцию автор чтобы посмотреть какой будет результат Как работает правило lgb в первую очередь если мы пытаемся обратиться к какому-то имени пайкин пытается искать его в букве L то есть в локальной области видимости в данном случае у нас локальной области видимости переменная stra определена как Local попробуем запустить наш код увидеть какой будет результат Мы видим что поэтому взял

    00:11:00 - 00:12:02

  • переменную как раз таки из локальной области видимости Что будет если в локальной области видимости у нас нет данной переменной тогда Поэтому будет искать букве и то есть в inclosing области то есть в области внешней функции допустим наш код еще раз видим что значение поменялось на enclosing то есть Поэтому взял значение не из локальной так кого там нету а из внешней области видимости закомментируем здесь это значение что будет дальше дальше Поэтому будет пытаться искать это значение в G то есть глобальной области

    00:11:32 - 00:12:29

  • видимости допустим наш код еще раз получаем результат белтин потому что определенно глобальной области Если же закомментировать его и тут пайтон будет искать его в B то есть билденно то есть в именах которые определили в самом py thon допустим код еще раз получаем класс ST потому что я прилетел стр Что будет если Мы попытаемся обратиться к имени которому не существует белтинг то мы получим Error потому что это имя не определено Как работает операторы Global и Non Local допустим глобальной области

    00:12:00 - 00:13:01

  • объявим переменную A которая будет равна единице далее объявим функцию outer внутри которой опишем переменную B которая также будет равняться единице создадим функцию inner внутри которой и би будет присвоено значение двойки запустим функцию inner и принтанем Что произошло с и что произошло B и вызовем функцию auth для того чтобы весь этот код отработал попробуем запустить видим что и равно единице То есть их значение не поменялись почему это так работает на самом деле когда Мы выполняем операцию A

    00:12:30 - 00:13:35

  • равно 2 и B равно 2 Это значит что в локальной области локальном пространстве имен мы определяем новое имя Эй как двойки и B тоже как двойки это не значит что мы глобальную переменную и внешнюю переменную внешней функции поменяем назначение 2 на что если вдруг нам нужно это сделать для этого есть операторы как раз таки Global и Non Lock если мы объявим какую-то переменную как Global то в данном в данном локальном контексте она будет менять значение переменной из глобальной области видимости Если же мы

    00:13:02 - 00:14:16

  • объявим переменную как Non Local то эта переменная будет менять значение и для перемены из внешней области видимости попробуем проверить снова запускаем наш код и видим что и B поменяли свое значение на двойке Знакомы ли тебе такие функции как фильтр тип Приведи пример их использования сперва разберем функцию такая функция которая может быть применена к коллекции она применяет некоторую функцию к каждому элементу нашей коллекции допустим у меня есть которая будет равно и in Range допустим пятерки это список от 0 до 4

    00:13:39 - 00:14:59

  • включительно далее я могу что сделать я могу пи приравнять нулевым элементом Map принимает некоторую функцию которая будет применять каждому элементу этой коллекции допустим это будет лямда функция которая будет принимать X и возвращать X квадрат и Map функцию самому мы будем применять к коррекции получилось это генератор если мы хотим получить в целом посмотреть какой результат будет Можем просто привести это к списку и увидим что Каждый элемент моего первоначального списка завела в квадрат потому что я и передал эту функцию

    00:14:21 - 00:15:36

  • которая вызывает Каждый элемент в квадрат теперь разберем функцию фильтр фильтр работает следующим образом что фильтр также применяют некоторые функцию к каждому элементу этой последовательности если функция которая указана нулевым аргументом она возвращает True этот элемент остается в последовательности если false то нет Что мы делаем допустим у меня опять есть какой-то генератор и for и генератора список Inn Range 5 далее Мы в би приравниваем фильтр м лямбда функцию которая будет принимать X если X это

    00:14:59 - 00:16:24

  • четное число то мы вернем True Если нет то false и применяем весь фильтр к лекции если мы Принт на нем опять же мы получим фильтр обжиг потому что это генератор чтобы посмотреть что у нас там в результате получилось перейдем к листу мы получаем только 024 потому что только не в первоначальном списке делится на 2 без остатка далее функции функция Zip Она работает следующим образом что она может сразу пройтись по нескольким коллекциям допустим у меня есть перемен список А который будет 123 мне список который будет идти

    00:15:40 - 00:17:07

  • например 4 5 6 7 будет список си который будет например там 8-9 далее что мы можем сделать можем пройтись циклом по функции Zip в zip передать несколько коллекций например ABC то есть мы должны одновременно и тренироваться по этим коллекциям и Принт на нем что у нас получилось и Zip он идет сразу последовательности Сначала по нулевым элементам потом по первым элементом до тех пор пока в какой-то из коллекции не закончится все элементы То есть у нас все это самая короткая коллекция в ней всего два

    00:16:22 - 00:17:34

  • элемента поэтому у нас только две операции если все Добавить какой-то новый элемент например 10 то у нас уже получится 3 итерации Как оценивается сложность алгоритмов и почему Что такое бекон алгоритмическая сложность оценивается в bikon atation это метод оценки который определяет Как изменяется затраты на выполнение в зависимости от величины входных данных Какая алгоритмическая сложность основных операций в коллекциях если мы говорим про список в основном это будет Линейная сложность за исключением тех операций

    00:17:03 - 00:18:02

  • которые выполняются в конце списка если мы говорим про сет идикт то в основном это будет сложность за единицу потому что Set Edit под капотом являются Хеш таблицами Теперь давайте поговорим про функции и первым вопросом будет Что такое функция и Какие преимущества использования функций функция это именованный блок кода которым можно обратиться или вызвать из другого места программы основе их преимущество это повторное использование кода какой будет результат выполнения функции Если в ней нет оператора retur разберем пример

    00:17:32 - 00:18:26

  • допустим у меня есть какая-то функция сам у которой внутри нет ничего если я приравняю результат этой функции переменную то я в результате получу на То есть если функции нет оператора Return то она не явно возвращает NAN Что такое аннотации типов зачем они нужны и когда выполняются аннотации типов аннотации типов это своеобразная подсказки Какого типа аргумент мы ожидаем где-то получить Например у нас есть функция сам мы ожидаем что на вход мы примем какую-то переменную она будет интон вернем Мы тоже

    00:17:59 - 00:19:12

  • а внутри у нас будет Допустим квадрат эти подсказки Это подсказки они для самих программистов то есть чтобы например диешка подсвечивает что ты пытаешься передать не тот тип данных и так далее на некоторых линдеров по типу My pii конкретно моем случае я использую по hrm если попробую вызвать функцию сам и передать мне например строку то делишка мне подсветишь то это не тот тип который ожидается в этой функции на самом деле в pythony аннотация Они не работают в рантами то есть они не используются для проверки типов мы в

    00:18:35 - 00:19:37

  • любом случае можем передать аргумент любого типа в данном случае я получу ошибку потому что до стакана не поддерживает возведение в квадрат Но если я передам тот же самый флот то уже ничего плохого не произойдет потому что флот можно возвести в квадрат Хотя это не int так вот еще раз резюмирую аннотации типа фронтайме они в Python не выполняются Они служат только как подсказки для программистов какой тип данных здесь ожидается как правило ими пользуются и деешки и линтеры но есть ряд исключений например Эта

    00:19:07 - 00:20:03

  • библиотека айдентик которая может использовать аннотации типа фронтальной для проверки типа данных например атрибута класса Как передается аргументы в функцию есть два типа передачи аргументов функцию это по ссылке и по значению конкретно поэтому все аргументы функции передаются по ссылке и как это понять допустим у нас есть какой-то список возьмем некоторую функцию сам которая будет принимать это список в качестве аргумента внутри функции мы будем принять ark is a таким образом это будет доказательство приняли мы аргумент по

    00:19:35 - 00:20:42

  • ссылке или по значению допустим эту функцию сам передадим в нее в результате мы получим True почему так произошло что мы передали в нее список это список передался по ссылке то есть переменная ark Это ссылка на тот же самый список на который ссылается переменная и соответственно ark is a это True Что будет если использовать значение изменяя Мотива в качестве аргументов по умолчанию функций И как этого избежать допустим у меня есть какая-то функция сам которая принимает значение по умолчанию мы зададим пустой список что

    00:20:08 - 00:21:11

  • будет если мы сделаем apend единица и будем возвращать вызовем эту функцию три раза сперва без аргументов потом передадим ей явно пустой список опять же без аргументов и опять же пустой список как результат когда мы не Передаем аргумент первый раз мы получаем список с единицы как этого и ожидалось когда мы Передаем явно список в этот список добавляется единица мы его получаем в результате но если мы снова вызываем сам без аргументов мы получаем список с двумя единицами это может быть баг скорее всего этой бак вашей программе

    00:20:39 - 00:21:53

  • почему это так работает когда Python читает наш код и натыкается на сигнатуру функции Сам он читает аргументы этой функции у нас есть тут значение пустой список это значение Он вычисляет никогда мы вызываем эту функцию каждый раз А на момент когда эта функция подготавливается к выполнению То есть когда пайтон первый раз Читает эту функцию он вычисляет значение которое мы задали по умолчанию кладет их в память и в последующем они будут использованы Каждый раз когда мы будем вызывать эту функцию то есть не будет создаваться

    00:21:16 - 00:22:12

  • каждый раз будут каждый раз пользоваться те самые которые были вычислены первоначально как этого избежать допустим мне такой кейс что мне должен быть пустой список по умолчанию самый стандартный Flow это использовать на как значение по умолчанию потому что значение не изменяемого типа и внутри поставить условие IFA is NAN значит А это пустой список то есть создавать значение внутри функции а не в сигнатуре функции в итоге если мы запустим код еще раз то видим что он ведет себя предсказуемо и без ошибок

    00:21:45 - 00:22:47

  • Что такое arks и Кварц Какие типы данных для них используются для примера напишем опять же функцию сам которая будет принимать arx и кварц акция Кварц это особый аргументы которые позволяют принять нам неограниченное количество аргументов когда их можно использовать когда либо мы не знаем Какое количество аргументов нам нужно передать Либо мы должны проигнорировать звездочка arks используется для передачи позиционных аргументов Две звездочки Кварц используется для передачи аргументов ключ значение например

    00:22:15 - 00:23:14

  • функцию сам я могу передать 123 и так далее оно будет передано в arks далее я могу передавать остальные значения по ключам например а равно 1 B равно 2C равно 3 и так далее это все будет передано в кварц для arks используется тип данных кортеж для кваркса используется словарь как это проверить возьмем принтонем внутри функции сам locals и запустим наш код видим что в arx были переданы значения 1 2 3 по порядку позиционные аргументы Кварц были переданы ключ значения А1 b2c3 Что такое лямбда функция и приведи примеры их

    00:22:44 - 00:24:03

  • использования лямда функции эта функция у которой нет имени как правило какая-то короткая функция которая выполняет некоторое одно действие и нам просто не нужно выделять для этого какое-то отдельное имя например напишем словарь а которого ключ это будет некоторое целое значение это тоже будет некоторое целое значение 1 например 322 и 31 допустим не стоит задача что мне надо найти ключ у которого самое большое значение если я захочу воспользоваться функцией Max для этого дела и просто передам в неё А ты получу

    00:23:25 - 00:24:31

  • самый большой ключ в этом словаре то есть тройку если я хочу найти ключ у которого самое большое значение то в Макс можно передать еще и Key это может быть лямбда функция будет принимать каждый ключ и возвращать значение этого ключа и в данном случае нам может на результат мы получим единицу так как у единицы самое большое значение Что такое рекурсия Какие ограничения есть у рекурсив Python и расскажи о плюсах и минусах использования рекурсий в первую очередь Давайте разберемся что такое рекурсия рекурсия это механизм

    00:23:57 - 00:25:02

  • когда функция вызывает саму себя это может потребоваться для например изменения входных аргументов снова и снова чтобы получить какой-то некоторый результат либо же для прохождения некоторой вложенной коллекции Какие могут быть плюсы Плюсы это то что код будет относительно просто выглядеть минусы это то что рекурсе используют больше памяти нежели Например если мы будем решать с помощью использования цикла правило большинство рекурсий можно заменить решением с циклом слева и справа я привел примеры Как напайтоне

    00:24:29 - 00:25:31

  • можно написать функцию которая будет возвращать факториал некоторого числа n слева решения на рекурсии справа решение на с помощью использования циклов как правило как я уже сказал решение которое использует рекурсию она выглядит немножко оно будет немного короче но будет немного красивей но оно будет не столь оптимизирован как будет решение которое используют циклы Если же говорить про ограничение поэтому накладывает ограничение в 1000 вызовов на рекурсию как это можно узнать А можно импортнуть из тонуть из гетри каршин

    00:25:01 - 00:26:09

  • результат получим тысячу Что это значит что если функция вызовет сама себя тысячу раз то в результате мы получим ошибку например напишем функцию сам которая вызывает сама себя и вызовем ее мы получаем рикард шинорор потому что максимальная глубина рекурсии была достигнута также с помощью модуля сис можно установить тот самый рекорсон лимит с помощью Set Set recashion limit на 2000 например Теперь давайте поговорим о классах Что такое класс класс это модель для создания объектов определенного типа который описывает их

    00:25:34 - 00:26:54

  • структуру и поведение тогда что такое объект класса объект класса это некая уникальная сущность определенного типа то есть класса который обладает структурой и поведением Как реализовать метод объекта и что такое селф сначала Давайте создадим класс создадим атрибут name это будет строка добавим инициализатор который будет принимать name заполнять это значение в объекте далее создадим метод объекта который будет просто принтить далее чтобы вызвать метод объекта нам нужно создать непосредственно объект

    00:26:18 - 00:27:34

  • Что значит что метод принадлежит объекту Это значит что этот метод характеризует поведение конкретного объекта и вызвать мы его можем только из объекта мы получаем ожидаем output методы объекта первым аргументом принимают Self Self Это ссылка на сам объект который Мы создали Как реализовать метод класса и что такое CLS создадим опять для примера класс Person у него создадим атрибут класса workplace это будет строка далее можем создать класс метод который будет Place который будет просто возвращать LS

    00:27:04 - 00:28:31

  • Что значит что метод это класс метод класс метод мы можем вызывать без создания объекта класса например но ничего не мешает нам создать объект этого класса и вызвать этот же самый метод из объекта Как видим результат получается такой же самый метод класса Это значит что этот метод он принадлежит всему классу целиком он первым аргументом получает CLS Это ссылка на сам класс и внутри этого метода мы имеем доступ к самому классу и к его атрибутам Как реализовать статический метод примерно пишем некоторые класс А чтобы

    00:27:51 - 00:29:05

  • реализовать статический метод нам нужно обернуть метод в декоратор Статик метод писать какой-то метод например Get & Date Time статический методы по умолчанию они не принимают ничего Да они конечно могут принимать какие-то аргументы которые ему нужны Но они не принимают Self или CLS как какой-то специальный атрибут статический метод можно вызывать из класса также его можно вызывать из объекта класса зачем же нам нужны эстетические методы внутри класса если они не имеют доступа ни К объекту ни к самому классу это

    00:28:32 - 00:29:39

  • может потребоваться просто потому что нам удобно поместить этот самый метод внутри этого класса когда это может быть удобно Если этот метод часто используется внутри данного класса либо же мы хотим поместить группу методов чтобы потом импортировать класс где-то в другом месте нашей программы и все их использовать с помощью имени данного класса поэтому нет модификаторов доступа и все по умолчанию это Public как в Python реализуется паблик правит и протектор методы и атрибуты для примера возьмем класс

    00:29:14 - 00:30:10

  • Python Да действительно у нас нет модификаторов доступа к атрибутам и методам а для этого мы используем такую договоренность как подчеркивание Если же перед атрибутом либо методом Нет подчеркивания это значит что этот атрибут либо метод это паблик Если же перед методом или атрибутом стоит одно подчёркивание это значит что этот атрибут протектор Если же перед атрибутом и методом стоит два подчеркивания Значит это атрибут или метод он считается как правило Как получить доступ к правой атрибуту либо методу из объекта чтобы получить

    00:29:41 - 00:30:49

  • доступ правой атрибуты либо методу из объекта нам нужно сперва создать сам объект напрямую доступ получить не получится если то я получу ошибку потому что этот объект он не содержит атрибута правит почему это так потому что Python искажает имена приватных атрибутов и чтобы получить доступ к этому приватному атрибуту мне нужно написать следующую конструкцию это будет подчеркивание имя класса у меня это а Но дальше имя атрибуты это два подчеркивания правит и видим что теперь у нас получилось получить доступ к правой от атрибут как

    00:30:15 - 00:31:18

  • в классе хранятся атрибуты и методы во всех классах атрибуты и методы хранятся в специальном дандер атрибуте чтобы посмотреть можно просто принятануть имя класса это будет словарь которым ключ значения хранятся все атрибуты например как у меня паблик протектор также и методы например сам это instance метод Class метод это какой-то класс метод и Статик метод Чем отличается атрибут класса от атрибуты объекта и возможно ли использовать одинаковое имя для атрибута класса и атрибут объекта разберем пример

    00:30:50 - 00:31:59

  • у нас есть Класс А у него есть атрибут класса который равен единице также у нас есть и нет у него выните создается instance атрибут который равен двойке так вот Чем отличаются атрибут класса и атрибут объекта атрибут класса это некоторые атрибуты которые общие для всего для всех объектов этого класса То есть если мы поменяем это значение в классе новое значение получится его объект атрибут объекта это та характеристика которая характеризует конкретный объект То есть это свойство конкретного объекта если мы меняем

    00:31:24 - 00:32:22

  • свойства у какого-то объекта то она меняется только у него далее Возможно ли использовать одинаковое имя для атрибуты класса и атрибута объектов как я уже говорил ранее класс используют дикт для хранения атрибутов и методов также дикт используется для хранения данных внутри объекта соответственно если Мы попытаемся использовать одинаковое имя и для атрибута класса и для атрибута объекта это возможно они друг другу не мешают просто потому что они хранятся в разных словарях как это можно проверить

    00:31:53 - 00:32:47

  • например создадим объект класса А Print о нем а точка Это у нас единица теперь принтонем объект класса точка атор Это у нас двойка но как понимать что вот этот атрибут он не перезаписал вот можно либо тонуть еще раз а Мы видим что значение не перезаписалось почему же так произошло если мы посмотрим на а большое дикт мы видим что тут есть наша атрибут Если же мы посмотрим на а малое дикт тут также есть атрибут объекта То есть это просто два разных словаря которые друг другу не мешают Зачем нужен

    00:32:20 - 00:33:39

  • декоратор Property У меня есть класс в котором я писал инициализатор который принимает ферс нами классным забивает их в инстанции атрибуты далее создаем объект этого класса для чего мне в данном кейсе может пригодиться Property Property позволяет создать динамический атрибут в данном кейсе мы можем например описать декоратор Property затем его Full name это instance метод он принимает сел замрика на первом месте у нас будет через пробел нас будет классный как интерфейс можно заметить что Pro версия

    00:32:59 - 00:34:06

  • они очень похожи на атрибуты на самом деле это функции которые выполняются в рантами и динамически рассчитывает это значение также Property Мы можем написать сеттер для этого нужно указать собака имя Property сеттер далее пишем точно такое же название Full name так как это он принимает не только занимает еще и вэлью на свое лето будет какая-то строка которая содержит имя и фамилию значит что мы с ней сделаем это мы сделаем Сплит по пробелу и селфи у нас это будет нулевое значение властные это будет

    00:33:33 - 00:34:50

  • Первое значение и теперь мало того что это гетер теперь это еще работает как Sector то есть я могу написать п фул ней равно name и проверить Принт классный видим что данное значение записались наши атрибуты с помощью Property Что такое абстрактный класс Зачем они нужны и как они реализуются впадин поэтому у нас нет интерфейсов Поэтому вместо них мы используем абстрактные классы Как это работает для этого мы должны описать некоторые класс он должен быть наследником класса ABC из модуля ABC если мы просто от наследуем

    00:34:12 - 00:35:27

  • класс от ABC то он еще не будет абстрактным Что значит что Класс абстрактный Это значит что объект этого класса нельзя создать этот класс он просто определяет интерфейс для классов потомков и этот интерфейс он должен быть обязательно реализован например сейчас я могу создать объект этого класса это значит он не абстрактный чтобы он стал абстрактным Мне необходимо создать какой-то абстракт метод для этого мы импортируем декоратор метод тоже из BBC создаем некоторые абстракт метод например say Samsung

    00:34:55 - 00:36:01

  • реализацию нам делать Не нужно мы можем просто написать Dock string можем просто написать пас Можем написать Rise Но от имплемент неважно чтобы убедиться что этот класс стал абстрактным теперь я не могу создать его объект потому что мне нереализовано абстрактный метод что мы делаем дальше Создаем дочерний класс который будет например Cat наследуем класс если я не реализовал это самый абстрактный метод только это тоже абстрактный класс если попытаюсь создать объект я получу то же самое ошибку что

    00:35:28 - 00:36:31

  • этот класс абстрактный потому что в нем не реализовал что мне надо сделать далее Это всего лишь в классе переопределить этот метод я метод перепределил Теперь я могу создать объект этого класса класс перестал быть абстрактным то есть резюмируя абстрактный класс он определяет интерфейс для дочерних классов которые обязательно к реализации какая разница между методами New и init и какой из них вызывается первым в Python Нет такого понятия как конструктор у нас конструктор отделяется на метод который создает объект и на

    00:36:01 - 00:36:57

  • метод который инициализирует объект метод который создает объект это метод New его задача создать некоторые объекты вернуть его из этого метода далее У нас есть метод init он отвечает за инициализацию объекта То есть он получает уже готовый созданный объект и забивает его какими-то атрибутами Первый из них будет вызываться нее соответственно для создания объекта и будет вызываться потом чтобы этот объект наполнить какими-то атрибутами как это проверить мы писали класс а в нем есть метод в нем есть метод и нет создадим

    00:36:30 - 00:37:28

  • какое-нибудь объект посмотрим на вывод консоль ю потом вызвался какая разница между методами STR и repor и какой из них использовать разберем на примере у меня есть класс Cat у которого есть instance метод name я перепределил и репорт и Эстер какая разница между STR и репер и тот и тот метод он отвечает за строковое представление объекта разница лишь в том что Эстер он отвечает за строковое представление которое ближе к пользователю репр отвечает за формальное представление объекта то есть которое

    00:36:59 - 00:37:59

  • ближе к машине если же мы создадим какой-то объект этого класса и выполним просто Принт объект этого класса то по умолчанию меня отработает STR видимо результат появился на экране если же у меня Stereo нету то будет метод Принт искать репорт который определенном данном классе видим что результат не появился на экране если же и этого метода нету то будет отрабатывать стандартный реппер который определенно уже в классе object если же нам конкретно нужно получить репорт помимо функции Принт есть также функция и реп

    00:37:29 - 00:38:37

  • которым можем использовать объектом этого класса чтобы обратиться непосредственно не к стр А к методу реппор какой из них использовать Если же нам объект нужно печатать в какой-то строке либо где-то еще и представлять данный на вид пользователю то нужно использовать STR Если же мы используем объект в принтах либо где-то еще в строках для того чтобы использовать это в логах каких-нибудь то скорее всего вам пригодится репорт Зачем может быть использована функция Super функция Super может быть использована для того чтобы

    00:38:03 - 00:38:58

  • обратиться к методу родительского класса чаще всего это встречается в инициализаторах Например у меня есть класс который я перепределил инициализатор который понимает некоторые и записывает Это в инстанс атрибут также у меня есть класс B который наследуется от нем Я также перепределил инициализатор который принимает и B чтобы создать атрибут класса потому что он этого требует Мне необходимо вызвать супер и нет и передать туда и далее могу забить атрибуты класса без с помощью также стоит отметить что функция Super

    00:38:31 - 00:39:34

  • она ищет методы Согласно эмбро поговорим про оп Что такое оп оп или объектно-ориентированное программирование это методология программирования которая основана На представлении программы видео в совокупности объектов каждый из которых является экземпляром определенного класса А класса образуют иерархию наследования Какие базовые принципы оп базовым принципом оп относится абстракция наследование полиморфизм и инкапсуляция что такое абстракция абстракция это использование только тех характеристик объекта которые достаточно

    00:39:02 - 00:40:07

  • точностью представляют его нужно представить объект минимальным набором полей и методов и при этом достаточной точностью для решаемой задачи Что такое наследование наследование это принцип ПП согласно которому можно создать некоторые клас на основе предыдущего класса предыдущий класс будет называться родителем а новый класс будет называться дочерней дочерний класс будет получать весь функционал родительского класса Как это работает например мы можем создать объект класса B и объект имеет доступ и к методам и

    00:39:35 - 00:40:33

  • атрибутам текущего класса мы получаем результат метод также существует Здесь также мы имеем доступ и метод который определён в родительском классе и к атрибуту которая также определенным родительском классе таким образом резюмира с два дочерний класс мы получаем весь функционал родительского класса но также можем и расширять эту функцию Когда лучше использовать наследование А когда композицию что же такое композиция что же такое наследование наследование это когда мы берем какой-то класс создаем

    00:40:03 - 00:41:13

  • его полностью на основе родительского класса композиция это когда мы создаем какой-то класс и некоторые классы используем в качестве части данного класса это может быть атрибут класса либо атрибут объекта так вот когда использовать наследование когда композицию при наследовании мы получаем весь функционал родительского класса и потом не можем это переопределить при композиции мы можем на лету поменять этот атрибут на какой-то другой если нам нужен классный а класс например из этого вытекает когда использовать исследования

    00:40:39 - 00:41:36

  • когда композицию Если же нам нужен весь функционал родительского класса то мы используем наследование Если же нам нужен функционал но в последующем возможно нам потребуется его переопределить на функционал из другого класса либо же мы хотим обращаться к родительскому классу как атрибуту этого класса нам нужно использовать композицию Что такое инкапсуляция может подниматься двояко Если же мы говорим про первая трактовка будет такая инфляция это объединение переменных и функций которые привержены общей цели в

    00:41:07 - 00:42:11

  • классе трактовка будет это разграничение абстракции от реализации то есть тем самым это может быть достигнуто с помощью реализации Что такое полиморфизм и Какие типы полиморфизма есть Python взять два типа полиморфизма это хоккполиморфизм и параметрический полиморфизм начнем с параметрического полиморфизма Это означает что у нас есть какая-то функция выполнение которой не зависит от типа аргумента который она принимает То есть у нас есть класс У нас есть класс B у них есть одинаковые функции но они не по типы какого-то

    00:41:40 - 00:42:52

  • одного общего класса Да поэтому конечно не по типу обжиг то в данном случае это не важно у нас функция сам может работать со всеми объектами типа в данных у которых просто есть функция Хай нам неважно передадим нее мы объект класса это будет работать либо объект класса B то есть данном случае мы получаем параметрический полиморфизм Что же тогда такое полиморфизм тогда Функция может иметь множество имплементаций в зависимости от типов входящих аргументов так например работает физика си плюс плюс в джаре поэтому изначально у нас

    00:42:18 - 00:43:20

  • нет такого функционала но мы можем его реализовать с помощью своих рук например функция тут же сон в зависимости от типа входящих данных она может возвращать различные значения Что такое миксин и чем миксин отличается от обычного класса допустим у нас есть класс документ этот класс он реализует функционал для некоторых документов это может быть путь к файлу могут быть какие-то методы которые его обрабатывают далее У нас есть миксин S3 файла плод миксин этот миксин отвечает только за то что некоторые файл загрузить в конкретно S3

    00:42:49 - 00:43:50

  • также у нас есть классмент который будет содержать реализацию некоторых специфичных методов конкретно для цсв документа и он наследует и Документ и S3 файла плод Максим чем же разница между обычным классом и классом миксеном для обычного класса Мы скорее всего захотим создавать его объект класса миксина нет потому что класс миксен он будет содержать как правило некоторую мелкую логику которую мы можем подмешивать с помощью наследования поэтому оно называется миксин то есть пайтон это тот язык который поддерживает множественное

    00:43:21 - 00:44:20

  • следование соответственно мы можем подмешивать эти миксины в любом порядке В любом количестве тем самым наш дочерний класс может получать собственно некоторые функционал допустим это может быть со своей документ который мы хотим чтобы у мел загружаться в S3 потом мы захотим создавать например Word документ Excel документ который тоже захотим грузить в S3 Мы просто будем подмешивать этот миксин в эти классы и он будет получать этот самый функционал Теперь давайте поговорим про декораторы Что такое замыкание

    00:43:51 - 00:44:49

  • замыкание это механизм когда одна функция использует переменные из внешней области видимости Например у нас есть функция ED Number которая будет принимать какой-то A у нас также есть функция AD которая будет принимать какой-то B но в свою очередь три функции этому используем переменную из внешней области видимости то есть из функций от Number Как это работает Если я захочу создать некоторую переменную например будет at Five которая создана с помощью edumber передам туда пятерку что произойдет в коде я вызову эту функцию

    00:44:20 - 00:45:20

  • передам туда пятерку она мне вернет функцию которая внутри нее находится функцию но эта пятерка она будет заполнена в памяти и дальше если я буду вызывать например функцию ad5 и буду передавать туда какую-нибудь число к нему будет прибавляться пятерка потому что мы запомнили ее ранее на этом основан принцип замыкания Что такое декоратор И зачем нужны декораторы декоратор это паттерн проектирования он может быть нужен За тем чтобы изменить поведение функции либо класса без изменений исходного кода

    00:44:50 - 00:45:51

  • функции либо класс Как реализовать декоратор впадин канонический декоратор реализуется с помощью классов но впадине есть две замечательные вещи во-первых у нас есть синтаксический сахар с помощью символа Эд во-вторых У нас есть принцип что функция это объект первого класса Это значит что функцию можно передать другую функцию в качестве аргумента и вернуть из другой функции в качестве результата так вот чтобы реализовать декоратор Нам необходимо реализовать замыкание которое принимает функцию внутри этого

    00:45:21 - 00:46:14

  • декоратора мы пишем функцию обертку которая будет пробрасывать аргументы в нашу исконную функцию далее мы можем выполнить какие-то действия до выполнения нашей функции потом вызвать эту саму функцию передав ее аргументы выполнить действие после нашей функции и вернуть результат тем самым добавляем какой-то дополнительное поведение до и какой-то дополнительное поведение после чтобы применить весь декоратор какой-то функции достаточно использовать синтаксический сахар и от декоратор потом соответственно код нашей функции

    00:45:47 - 00:46:43

  • далее мы можем просто вызвать нашу функцию say и увидеть что она выполняется уже с кодом декоратора Как реализовать декоратор который может принимать аргументы чтобы реализовать декоратор который может принимать аргументы у нас появляется просто дополнительный уровень вложенности нас все так же есть декоратор который принимает функцию которая внутри есть фраппер который выполняет эту функцию но также у нас появляется внешний слой Это просто функция которая принимает как какие-то аргументы которые в будущем

    00:46:15 - 00:47:11

  • должен принимать этот самый декоратор и возвращает вложенный декоратор чтобы применить декоратор с аргументами к функции надо просто указать с помощью синтаксического сахара это имя декоратора передать него необходимые аргументы далее мы просто можем вызывать нашу функцию с ожидаемыми аргументами и видит что декоратор наш работает в данном кейсе он повторяет выполнение функции Хай три раза теперь поговорим про итераторы Что такое италируем объект или же объект это объект который предоставляет возможность поочередного

    00:46:43 - 00:47:50

  • прохода по своим элементам Что такое итератор Как создать оператор из коллекции разница между итератор в том что это был реализует метод в свою очередь итератор реализует метод Как создать итератор из некоторые коллекции это нам потребуется какая-нибудь коллекция например это будет список далее мы можем вызвать функцию списком чтобы получить итератор гидро принимает terrable соответственно мы Передаем ей а если мы принято нём И у нас есть лист итератор Как можно убедиться что это на самом деле итератор

    00:47:16 - 00:48:25

  • у него должен быть метод Next next indir и мы должны получить True Да все верно далее мы можем из этого итератора По требованию брать некоторые следующие элемент с помощью функции Next 1 1 2 и так далее Как сделать класс который будет поддерживать протокол итератора напишем некоторые класскаунтер которого будет некоторая current value это будет винтовое значение напишем инициализатор который будет этот Карен устанавливать в ноль далее классы которые будут поддерживать протокол итератора должно быть два

    00:47:51 - 00:49:13

  • метода это метод должен вернуть данном случае мы просто Вернемся также должен быть метод Next метод Next должен вернуть следующий элемент из коллекции мне это будет Карен далее как с этим работать можно создать объект этого класса и работать с ним в цикле видим что мы подряд получаем элемент либо же мы можем создать оператор и с помощью функции Next получает следующий элемент Теперь давайте поговорим про генераторы Что такое генератор Как написать на pything-генератор и Какие преимущества использования генератора относительно

    00:48:32 - 00:49:50

  • функции синтаксический генераторы отличаются от функции немногим мы можем просто написать некоторую функцию вместо указать у нее внутри гилт тем самым мы получим генератор Какие преимущества использования генератора относительно функции это то что генератор может вызываться по требованию то есть мы можем создать объект генератора когда мы эту функцию вызываем то есть выполняем мы не получаем ее результат А мы получаем объект генератора далее из этого объекта генератора Можем по требованию забирать следующее значение с

    00:49:27 - 00:50:29

  • помощью функции когда таких значений не останется то мы получим стопы и из этого вытекают основные преимущества использования генератора относительно функции что мы можем код выполнять по требованию тогда когда нам это нужно с очень же когда функция она выполняется полностью до конца до ключевого слова Return либо до конца своего блока кода и возвращает полностью весь результат соответственно генератор он может на ходуном возвращать либо генерировать какие-то значения функции возвращает всю коллекцию целиком Вот это

    00:49:57 - 00:50:51

  • и есть основное преимущество использования генератора относительно функций Что такое генератор компрессию сегодня мы с вами уже рассматривали лист дикт и сет compressions Но если же мы укажем например круглые скобки и тут укажем и in Range 5 то мы не получим кортеж потому что не изменяемый тип данных мы получим генератор объект А что это значит что данное выражение это выражение генератор компрессия с помощью которого мы можем очень кратко указать создать какой-то генератор объект что дальше можно с ним

    00:50:28 - 00:51:35

  • сделать Дальше можно с ним работать в цикле либо же можно с помощью функции Next по требованию запрашивать следующий элемент 01 и так далее Может ли в одном генераторе быть много елд Если да то как это работает напишем простой генератор у которого внутри будет несколько eld сразу отвечаю на вопрос Да это возможно как это будет работать сперва мы должны создать объект генератора напоминаю что в этот момент код у нас внутри не стартует мы просто создаем объект генератора далее когда Мы выполняем первый раз функцию Next то наш код

    00:51:01 - 00:52:14

  • доходит до 1 eilt и возвращает значение которое указано справа от Yell мы получаем единицу далее этот код останавливается на этом моменте генератор запоминает На каком моменте он остановился При следующем Next мы стартуем от момента когда он остановился до следующего то есть тем самым мы получим 2 и снова наш генератор становится если мы вызовем Next еще раз мы уже получим 3 Если еще раз наше значение закончились больше нет генераторе соответственно мы получим стопы раньше Зачем нужна конструкция eilt From

    00:51:40 - 00:52:38

  • допустим у нас есть два генератора генератор First который мне будет постоянно ездить единицу и генератор Second который будет возвращать двойку каждый раз представим такую ситуацию что мне нужно во втором генераторе вернуть все значения из первого генератора как раз таки для этого используются конструкция guildfrom это значит Верни все значения из какого-то другого генератора то есть из First у меня будет что мы можем сделать мы можем создать объект генератора Second и далее если мы будем проходить в цикле либо с помощью

    00:52:09 - 00:53:05

  • функции Next я буду использовать цикл Для более простого решения будем принять подряд то что нам возвращает наш генератор Сперва он вернет все значения с первого генератора потому что мы указали елдром первый генератор далее он будет возвращать свои значения теперь поговорим про менеджеры контекста Что такое менеджер контекста менеджер контекста это конструкция with S которая позволяет нам обратиться к какому-то объекту получить какой-то другой объект и далее работать внутри этого контекста Если возникнет какое-то

    00:52:37 - 00:53:40

  • исключение то у нас есть специальный код который может это исключение обработать Как реализовать класс объект которого может работать менеджере контекста Что будет присвоено после АС Какие аргументы принимает Exit META чтобы реализовать класс который может работать менеджере контекста нам нужно реализовать два магических метода первый это Enter 2 это Enter этот метод объекта в котором мы просто описываем действие которое необходимо выполнить по входу в контекст это действие которое связано непосредственно с вашей задачей это

    00:53:09 - 00:54:03

  • может быть открытие файла открытия соединения или что-нибудь еще метод Exit в свою очередь он выполняется по закрытию контекста либо когда у нас возникает Exception в данном контексте он принимает Self потому что это метод объекта далее он принимает тип ошибки которая возникла внутри контекста значение этой самой ошибки и трешбэк то есть данном методе мы можем выполнить какие-то действия чтобы эту ошибку может быть залогировать как-то обработать и так далее как это будет работать with далее мы создаем объект нашего класса

    00:53:36 - 00:54:33

  • раз object что будет происходить после выезд мы создаем объект далее вызывается метод Enter у нас создается как бы соединение в контексте мы можем произвести какие-то действия когда мы покидаем контекст возвращаемся Вот на это место у нас будет выполняться метод Exit в котором будет закрываться наше соединение Если возникнет какая-то ошибка то Exit получит Type Exception значение value и trashback информацию от разбеки по этой ошибке Давайте поговорим про исключением Какие блоки для обработки исключения

    00:54:03 - 00:55:12

  • существуют в pyth когда каждый из них выполняется существует четыре блока для обработки исключения первый блок это Try второй блок это except третий блок это элс и четвертый блок это файли когда каждый из них выполняется траве выполняется всегда в нем мы помещаем какой-то код который может вылетать с ошибкой except выполняется только в том случае если Трай завершился с какой-то ошибкой которую ловит этот самый выполняется в том случае если Трай выполнился без ошибок и выполняется в любом случае

    00:54:39 - 00:55:45

  • Можно ли использовать несколько Excel Если да то как это будет работать Да несколько except можно использовать они будут обрабатываться порядки их очередности то есть ошибка которую мы вызываем блоки Трой либо которая возникает в каком-то блоке она будет сравниваться с типом ошибки которые указан в except если он подходит то эта ошибка будет использована например в данном случае кидаю valor то первый блок Он отрабатывает если это будет ошибка Exception то будет обрабатываться второй блок но тут Важно помнить о порядке этих

    00:55:12 - 00:56:09

  • самых исключений Например если первым исключением Я укажу как раз таки Exception а вторым были урор Exception он является базовым исключением для valuar То есть он является родителем для класса соответственно были рор он будет подходить под dexection и блог который ловит valeror он никогда не сработает Давайте проверим видим что у нас отрабатывает только Exception Когда в данном случае Не сработает Можно ли одним блоком Accept ловить несколько типов исключений Да можно для этого нужно указать в кортеже типы

    00:55:41 - 00:56:43

  • исключений которые мы ожидаем отловить данным excepton как это будет работать если возникает исключение оно подходит под один из этих типов то его будет обрабатывать этот Excel Если же нет его будут обрабатывать следующие проверим value наше исключение сработало точно так же оно сработало Если надо будет Допустим синтаксирор либо стопы трэшн то мы получаем ошибку потому что этот except не ожидают получить этот тип ошибки В чем разница между except xceptxection Давайте разберем на примере у меня есть

    00:56:13 - 00:57:19

  • блок Drive который будет выполняться некоторый код есть Accept Exception есть axed без ничего Accept Exception это тот эксепт который ловит конкретный тип исключения то есть Exception Exception это базовый класс для всех Python ошибоксат без ничего он ловит так называемый Бей язык это базовый класс для всех ошибок Exception является его дочерним классом помимо Exception там есть некоторые дополнительные ошибки по типу генератор Exit systemaxit и так далее попробуем немного воспроизвести данную ситуацию

    00:56:46 - 00:57:48

  • сделаем брайс valor это дочерний класс Exception соответственно первый except у меня должен отработать все верно далее попробуем кинуть генератор Exit в данном случае у нас работает Basic потому что Exception не включает в себя генераторы как приподнять исключение в блоке except либо как и разницу допустим у меня есть какой-то внутренний блок trixcept либо это может быть trixet внутри какой-то функции которую Мы выполняем в блоке Try неважно и внутри там происходит ошибка у нас есть какой-то обработчик который ловит этот

    00:57:16 - 00:58:21

  • тип ошибки и далее мы можем ее обработать залогировать и так далее но если мы эту ошибку словили вот этим except там то далее внешняя обработчик ее не словит потому что это ошибка уже была обработана Что надо делать если нам нужно эту ошибку поднять вверх по стеку как это сделать в данном случае нам просто достаточно написать ключевое слово Rise если мы запустим этот код мы увидим что ее обработал и внутренний обработчик и внешне обработчик Зачем нужны классы Basic section Group и Exception Group Basic Group Exception

    00:57:50 - 00:58:50

  • Group позволяет нам кинуть сразу много исключений за раз например у нас работает какой-то код который собирает какие-то типы ошибок мы можем это все обернуть в Exception Group дать туда какое-то название всеобщее всех этих ошибок и собрать тут какое-то количество н- ошибок они могут быть разных типов это неважно также тут может быть вложенный Exception Group это тоже будет работать можем дальше разнуть эту группу их словить и как-то обработать Эти ошибки вместе либо как-то По отдельности это будет работать для чего тогда нужен

    00:58:20 - 00:59:22

  • Basic section Group если допустим у нас ошибка это какая-то ошибка которая является дочерним классом от basics например генератор exition Group тут не будет работать потому что он не может обернуть это типа ошибки в данном случае Нам нужен Basic соответственно нужно поменять в коде на basicsion grouplove и это опять будет работать В чем разница между except XP со звездочкой И зачем нужен exceps со звездочкой exceps со звездочкой это функционал который появился также в Python 311 он облегчает работу с

    00:58:51 - 00:59:51

  • Exception группами как это будет работать Допустим мы кидаем Exception группу которая содержит несколько типов исключений например там typeror valeror не важно далее мы можем указать не просто except Accept со звездочкой где у кожа мотив ошибки которые мы ожидаем получить первый Exception звездочкой будет рор что будет происходить мы кидаем эксепшен группу наша группа будет распакована на несколько Exception групп первый except обработает только typeror То есть он получит новый Exception группу которая будет содержать только

    00:59:21 - 01:00:26

  • тайп роры второй except Он также будет обработан То есть он будет выполняться он получит новые которые будут содержать только белью если мы запустим код то видим что 2x септа отработали первый на Type rov второе на Бали уроры в каждом по одному Exception Потому что так у меня указано в Exception группе Также важно уточнение что excepts звездочкой и обычный except они не могут быть в одном блоке Try это не будет работать то есть либо мы ловим на конкретные ошибки Либо мы используем Exception звездочкой которая позволяет

    00:59:53 - 01:00:54

  • более легким образом работать с Exception группой Как создать свой тип исключения Зачем может потребоваться создавать свой тип исключения свой тип исключения создать не сложно для этого достаточно отнаследоваться от какого-то базового исключения например класс Custom который мы наследуем от Exception и в большинстве кейсов этого будет достаточно зачем мы будем это делать Зачем создавать кастомное исключение для того чтобы если мы поднимаем это исключение мы получали более информативный вывод то есть не просто

    01:00:24 - 01:01:25

  • Exception а просто название Каста когда это может помочь например что у нас есть какой-то специфичный клиент например клиент который коннектится какой-то другой серпантий Мы хотим указать что этот Exception он относится только к этому клиенту Когда мы можем создать какой-то кастом Exception Exception и кидать его там где нужно также есть возможность как правило это происходит с помощью определения и не то например тут у нас будет месяц какой-то дефолтный дальше что можно будет сделать с помощью супера поднять и нет из

    01:00:54 - 01:02:04

  • базового исключение передав туда Просто message Как теперь это в данном случае будет работать что мы теперь опять можем разнуюсь в Custom Exception передать туда какое-то значение 123 будет использован дефолт message и напоследок поговорим про импорт Что такое модуль модуль это файл с расширением qi который содержит код на Python Что такое пакет пакет это некоторая директория которая содержит Python модули также она может содержать файл init.by до версии 3.3 это условие было обязательным для существования пакета чтобы был файл и

    01:01:37 - 01:02:50

  • нет пай после 3.3 это уже является не обязательно когда выполняется файл и нет Пай и как много раз он будет выполнен Нам нужен для того чтобы указать инструкции которые будут выполняться при импорте пакета либо модуля из этого пакета он выполняется только один раз когда Python первый раз натыкается на импорт соответственно пакета либо его модуля разберем следующую структуру У нас есть пакет есть и нетпаев в котором есть просто Принт есть модуль в котором есть переменная А которая равна единице далее У нас есть модуль в самом Проекте

    01:02:14 - 01:03:13

  • в котором мы импортируем пэкаш модуль импорт также у нас есть файл Main в котором мы импортируем данный модуль и потом опять же делаем такую же инструкцию запустим этот файл и видим что выполняется только один раз то есть первом случае пакеты либо модуля В чем разница между импортфу и фромфу импорт бар разберем следующий пример допустим есть какой-то модуль в котором я определю два имени A = 1 и B равно двойке также у меня есть файл Main в котором мы проверим В чем разница между этими двумя импортами рассмотрим первый случай если

    01:02:43 - 01:03:57

  • я импортирую весь модуль то этот модуль у меня доступен в данном пространстве имен модуль и все Что находится у него внутри доступно с помощью имени этого модуля и B доступны во втором же кейсе САМ модуль у меня как имя недоступно Я просто из этого модуля взял те имена которые были там и сделал их доступными в данном пространстве То есть у меня будет доступны без указания имени модуля В чем разница между From Full import Bar и fromful import звездочка опять же у меня есть модуль в котором определены два имени это а равно единица

    01:03:20 - 01:04:32

  • B равно двойки далее есть модуль Main в чем же разница если при первом случае если From модуль импорт а делают то у меня доступно только переменная а переменная B у меня недоступна так как я ее не импортировал Если же воспользуюсь вторым кейсом сделаю From модуль звездочка то все имена которые есть там модуля будет импортированы в текущее пространство В итоге у меня будет доступно и у меня будет доступно но стоит отметить что это не лучшая практика Зачем используется аспри импорте разберем пример что мне нужно из

    01:03:56 - 01:05:06

  • какого-то модуля с импортировать какое-то имя Но это же имя используется в данном модуле тогда мы можем указать какой-то псевдоним чтобы иметь другого модуля было доступно под другим именем в текущем модуле в данном случае Они уже не будут конфликтовать друг с другом также иногда это используется для того чтобы задать короткий Алис для библиотек с длинным именем например алхимии или пандус Когда возникает проблема циклического импорта и как ее решить проблема циклического импорта возникает тогда

    01:04:32 - 01:05:33

  • когда два модуля пытаются импортировать какие-то данные друг из друга как это можно решить обычно это решается тем что в третьем модуле Мы разрешаем как эти конфликты импортируем какие-то переменные третьим модуле потом он где-то используется дополнительно разберем пример у меня есть модуль First в нем есть также переменная и которая равна единице есть также модуль Second который переменной B = 2 Есть третий модуль Main если я попытаюсь импортировать эти два модуля то я получу соответственно ошибку

    01:05:02 - 01:06:04

  • потому что у меня есть циклический импорт как решить эту проблему можно просто убрать импорт первого модуля добавить также переместить его в Main Теперь у нас есть нормальный импорт нет никаких ошибок Сегодня мы разобрали с вами базовые вопросы которые задают на Python собеседовании в следующем видео мы разберем вопросы повышенной сложности Спасибо за внимание [музыка]

    01:05:33 - 01:06:24