background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Практика программирования на Python 3, лекция №13"

input logo icon
Теги видео
|

Теги видео

мфти
фопф
информатика
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:03
садитесь пожалуйста нас мало но мы в
00:00:08
тельняшках мне очень интересно какая
00:00:11
главная причина того что вы отсутствуете
00:00:13
меня есть несколько вариантов там первый
00:00:15
это что 9 утра понедельник контенте
00:00:19
роллы вы сами говорили вот но я не сбрасываю
00:00:22
со счетов то что просто скучно виду рот
00:00:26
них чем заняться вот и может быть вас
00:00:29
напрягают уже другие предметы задания но
00:00:32
тем не менее мне бы хотелось чтобы вы
00:00:35
хотя бы как-то доносили ту информацию
00:00:37
которую буду вам говорить потому что ни
00:00:41
в одном курсе я не слышал таких вещей
00:00:45
хотя они кажутся может быть болтливый
00:00:48
внуками как болтологии какой то я вам
00:00:52
рассказываю про там стиль кодирование
00:00:54
рассказываю про там необходимость
00:00:55
документации как оно правильно делать
00:00:57
как нудятина в каком-то смысле вот
00:01:02
сегодня расскажу вам про еще одну
00:01:04
концепцию в программировании и в
00:01:06
проектировании о которой я еще раз скажу
00:01:13
не слышал ни в одном курсе информатики
00:01:14
не кафедры информатики не в принципе на
00:01:16
физтехе я думаю что наверное нас всяких
00:01:22
там вузах найти специальностях про это
00:01:24
рассказывают вот но вообще это очень
00:01:27
важно что программисты делают большую
00:01:31
часть своего рабочего времени
00:01:33
а
00:01:38
benga ищет ошибки к сожалению сейчас я
00:01:42
имел достану увы программисты
00:01:54
ищут ошибки и а одна из важнейших задач
00:01:58
это каким-то образом уменьшить
00:02:01
количество ошибок в программе для того
00:02:07
чтобы упростить решение программистских
00:02:10
задач придуманные разные методы
00:02:13
декомпозиции яппи слова произносил то
00:02:16
есть по сути у нас есть задача я ее
00:02:18
таким кругом просто нарисую эту задачу
00:02:20
как бы разрезаем на кусочки для этого
00:02:23
подходят что
00:02:25
модульное программирование да мы
00:02:29
разрезали на большие крупные единицы на
00:02:31
модуле в рамках модуля
00:02:34
мы если мы пользуемся опытом и нарезаем
00:02:37
на объекты ну и функции
00:02:40
надо понимать что у apple иногда бывает
00:02:44
чрезмерен не надо стрелять из пушки по воробьям
00:02:46
если там нужно просто функция не надо
00:02:49
для этого писать класс который содержит
00:02:51
один метод да и нет у него никаких полей
00:02:55
которые бы надо было реально сохранять и
00:02:57
да тогда усложняется то есть мы создаем
00:02:59
молчали объект записи он туда какие-то
00:03:02
атрибуты потом вызываем его метод это
00:03:04
может быть довольно странно есть другие
00:03:06
способы работы с этим но тем не менее
00:03:09
вот кратко на как происходит
00:03:11
декомпозиция как происходит движение
00:03:14
сверху вниз от проблемы к ее реализации
00:03:17
да вот и в детали в детали вникание то
00:03:20
вначале mature чем себе задачу
00:03:22
разделяемые крупно на модуле потом
00:03:25
нарезаем уже каждый конкретный модуль на
00:03:28
какие-то классы а вот так вот это дело
00:03:30
до в классах мы прописываем как
00:03:33
конкретные методы или
00:03:34
еще раз класса наравне с функциями
00:03:36
верхнего уровня до смотрю сейчас
00:03:39
нарезаем его на методы да причем каждый
00:03:43
класс мы стараемся наделить некоторой
00:03:45
ограниченной зоны ответственности
00:03:47
чтобы было вообще понятно зачем он чем
00:03:50
он занимается и чем он
00:03:51
не занимается и вот это вот расчленение
00:03:54
ответственности помогает все той же
00:03:56
декомпозиции за счет этого задача
00:03:59
упрощается где же возникают ошибки
00:04:02
казалось бы вот допустим мы сделали
00:04:04
идеальную декомпозицию вот у нас задача
00:04:08
разбита на такие маленькие удобно
00:04:10
переваренные кусочки как вилкой и
00:04:12
ножичком отрезает вытяните да там
00:04:15
какая-то дамочка и вот маленький кусочек
00:04:17
аккуратно маленький рот кладет и
00:04:18
аккуратно пережевывает да вот вот мы
00:04:21
разрезали вот на такие что самые-самые
00:04:26
низко образованный программист
00:04:29
маленькую задачку способен переварить он
00:04:32
там не юлий цезарь и не может там 9
00:04:35
вещей делать одновременно может сразу
00:04:37
много переменных удерживать в голове нам
00:04:39
35 переменных он может удерживать он
00:04:41
может решить в чем возникает главной
00:04:43
ошибке тогда во взаимодействии вот этих
00:04:47
вот частей которые мы нарезали то и дело
00:04:50
в том что классы друг с другом
00:04:52
взаимодействуют функции друг друга лук в
00:04:55
конечном счете класс это ну некоторая
00:04:57
отсрочка над некоторыми функциями да ну
00:05:00
и возможность там сохранить некие
00:05:02
дополнительные значения для того чтобы
00:05:05
использовать их вместе с ними на но нам
00:05:07
удобно пользоваться объектом в этом
00:05:08
смысле да я сейчас не буду
00:05:11
дополнительные вещи рассказывать про об
00:05:13
и не не хочу но идея в том что очень
00:05:17
много проблем связанных ни с реализацией
00:05:21
самих функций даже а с проблемами
00:05:26
интерфейса взаимодействия понимаете то
00:05:29
есть не могут нормально вот эти части
00:05:32
работать друг с другом хотя вроде бы
00:05:35
каждая отдельная часть может быть
00:05:37
написаны правильно то есть я вам
00:05:42
немножко рассказал в прошлый раз про
00:05:45
тестирование украдь кратенько совсем на
00:05:48
еще не входил в детали про тестирование
00:05:50
в следующий раз будем говорить про
00:05:52
тестирование это очень важная тема
00:05:54
приходите обязательно вот но а сейчас я
00:05:59
хотел бы не про именно вот сами то потом
00:06:01
чё происходит какие
00:06:02
какая штука эта модуля может быть
00:06:04
модульным и за день я показал такую
00:06:05
простую вещь которая бери да пользуясь
00:06:07
сразу док тест не знаю на сколько было
00:06:12
видно и понятно но вот прописываешь
00:06:14
буквально в документации к функции
00:06:16
прописываешь те действия которых так не
00:06:19
ожидаешь и если этот модуль запускается
00:06:23
отдельно ты делаешь тестирование ну там
00:06:25
пара строчек вставляется и все показывал
00:06:27
код выложен в репозитории можно
00:06:29
посмотреть и тем не менее еще раз вот
00:06:31
каждая функция работает идеально но
00:06:34
из-за раз согласованности интерфейса мог
00:06:37
может возникать ошибками вся программа
00:06:39
целиком в итоге задача не решает в нем
00:06:41
возникают баги и прекрасная вещь
00:06:46
структурное программирование прекрасная
00:06:49
вещь модульная когда мы можем в крупную
00:06:51
модуль замечательная вещь об и все равно
00:06:54
не решает то есть еще раз до 1 затащить
00:06:57
декомпозиция втрой композиция это должна
00:06:59
произойти что может помочь
00:07:02
первое компилятор мы с вами изучаем
00:07:09
сейчас практику программирования на основе
00:07:11
языка python в принципе можно было бы на
00:07:14
основе другого языка изучать вот есть
00:07:17
пример там fi схема у которых практика
00:07:20
программирования как раз на си плюс плюс
00:07:22
у них ровно обратной стороне алгоритмы и
00:07:24
структуры данных проходят на питоне
00:07:26
практика программирования на си плюс
00:07:28
плюс и она у них позже естественно
00:07:31
потому что си плюс плюс с нуля отдавать
00:07:33
ну как просто убить сразу в мозг с вами
00:07:37
мы выступаем иначе нас опережающее
00:07:39
обучение практике
00:07:40
а потом мы со второго семестра начинаем
00:07:42
алгоритмы и структуры данных
00:07:44
вот так вот
00:07:49
компилятор позволяет то есть сама сам
00:07:54
процесс так называемый компиляции хотя
00:07:57
на самом деле тут есть некоторые
00:07:59
однозначность я говорю компилятор
00:08:01
подразумевая что си плюс плюс
00:08:03
но смысл следующий есть такая вещь как
00:08:05
строгая типизация даже не настолько
00:08:08
привязана к процессу компиляции но
00:08:11
обычно когда идет компиляция это
00:08:14
подразумевается
00:08:16
компиляция я в скобках подпишут строгая
00:08:20
проверка типов строгая проверка типов то
00:08:28
есть если эту функцию необходимо
00:08:31
вызывать с ну например
00:08:35
строкой то ее должно то есть компилятор
00:08:38
прям проверить что такая-то строка вот
00:08:41
тут ее вызвали с каким типом что туда
00:08:43
фактически к фактические параметры туда
00:08:45
засунули понимаете я напишу кратенько я
00:08:48
сотру потом но это тем не менее вот
00:08:50
представьте себе вот я делаю некоторую
00:08:52
функцию которая будет например вычленять
00:08:58
часть строки да и вот оно будет например
00:09:01
как стр
00:09:03
я сделал сна и каскад string и она
00:09:11
получает с и вот она там делает
00:09:14
что-нибудь со строкой и возвращали я
00:09:16
просто сразу делаю регион там и она
00:09:19
берет какой-нибудь срезать строки я
00:09:22
помогу срезы вам особо не рассказывал
00:09:24
как или рассказывался
00:09:27
где-то я их рассказал вам самом начале
00:09:30
про строки но не акцентировал еще раз в
00:09:32
этом курсе мы не делаем упор на
00:09:34
синтаксис питона я надеюсь что вы его
00:09:36
как-то походу там освоить и потому что
00:09:38
но скучно на лекции тупо синтаксиса
00:09:41
рассказывать его minor на скучно сидеть
00:09:42
записывает проще в справочнике для ну
00:09:44
короче с от там условными на этом от
00:09:47
десяти до двадцати
00:09:49
не включительно до от с 11 символ а
00:09:53
потому что 0 еще вида по 20 не
00:09:56
включительно в итоге но смысле по 21
00:10:01
начни суть вашим или если считать 0 . 10
00:10:04
по 20 включительно
00:10:06
какие проблемы могут быть при вызове
00:10:08
функции вот первое вот такая проблема я
00:10:12
возьму и например сделаю там b равно кат
00:10:18
стринги и дам сюда какое-нибудь число 10
00:10:29
возникнет естественно если нет
00:10:31
компилятора в питоне нет компиляции и
00:10:34
нет строгой проверке типов даже когда мы
00:10:37
создаем функцию мы не пишем какова же
00:10:39
типа эта переменная смуту понаписали со
00:10:42
все и пользуясь этой функции динамическая
00:10:45
типизация функция будет интерпретирован
00:10:48
а вот как вызовешь система не будет если
00:10:50
возможно вот это интерпретировать в
00:10:52
числом пожалуйста но это невозможно
00:10:54
взять средств у числа естественно нельзя
00:10:57
это можно только тому
00:10:58
списков у строк до а вот ну и
00:11:02
соответственно я вот здесь вот при
00:11:06
вызове получаю вот тут вот исключение
00:11:11
ошибку то есть программа прерывается
00:11:13
вываливается этот самый trace the call
00:11:17
stack весь вываливается весь trace этой
00:11:20
ошибки отсюда отсюда вот в таким-то
00:11:23
значением произошло там этот самый
00:11:26
невозможно для интерьера сделать вот
00:11:31
компилятор от вот этих ошибок
00:11:32
спасает компилятор еще раз я имею ввиду
00:11:36
строгая проверка типов я имею ввиду
00:11:39
строго проверка типов потому что в
00:11:41
принципе легко себе представить
00:11:44
интерпретируемый язык но у него должна
00:11:48
то есть для строго проверки типов перед
00:11:50
тем как начинать интерпретировать он
00:11:52
должен как-то прогнать и просмотреть все
00:11:54
на это будет что очень похожий на
00:11:55
компиляцию в любом случае строгая
00:11:58
проверка типа должна быть произведена в
00:11:59
этом случае и второй момент значит это
00:12:04
при компиляции она автоматически должна
00:12:07
произвести хотя наверное можно
00:12:09
предположить такой язык на самом деле
00:12:14
тут же си плюс плюс там с шаблонами в
00:12:17
каком-то смысле где типы будут
00:12:20
подставляться но он тем не менее будет
00:12:22
осуществлять проверку install я помолчу
00:12:26
дистанцирование шаблона функцией
00:12:28
забейте короче смысл в том что все равно
00:12:31
там си плюс плюс он обязан это сделать
00:12:33
начнут и нил низком пили
00:12:35
в бинарный код который потом будет он
00:12:38
просто не сможет понять все это должна
00:12:40
делать с вот этим вот понятно невозможно
00:12:42
интерпретировать операцию однако однако
00:12:45
компилятор не является панацеей то есть
00:12:50
вот это вот это понятно да то есть не
00:12:52
тот тип это ловится компилятором однако
00:13:00
пожалуйста я беру и ну давайте я сейчас
00:13:06
простите я сразу напишу это дело на си
00:13:08
плюс плюс не вдаваясь не рассказывай
00:13:14
синтаксис существенно да но мне нужно
00:13:16
сделать что функцию которая возвращает
00:13:19
строку с т.д.
00:13:21
string естественно мне нужно за included
00:13:23
строки я не буду этого делать это
00:13:25
называется там функция к string должна
00:13:28
быть соответственно у нас тип std string
00:13:34
единственно что ребят я честно не помню
00:13:36
как все плюс плюс делаются срезы в
00:13:38
современном си плюс плюс кажется для
00:13:40
этого есть механизм поэтому простите мне
00:13:43
пожалуйста вот что я может не простите я
00:13:47
сейчас напишу тогда по-другому это дело
00:13:49
я сгенерирую объект сейчас я запускаю
00:13:53
тела функции пишу в теле функции я
00:13:55
создам новую строчку с td 2 : стринги
00:14:00
это будет у меня резал
00:14:03
чем не стоит прописать
00:14:07
описали замечательно и дальше я бегу а
00:14:12
запускаю там цикл for например да
00:14:17
начиная от 10 по 20 включительно
00:14:25
ну вот и я буду например к это некрасиво
00:14:29
несут про классно тем не менее резал а
00:14:33
плюс равно
00:14:37
плюс равно этот самый string я там
00:14:39
называю с допустим на плюс равно с этой
00:14:43
а я по буковке туда заклеиваю в конец
00:14:46
какой строке тун дун дун дун все заклеил
00:14:48
да замечательно и
00:14:51
реке он резал и вернуть результат
00:14:57
прекрасно хорошо написала я допустим
00:15:02
функцию которая возвращает по сути тоже
00:15:04
самое и говорю я переписал на си плюс
00:15:08
плюс теперь у меня есть компиляция при
00:15:10
есть строгая проверка типов теперь у
00:15:12
меня ну все плюс плюс нельзя писать код
00:15:14
без без функции там подпись обязательно
00:15:17
по функциям раскладывать главная функция
00:15:18
называется main ну вот я сделаю функцию
00:15:21
мы сейчас не вникайте в сильно в
00:15:23
синтаксис но смысл в том что я допустим
00:15:25
некоторой переменной и там oughta be у
00:15:30
нее типа строка будет равно
00:15:33
соответственно этот самый как стринги и
00:15:38
я ей сую кто знает хоть чуть-чуть о
00:15:44
тогда разговаривал с той аудитории в
00:15:46
целом это короче и там чего нибудь там
00:15:49
hello-
00:15:51
fellow я ставлю двойные кавычки да как
00:15:55
для сип holo world
00:16:02
вот с проблем hero компилятор не выдает
00:16:08
ошибки до компилятор может это проверить
00:16:14
вообще нет дело в том что вот эта строка
00:16:17
она попадает ну здесь я ее в конце
00:16:21
констант на залил но на самом деле она
00:16:23
может прийти с потока ввода например да
00:16:25
еще откуда-то из конфигурационного файла
00:16:28
она может прийти откуда угодно и
00:16:32
получается что параметр функции может не
00:16:36
соответствовать необходимым вещам просто
00:16:39
потому что
00:16:41
предполагается некоторый определенный
00:16:43
диапазон допустимых значений и эта
00:16:47
функция она в принципе не должна
00:16:48
работать в этой ситуации понимаете вот
00:16:53
как взять факториалов отрицательного
00:16:54
числа ну функция factorial а если мы
00:16:58
берем обычный вариант факториала да не
00:16:59
супер там из математики ногам на функцию
00:17:02
как если мы берем обычный факториал он
00:17:04
определит строго в целых неотрицательных
00:17:06
числах начинают 0 и дальше для
00:17:09
отрицательно должно возникать
00:17:11
исключение для дробных и тем более для
00:17:14
любого другого типа должно возникать
00:17:15
исключение но даже если это целое все
00:17:18
равно нам нужно жестко как сказать
00:17:22
отследить вот эти вот диапазона значений
00:17:24
понятна логика до допустимых значений
00:17:27
можно даже сказать так что здесь не
00:17:30
выполнен контракт то есть типы совпадают
00:17:34
но не выполнены так называемые
00:17:41
предусловия не выполнены предусловия то
00:17:49
есть для того чтобы эта функция
00:17:51
сработала корректно мы должны ей некий
00:17:55
предусловие соблюсти
00:17:57
и по типу и по допустимому диапазону
00:18:01
значений но но кроме этого есть еще
00:18:06
такая штука
00:18:08
проработки вот этих интерфейса потому
00:18:10
что еще раз кроме компиляции
00:18:12
нам нужно еще к лишь
00:18:14
и вот оказывается что еще кое-что да ну
00:18:18
вот во первых раз давайте старая мозоль
00:18:20
на 2 мозоли наступим а кто сказал что у
00:18:23
нас вот здесь вот все ок будет
00:18:27
но мы мало ли я сунул фукса какую-нибудь
00:18:31
фигню она мне какой-нибудь угли
00:18:33
выплюнула понимаете то есть она вроде бы
00:18:36
ошибки не сгенерировала да ну а нам не
00:18:39
взялась сунул а ну-ка глухость человеку
00:18:42
как называется но это часто встречается
00:18:44
имя человеческих отношениях
00:18:46
недобросовестном выполненная работа на я
00:18:49
вам пытаются впихнуть халтуру и кроме
00:18:52
того я например ожидаю что здесь будет
00:18:55
строка там да там не строка
00:18:58
а там число понимаете то есть вопрос вот
00:19:03
в чем да а здесь нам не может быть нет у
00:19:06
меня сейчас вроде бы там я шляпе и они
00:19:08
не объяснял что функция должна делать
00:19:11
нет документ строки
00:19:13
нет никакой документации нет заранее
00:19:15
требований к ней в этом смысле как
00:19:17
учебный пример
00:19:18
у этой функции нет обязательств но тем
00:19:21
ни менее да уж если я там че-то
00:19:23
предполагаю то понятное дело что есть
00:19:26
некоторый во-первых тип результата то
00:19:30
есть я ожидаю что здесь должен совпасть
00:19:32
тип правда ожидаемый тип соответственно
00:19:39
в данном случае он сейчас совпадет а
00:19:41
второе должно совпасть
00:19:44
а как называемая сейчас ой голова варит
00:19:51
забыл предусловие
00:19:52
и пост условия кажется так все просто
00:19:56
или нет сейчас секундочку я
00:20:02
предусловия просто условия да все норм
00:20:06
да и просто после условия я сейчас про
00:20:08
это дело еще скажу да короче должны быть
00:20:10
выполнены некий пост условия в частности
00:20:16
я-то предполагаю что получающийся строке
00:20:20
должно быть 10 символов
00:20:23
судя по крайне мере по вот этому на
00:20:24
правда сейчас получается из самого
00:20:27
текста функции делаю заключение о том
00:20:29
что она делает это не совсем правильно
00:20:31
должно быть требование функции должно
00:20:33
спускаться как-то по-другому в
00:20:34
документации описано где-то еще между
00:20:37
людьми обсуждено в названии заложена
00:20:40
требования к этой функции и
00:20:41
обязательства но когда возникает между
00:20:46
людьми вот эти терке в чем проблема
00:20:50
а ведь они часто возникают что
00:20:54
государство
00:20:55
акаги приходит жаловаться государства
00:20:57
они приходят в суд до 2 называется
00:21:01
арбитражный суд предприниматели друг с
00:21:04
другом там это должен был поставить этот
00:21:06
ему должен был заплатить и у них
00:21:08
возникают какие-то тёрки
00:21:11
что государство делает для собственной
00:21:15
безопасности
00:21:16
а не нет закон ссылаться это понят нет я
00:21:25
про другое для упрощения работы суда
00:21:31
очень простая вещь ребята договор в
00:21:35
письменной форме для юридических лиц
00:21:39
договоров в письменной форме обязательно
00:21:42
для физических лиц вы все являетесь
00:21:44
физическим и любой гражданин является
00:21:46
физическим лицом а он платит налоги
00:21:48
он имеет право заключать простые
00:21:50
договора там купли-продажи магазине в
00:21:52
принципе это в каком-то смысле договор
00:21:55
купли-продажи устный есть такое понятие
00:21:57
устный договор но начиная с некоторой
00:21:59
суммы я к сожалению не
00:22:02
юристы не помню этой суммы то ли там 50
00:22:06
или 100 тысяч но государство она не
00:22:09
будет принимать в суде вашу жалобу
00:22:12
мы тут договорились я ему плачу за
00:22:14
200000 а он мне за это там машину да
00:22:18
кстати по поводу автомобилей там всегда
00:22:21
договор простой договор можно без
00:22:22
нотариусов но договор в письменной форме
00:22:25
контракт на языке в программировании
00:22:28
прямо вот это слово контракт так и
00:22:31
называется так вот два решения проблем
00:22:34
да у нас вот я не сформулировал проблемы
00:22:36
к сожалению проблема по сути
00:22:38
интеграции проблема декомпозиции мы
00:22:42
решаем за счет модульного опыт и
00:22:44
структурного в конечном счете
00:22:46
программирования а сейчас у нас проблема
00:22:49
соответственно обратной композиции до
00:22:51
проблема композиции программы до из тех
00:22:56
декомпозировать
00:22:57
кусочков которые у нас получились да ну
00:22:59
или интеграции и интеграцию она у нас не
00:23:06
собирается или скажем так в собранном
00:23:08
состоянии нашу робот должен был идти а
00:23:11
он заваливается и падает вот и вот
00:23:14
собственно первое первое решение на это
00:23:17
использовать компилируемый язык со
00:23:19
статической тип проверкой note 7 со
00:23:22
статической неважно со строгой проверкой
00:23:24
типов второй вариант второй вариант да и
00:23:30
второе как сказать более удачный это
00:23:34
использование контрактов использование
00:23:37
контрактов
00:23:44
и если в ситуации с людьми
00:23:52
контракт реально не проверяется
00:23:56
фактической жизнью он не проверяется на
00:23:59
соответствие тому что произошло только
00:24:02
люди если вот возникают как ты серьезно
00:24:04
разногласия тогда люди идут суд начинают
00:24:06
выяснять что да как но в
00:24:10
программировании вот эти вот контракты
00:24:14
можно проверять при каждом вызове
00:24:18
функции при каждой любой работе с
00:24:22
объектом классом с модулем и
00:24:25
обязательства класса обязательства
00:24:29
функции и перед функцией тоже мы можем
00:24:32
заложить в три вида контрактов три вида
00:24:37
контрактов и так это во-первых
00:24:41
предусловия про которые уже сказал да то
00:24:46
есть на тип и на какие то эти
00:24:48
они на самом деле часто достаточно
00:24:50
критичны они критичнее всего можно
00:24:52
сказать пост хотя не факт просто условия
00:24:56
тоже важны кстати это соблюдение
00:24:59
предусловия пост условия не гарантирую
00:25:01
что это именно то что вам выдали то есть
00:25:03
вы
00:25:05
функция покупки квартиры условно и вы ей
00:25:08
даете деньги она должна вам вернуть
00:25:11
жилище но эта квартира может оказаться
00:25:14
не той по контрактам да она в принципе
00:25:17
подходит или функция которая должна
00:25:20
рассчитать вам next да и дейт например
00:25:23
да ну вы там передаете и дату
00:25:25
она должна вернуть вам следующую дату с
00:25:27
учетом всех месяцов високосных годов
00:25:29
всего прочего да а вот и она возвращает
00:25:34
он вроде бы дату то есть формат того что
00:25:36
вы ожидаете дата да но короче
00:25:43
предусловия и пост условия позволяют
00:25:48
многие вещи проконтролировать том числе
00:25:50
с диапазоном допустимых значений но есть
00:25:52
ещё одна такая штука она характерна для
00:25:55
объектов когда вы создаете объекта он в
00:25:59
отличии от функции существует
00:26:00
продолжительное время функцию вы вызвали
00:26:03
она отработала завершилось все все
00:26:07
переменные на которые ссылки не сохранены где-то
00:26:09
вам не исчезли а вот объект он
00:26:13
существует продолжительное время и у
00:26:17
объекта может быть не consistent на и
00:26:21
состояние может быть реальный in
00:26:24
consistent ну то есть например к объект
00:26:27
который хранит отдельно в отдельных
00:26:29
атрибутах год месяц
00:26:32
день возможен такой объект
00:26:36
возможен да правда класс прописываем в
00:26:39
нем прописан 3 филда в инет они
00:26:41
заполняются можно сказать там xd и
00:26:45
привёз да и он должен щелкать туда-сюда
00:26:47
чинджер ну там setter на прямо писать
00:26:50
метод центр который год менять год сет
00:26:53
день и мы будем проверять вообще
00:26:55
правильный ли день человек задает да но
00:26:57
тогда таким в такой класс можно привести
00:27:00
в состояние там 31 февраля или 29
00:27:03
февраля но не дни високосного года
00:27:05
короче нам очень важно чтобы вот
00:27:08
некоторая вещь на что это в принципе
00:27:11
является логичным днем она должна
00:27:15
проверяться при каждом вызове каждого
00:27:17
метода понимаете да прям всегда и вот
00:27:21
для объекта удобного такие вот всегда
00:27:23
сформулировать как инвариант и
00:27:26
и вот все контракты делятся на вот эти
00:27:29
типы три типа инварианты
00:27:32
автор этой идеи программирование по
00:27:35
контракту но иногда говорят
00:27:37
проектирование по контракту потому что
00:27:39
это относится к проектирование в том
00:27:40
числе бертран мэр русскоговорящий
00:27:44
француз он приезжал их из тех мне
00:27:47
довелось его в лекции увидеть лично он
00:27:49
периодически в россии бывает
00:27:50
тут где-то в каких-то университетах
00:27:53
периодически там всяким приглашенным
00:27:55
профессором вот там с какого-то годом в аннаполисе
00:27:58
вроде как но это не значит что он тут
00:28:00
непрерывно хоть в россии вот он преемник
00:28:06
поскольку он сделал язык никлаус вирт
00:28:11
вот он брат runner преемник никлауса
00:28:15
вертов цюрихском университете и вот
00:28:19
собственно про сейчас мы не будем
00:28:21
трогать его биографию хотел показать
00:28:23
этого человека и на этом собственно
00:28:25
подробнее дальше рассказывать уже по
00:28:27
существу значит по поводу контракта так
00:28:33
сейчас секундочку вот сейчас пока
00:28:36
википедию глобально до дизайн байк
00:28:38
контракт на гбц метод проектирования по
00:28:44
которое предполагает что проектировщик
00:28:47
ну то есть в конечном счете конечно
00:28:49
такой сваливание ответственность
00:28:51
программистов до программисты будут
00:28:53
после этого его реально тупо кодерами но
00:28:55
это и хорошо в конечном смысле да потому
00:28:57
что компетентный человек он будет
00:28:59
прорабатывать детали вот этих вещей они
00:29:02
будут дела пробовать соответственно
00:29:06
предполагает что проектировщик
00:29:08
архитектор по должен определить
00:29:10
формальные
00:29:11
точные и верифицируем и и спецификации
00:29:15
интерфейсов для компонентов системы
00:29:18
понятно соответственно вот эти вот
00:29:22
предусловия пост условиям варианты да
00:29:24
они должны проверяться и вот эти
00:29:26
спецификации называются контрактами вот
00:29:33
ну и там она бывает поддержка бывает
00:29:36
разная в разных этой в разных языках
00:29:38
есть вот в многих языках это
00:29:44
поддерживается на языковом уровне но я
00:29:47
вам скажу во-первых си плюс плюс тут нет
00:29:49
для си плюс плюс
00:29:51
нету но есть какие то варианты уже не
00:29:55
совсем языковые до поддержка с помощью
00:29:57
сторонних библиотек и питона кстати тут
00:29:59
нету зато здесь есть очень интересный
00:30:01
язык и филь он не привычен несколько да
00:30:05
это как раз язык бертрана мэр это
00:30:08
первый язык вот этого человека первый
00:30:11
язык с контрактным программированием
00:30:14
если не ошибаюсь вот соответственно ну я
00:30:18
не могу он прям рекомендовать его вот но
00:30:22
тем не менее видите реализации
00:30:24
генерирует код си то есть они такие
00:30:26
такой транслятор для последующей
00:30:30
компиляции вот так ладно короче это тоже
00:30:36
мы сейчас мы сейчас выйдем из википедии
00:30:38
дальше поговорим про это про сейчас
00:30:42
секундочку это нет давайте это в
00:30:46
статейка про дизайн в контракт на
00:30:51
собственно эйфеля но я бы не хотел это
00:30:56
дело не касается еще раз говорю
00:30:58
конкретно ехали поэтому давайте еще раз
00:30:59
посмотрим на на самой основы
00:31:02
проектирования по контракту и так
00:31:09
давайте предположим что у нас клиенты
00:31:11
поставщик осуществляют до предоставление
00:31:15
тире пользования телефонными услугами
00:31:17
соответственно каждый из них имеет
00:31:20
обязательства но и получать выгоды
00:31:23
клиент такое предусловие у него какие
00:31:28
обязательства до оплата счета
00:31:30
клиент обязан оплачивать счет пост
00:31:33
условия на тучу какую выгоду он получает
00:31:36
получение телефонных услуг об от
00:31:38
поставщика соответствующего качества
00:31:40
добавим я вызываю функцию и обязаны ей
00:31:44
не что предоставит а в итоге получаю то
00:31:46
что я предполагаю поставщик какие ему
00:31:52
как сказать обязательство от него
00:31:54
предоставление телефонных услуг все он
00:31:57
обязан их предоставить соответственно
00:32:03
соответствующими дата он они должны
00:32:05
соответствовать параметрам нет
00:32:07
диапазоном типом и так далее и выгода
00:32:11
какая нет необходимости в предоставлении
00:32:14
чего-либо при неоплате счета но имеется
00:32:19
виду что не заплатили мы не
00:32:21
будем вам поставлять электричество
00:32:22
гастами водопровод вот но смысл в том
00:32:26
что какая выгода что он а уж если он
00:32:30
предоставляет что-то то он обязательно
00:32:32
получает вы как функция она всегда будет
00:32:35
получать разумные параметры понимаете
00:32:39
если контракт проверяется неким
00:32:41
автоматизированным способом его
00:32:43
зафиксировали записали он всегда
00:32:45
проверяется при вызове функции то нет
00:32:47
необходимости тупо проверять сам
00:32:49
контракт мы можем проверять уже ну
00:32:50
что-то по существу то малу может уже и
00:32:52
не проверять даже начинает работать
00:32:54
сразу понимаете нас просто сразу
00:32:57
выполнен контрактов если это получается
00:32:59
как выгоды вот ну и соответственно
00:33:02
обязательства отражаются на выгоде
00:33:04
другой это общее правило соответственно
00:33:08
обязательства клиента которая защищает
00:33:10
поставщика это предусловия клиент выгода
00:33:14
клиента описывающая что поставщик должен
00:33:16
был выполнить
00:33:17
называется пост условиям ну и
00:33:20
соответственно наоборот да ровно
00:33:22
наоборот а и вариант класса да это применимо к
00:33:25
классу в целом но сейчас пока не будем
00:33:28
трогать ну дальше все это дело уже в деталях под
00:33:31
и фильм вопрос чего это вам рассказываю
00:33:34
если этого нет не все плюс плюс не в
00:33:35
питоне
00:33:36
во-первых потому что это круто вот во
00:33:39
вторых но сейчас это секундочку на хабре
00:33:41
статейка тоже про это дело значит как и
00:33:45
в реальной жизни при нарушении одного из
00:33:47
пунктов контракта наступает что заранее
00:33:51
обговорено и согласованно мера если вы
00:33:55
когда-нибудь читали подробно договора
00:33:58
хоть с фото и телеком хоть с общежитием
00:34:03
хотя не знаю договор с поселения
00:34:06
общежития держит таки пункт или нет но
00:34:07
там обычно всегда ответственность сторон
00:34:09
да и там еще написано стороны
00:34:12
соглашаются решать там рабочие в порядке
00:34:15
в решать вопросы в рабочем порядке да
00:34:21
притом в судебном случае рассматривается
00:34:23
в этом суде российской федерации по
00:34:25
месту жительства условно ну не знаю
00:34:28
короче какие-то там договоренность как
00:34:30
предполагается разрешать в мировом суде
00:34:33
в арбитраж
00:34:34
там суде то есть какие-то вот но
00:34:35
представьте себе когда какая быть фирма
00:34:39
заключает договора у нее регулярно
00:34:41
случаются такие особые случаи особой
00:34:43
ситуации из теста что эти о пище должно
00:34:45
быть прописаны понятны они иногда
00:34:47
случаются
00:34:48
они ханны привычным образом достаточно
00:34:51
решает понятно короче в любом случае до
00:34:56
в мире разработки байтов означает
00:34:59
возбуждение исключения или завершение
00:35:02
работы программы ну типичная ситуация
00:35:06
исключение папа по факту того что
00:35:09
контракт нарушено эти исключения
00:35:11
теоретически можно ловить
00:35:12
хотя я еще не рассказывал про исключение
00:35:15
буду рассказывать но вот именно вот эти
00:35:22
исключения по нарушению контракт на
00:35:24
самом деле лучше не ловить лучше видеть
00:35:26
падение программа отслеживать почему на
00:35:29
произошло искать нарушителя и исправлять
00:35:31
это место программ это нарушение
00:35:33
контракта выявляет ошибку она всплывает
00:35:35
на поверхность вот но там кот на сишарпе
00:35:39
мы не будем это делать смотреть дальше
00:35:41
мы посмотрим этот самый первый вариант
00:35:45
от тимофею федоровича
00:35:47
как организовать кантер проверку
00:35:50
контрактов самостоятельно как собственно
00:35:56
проверить самостоятельно это инструкция
00:36:01
и сорт и сирот и такое утверждаю что я
00:36:06
верю что я могу вполне вставить и сорт
00:36:10
если я в чем-то абсолютно уверен вот
00:36:12
прям абсолютно уверен что это вот так
00:36:14
понятно тогда пожалуйста но оказывается
00:36:20
что очень часто это ты черт нарушается
00:36:22
кстати и сердце не очень хорошо ставить
00:36:24
на ввод-вывод с клавиатуры то
00:36:26
неправильно новому пользователь имеет
00:36:28
право писать переверну за ваша задача
00:36:31
корректно обработать поговорить искать
00:36:32
не пишем буквы пиши мне число если вы
00:36:36
делаете дурака устойчиво программы
00:36:38
а вот кликай нет и клюка и сюды значит
00:36:43
есть две формы 1 очень просто it is
00:36:45
просто пишем эссе рад кондишен ну то
00:36:47
есть у слова
00:36:48
на я сейчас совсем тупую ситуацию
00:36:50
рассматривать так мы здесь до нас я
00:36:53
сделаю какой-нибудь
00:36:54
файлика там символ . пай и я тут напишу
00:37:01
какой-нибудь x равно and input
00:37:04
может а а да вот сдвинуть это особенно
00:37:10
можно чаще .
00:37:14
так норм кажется что теперь вы знаете
00:37:23
что это возможно
00:37:32
кто-то и гасит
00:37:35
может сам проекта рогозин не надо полить
00:37:38
мне лампу нормально уже да короче
00:37:46
примитивная некая ситуация я буду резать
00:37:49
сейчас число на цифры и выплевывать эти
00:37:51
цифры на экран условно do-while
00:37:54
x больше нуля я буду что делать digit
00:38:00
равно x по модулю 10 принц digit я тупо
00:38:05
буду делать до x равно x разделить на 10
00:38:09
и отбрасыванием остатка и печатать
00:38:13
принтер и завершения программа
00:38:18
вот но а если здесь вместо контрактом
00:38:25
функции нет задача не разрезано на куски
00:38:28
да здесь контрактом вроде бы места нет
00:38:31
нет поставщика и получателя услуги
00:38:34
когда возникает функция там это
00:38:36
возникает здесь нету и тем не менее я
00:38:39
здесь могу использовать самый простой в
00:38:43
этот способ проверки условия то есть я и
00:38:45
вот здесь в этот момент программа вот
00:38:47
где сейчас у меня находится курсор
00:38:49
да я искренне верю что вот тут вот
00:38:53
x у меня что у меньше либо равен 0
00:38:58
правильно правда но вообще наверное я
00:39:04
могу сейчас предполагаю что x равен нулю да я делаю
00:39:08
я верю говорю что я верю что x равен
00:39:12
нулю
00:39:15
вопрос насколько
00:39:17
вот то что я написал да она как-то
00:39:19
влияет на программу первое никак
00:39:23
утверждения не влияют на работу
00:39:25
программы оно похоже на комментарий то есть я в
00:39:28
принципе мог бы просто по-русски
00:39:30
написать вот здесь вот вот здесь вот
00:39:32
комментарий до утверждаю
00:39:36
я утверждаю что
00:39:41
понимаете но когда это голословное
00:39:43
комментарий на и утверждение дата тогда
00:39:46
возникает проблема никогда не
00:39:50
проверяется моя вера никогда не
00:39:52
проверяется чтобы ее актуализировать да
00:39:54
я что делаю чуть-чуть поменьше все-таки
00:39:57
сделаю значит что я сделаю я возьму
00:40:01
сейчас и вот это пропишись орт и теперь
00:40:04
я могу запускать интересно кстати
00:40:05
какой-то питон у меня еду переставил
00:40:07
немножко да все нормально просто можно
00:40:12
пописать
00:40:13
короче чего хочу я хочу этот открыть так
00:40:22
а ну ка
00:40:23
соображай simple он называл simple он
00:40:26
назывался и отдают число пожалуйста
00:40:29
разрезал него на цифры написал
00:40:31
завершения программа запустим еще раз
00:40:36
запустим еще раз и введём число ноль
00:40:40
завершении программы в принципе контракт
00:40:42
отработал введём еще раз и вижу -10
00:40:46
тогда про избе кассирш inner оказывается
00:40:50
что я здесь не предположил не проверил
00:40:53
что моя дальнейшая часть программы
00:40:54
предполагает что число у меня не
00:40:57
отрицательными
00:40:58
понятно то есть если я предполагаю что
00:41:00
что-то должно было бы написать
00:41:02
запоминать цифры вашего числа то но я в
00:41:05
должен предполагать что для 0 он
00:41:07
печатает 0 странно если для 0 он не
00:41:11
печатает ничего кстати вот а самое
00:41:13
главное что он модной цапель и и вот я
00:41:15
это делал должен теперь
00:41:18
отслеживать сейчас я срублю на а уже все
00:41:25
так ладно а это вот простой вариант то
00:41:32
более чуть-чуть сложный вариант можно
00:41:35
программно эквивалентом да да кстати еще
00:41:38
один момент проверка этих условий
00:41:43
происходит только в процессе отладки
00:41:44
программы то действительно это немножко
00:41:47
замедляет работу программы
00:41:49
однако не влияет на поведение кроме
00:41:52
прерывания работы в случае там
00:41:54
несоблюдение этого условия в которой
00:41:56
верю но тем не менее в релизной версии
00:42:01
на я могу поставить что это мне релиз
00:42:04
питону сказать это релиз и он у меня не
00:42:07
будет просто
00:42:08
в этих проверок услуги делать вообще 2
00:42:14
второй вариант когда я пишу некий
00:42:16
конкретно мэсседж
00:42:17
давайте сделаем чем пишу сейчас
00:42:20
simple пай я здесь весь просто ставлю
00:42:23
запятую в кавычках пишу на что у меня
00:42:28
пользователь довел отрицательное число
00:42:32
негодяй
00:42:39
понятно но это неправильно что у меня и
00:42:43
сирт срабатывает на ввод пользователя то
00:42:46
есть она может и она в конечном счете
00:42:48
из-за поведения пользователя возникнут
00:42:50
те ситуации но я по-хорошему должен был
00:42:53
вот здесь вот корректным образом это
00:42:56
дело обрабатывать час я это дело
00:42:57
обработаю покажу как можно более дурака
00:43:00
устойчивый вот сделать здесь тогда ну и
00:43:03
соответственно потом я запускаю его на я
00:43:06
ввожу чё то там и я теперь вижу в своем
00:43:09
trace бэкки я вижу собственно
00:43:12
сообщение пользователю отрицательное
00:43:14
число в это сообщение в принципе можно
00:43:16
включать там распечатку каких-нибудь
00:43:19
полей класса или что-то еще ну что я
00:43:21
посчитаю нужным прям вот в этот момент
00:43:23
вывалить на экран и это все в 3 избег
00:43:25
попадет как некие logo моей ошибки мне
00:43:28
будет легче разобраться что же там
00:43:29
произошло вот значит так чё хотел
00:43:35
сделать еще я хотел показать
00:43:41
а как это происходить должно да ну еще
00:43:44
раз вот в данной ситуации в данной
00:43:46
ситуации скорее правильно было бы может
00:43:49
быть на самом деле кстати правильно
00:43:50
предполагаю что x равен нулю да но вот
00:43:53
здесь вот после ввода пользователя по
00:43:55
хорошему да мне нужно проверить
00:43:57
а пользователи собственно но как
00:43:59
разумный ли у меня что-то ввёл этом
00:44:01
число ним число а может быть даже до
00:44:02
того как он вел мне
00:44:04
in da что она перед тем как я это делаем
00:44:07
ту вы понимаете да то есть вопрос можно
00:44:09
ли это дело от in the вать даже возможно
00:44:12
вылью эра
00:44:13
а может быть у меня там отрицательное
00:44:15
число давайте сейчас пока предполагать
00:44:19
что это целое число может только
00:44:20
отрицательный отследит тогда что я делаю
00:44:22
мне нужно считывать число до тех пор
00:44:26
пока что я напишу я пишу пока x у меня
00:44:30
меньше нуля пока x меньше 0
00:44:35
что я буду делать я буду печатать самое
00:44:44
print вывели отрицательное число введите
00:44:55
число а сама
00:44:59
ну неважно даже да я могу написать я
00:45:03
здесь напишу вывода вот есть вот вы тут
00:45:05
я напишу введите x больше нуля либо
00:45:11
равно часть япончику
00:45:27
так ща ща ща ща ща ща сейчас секундочку
00:45:30
введите их больше либо равно 0 до и
00:45:33
соответственно написав вот это дело я
00:45:35
сейчас что дело говорю особенно еще раз
00:45:40
считывание и у меня получается такое
00:45:43
бесконечное считывание
00:45:44
в котором я заставляю пользователя в
00:45:49
конечном счете сейчас строку скопирую
00:45:52
что такое а мне русские запилим включен
00:45:54
а вот заставляю пользователя за судне
00:46:01
именно я ввожу
00:46:05
работает ввожу какой-нибудь
00:46:09
отрицательное число он имеет вывели
00:46:11
отрицательное число видите их я мы еще
00:46:14
раз засуну чего-нибудь да ему 0 засунула
00:46:17
для 0 он продал ученый не вывел для 0
00:46:22
но тем ни менее ладно что я хотел
00:46:26
сказать что есть необходим
00:46:29
пользовательский ввод надо ловить по
00:46:31
другому ну а iheart собственного он
00:46:34
определять же уже не корректность работы
00:46:35
программы чтобы на программа не до
00:46:38
отследила пользователя где-то или что-то
00:46:41
не так про бросила несоблюдение каких-то
00:46:43
вещей на внутренних вод ну софт тут есть
00:46:47
вариант вот функции фибоначчи до для
00:46:50
изолированные функции функция фибоначчи
00:46:53
и вот есть некая проверка да вот там
00:46:55
тогда предполагается но здесь вычисления
00:46:58
чисел фибоначчи идет простым циклом for
00:47:00
на для пример для изолированной функции
00:47:04
вот я не буду сейчас пробивать это дело
00:47:06
ну понятно дело как такое происходить до
00:47:09
но здесь я что делаю обратите внимание
00:47:12
что здесь я при помощи iheart реализую
00:47:17
предусловия проверку предусловий и пост
00:47:20
условий в качестве пост условия обратите
00:47:22
внимание я заложил не тип кстати по
00:47:25
хорошему там где отделал вот это сорт
00:47:27
наверное надо было идти прописать да че
00:47:32
то еще прописать кроме вот n больше
00:47:34
ну в первую очередь тем что n целое
00:47:36
число тоже а как ему вообще сравнивать у
00:47:38
меня в процессе проверки самого и
00:47:40
сердцам и вылететь исключение что невозможно
00:47:43
сравнивать 0 и строку
00:47:45
но нельзя числа со строками сравниваем
00:47:47
то что такое у меня шить урок идет
00:48:00
так
00:48:03
все подождут вы нет слушайте дальше
00:48:06
значит пример для конструктора класса
00:48:10
здесь вот класс do it tight ну
00:48:14
предположим да щас у него ничего не
00:48:16
прописано ну предположим что в этом
00:48:18
классе да и the type to do it
00:48:20
type соответственно предполагается
00:48:24
проверка контракта ну это такая кривая
00:48:28
проверкой инварианта потому что он
00:48:32
проверяется однократно если я вот так
00:48:34
буду проверять инвариант то мне придется
00:48:36
вставлять его везде вот везде
00:48:41
при старте с каждого метода класса
00:48:43
прописывать и при финише каждого метода
00:48:47
класса меня придется прописывать
00:48:48
проверку его там серферс elfman
00:48:51
причем кстати на самом деле здесь я
00:48:52
проверяю входные параметры на самом-то
00:48:55
деле а уж если делать это инвариантом тогда
00:48:58
на проверять именно то что оказалась в
00:49:00
этих параметрах серфер mazda
00:49:02
по итогам работы конструктора или любого
00:49:05
метода этого класса короче не не очень
00:49:08
удобно бывает для контрактора
00:49:10
программирования пользоваться этим самые
00:49:13
сердцами их можно отключить
00:49:16
соответственно в некоторых случаях
00:49:18
вычисления у слой может быть долгим
00:49:20
проверка того что массив действительно
00:49:22
сартр он может занимать вполне сравнимо
00:49:25
и время самой сортировкой хотя и меньше
00:49:26
вот поэтому оферты могут быть стерты
00:49:29
могут быть отключены
00:49:31
тогда они эквивалентны оператору ps вот
00:49:35
но для этого всего лишь требуется
00:49:37
написать минус у и приехали сейчас я
00:49:40
поскольку я сделал проверку ввода то в
00:49:42
этой версии программы я не увижу до
00:49:45
этого и сорта мне сложно сейчас
00:49:47
придумать что мне ему ввести но я сейчас
00:49:50
не ну нельзя шноль да у либо отключить
00:49:55
проверку сейчас сложно придумать я вот
00:50:03
взял проверку пересорт не сделала еще
00:50:08
раз плотный что получится он бы все
00:50:14
равно будет пытаться in the vote waste
00:50:16
ink делаю я он скажет им невозможно
00:50:19
сделать int ой прошу прощения запустить
00:50:22
начали вода и скажет вам не вылью эра
00:50:26
невозможно превратить его в int с
00:50:28
основанием 10
00:50:29
десятичной системы счисления так что нет
00:50:32
ладно давайте двигаться дальше нам нужно
00:50:35
быстренько двигаться
00:50:36
адекватно использование утверждений
00:50:38
тра-та-та серфер он никогда не следует
00:50:41
перехватывать они не должны быть
00:50:43
использованы для отображения сообщений
00:50:45
пользователю их потребитель программист
00:50:49
0 тестировщик вот от работа обработка
00:50:53
регулярно возникающий нормальной
00:50:56
исключительной ситуации такая условная
00:50:58
норма когда исключить бывает когда
00:51:00
исключение является некоторым способам
00:51:01
передачи информации это не совсем хорошо
00:51:03
но тем не менее условно нормальные
00:51:06
исключение нужно обрабатывать
00:51:07
соответствующим образом вот как например
00:51:09
здесь попытка от in the вать она вывела
00:51:12
мне исключение вылью error а по хорошему
00:51:14
вылью r должно было быть нормальным
00:51:16
образом рот искать не вводи мне строку в
00:51:18
воде числу ее слова запросить вот правда
00:51:22
то что мы вылетели нос мы вылетели не по
00:51:25
сердцу кстати мы вылетели просто по
00:51:26
факту того что невозможно сделать им с
00:51:28
этим input а вот ну короче есть некий
00:51:32
вот race winner exception да то есть
00:51:36
если есть некая там стандартная ситуация
00:51:38
там в котором нужно вызвать исключение
00:51:41
но ты берешь стандартную ошибку из
00:51:43
списка стандартах исключением
00:51:44
пробрасываем
00:51:45
сейчас я не буду углубляться в
00:51:47
исключении не то сегодня моя задача
00:51:49
значит короче для чего использует assert
00:51:53
для проверки собственно при conditions
00:51:55
пост conditions in вариант но в той
00:51:58
ситуации когда
00:51:59
вас по сути поставщика потребуйте услуги
00:52:01
не разделяют serif каких-то экзотических
00:52:03
ситуациях когда где-то в середине
00:52:06
функции вы хотите быть уверенными в
00:52:08
некоторые вещи чтобы продолжать дальше с
00:52:11
этой уверенностью то есть вы вроде бы в
00:52:13
это верить и но вы хотите чтобы на этапе
00:52:15
отладки здесь была гарантия
00:52:19
вот называется internal инвариант по
00:52:22
сути логическое выражение выражающая
00:52:25
уверенность программистов значений
00:52:26
некоторых переменных в некоторый момент
00:52:28
выполнения программы да то есть вот
00:52:31
здесь вот и черт является вроде бы
00:52:33
комментарием которая гарантирует
00:52:35
истинность утверждения да и в их делится
00:52:38
на 3 а иначе если не делится на три там
00:52:41
из-за по модулю 3 равно 1 идут у апа да
00:52:48
предполагаю что этого не должно быть ни
00:52:50
когда допустим но здесь специально
00:52:51
сделан чтобы это периодически случалось
00:52:53
инвариант цикла я как раз показал
00:52:56
ситуации именно с ним на вариант цикла
00:52:58
то есть нечто что после цикла кстати
00:53:00
если у нас выход из цикла по брейку тонн
00:53:02
вариант цикла может быть нарушен
00:53:04
а нет стоп стоп то что есть показал не
00:53:07
инвариант цикл упростить пожалуйста это
00:53:09
просто условие входа с отрицанием нет
00:53:13
вариант цикла то что выполняется и до и
00:53:15
во время и после и она зависит от
00:53:19
переменной итерации ли значение как
00:53:21
сейчас не будем опять же входить бывает
00:53:24
инвариант потока выполнения забудьте про
00:53:28
потоки пока
00:53:29
ну и дворян ты класса значит есть для
00:53:33
питона
00:53:34
много реализации контрактов контрактного
00:53:38
программирования я выбрал вот эту просто
00:53:41
потому что мне надо было какой-то
00:53:43
выбрать я с ней познакомился и и вам
00:53:46
представляю соответственно чтобы она
00:53:49
заработала нужно установить ее да это
00:53:51
нужно
00:53:52
сделать его инсталляция кстати она по
00:53:55
мнению стоит the piping стол пай
00:54:00
contracts
00:54:01
я надеюсь втащит ну и теперь мы сейчас
00:54:09
делаем файлик в котором секс с флинстоун
00:54:13
защиты мы попробуем сейчас сделать
00:54:16
что-нибудь достаточно простое вот пример
00:54:18
контракта с проверкой приду слоя функция
00:54:20
не делает ничего но она тем не менее
00:54:22
утверждает что контракта никакой x это
00:54:26
целое число
00:54:27
это предусловие да и это число будет
00:54:29
больше либо равно 0 давайте мы сделаем
00:54:31
так я скопирую сейчас свой simple sp
00:54:35
simple да на самый
00:54:39
а-20 к нам и мы тут сейчас я уберу
00:54:50
лишнее
00:54:51
чтобы а стоп секундочку а точнее функцию
00:54:55
надо прописать давайте пропишем функцию
00:54:57
наш как я буду делать контракт когда мне
00:55:00
функции нету я прописываю функцию тощей
00:55:03
а вот на самом деле вот это вот хочу
00:55:04
забить функцию свой файл с вот этим вот
00:55:08
я хочу забить функцию df print набор buy
00:55:18
digits я предполагаю что мне дают здесь
00:55:23
x
00:55:24
некий
00:55:29
так ну и я соответственно здесь вот его
00:55:32
ввожу да и вызываю функцию print нам
00:55:34
рамбай бюджет хотя бы неправильно
00:55:40
неправильно нам на rigidbody чит быть
00:55:46
слишком длинно а так получается как бы
00:55:50
цифры при помощи цифр тоже мне нравится
00:55:52
ведь я даже вот лекция и вроде времени
00:55:55
жалко а я все равно не могу удержаться
00:55:58
чтобы не попытаться продумать интерфейс
00:56:00
название функции соответствовало сути
00:56:02
нехорошо как-то да когда непонятно
00:56:05
по-английски не понятно что это такое
00:56:07
digit buy by jack ну я ей даю этот некий
00:56:11
x тогда ну и после этого и буду печатать
00:56:14
что у меня завершении программы о но
00:56:17
теперь мы есть клиент и поставщик на
00:56:20
клиент поставщик и вот фишка в том что я
00:56:23
могу вот этому вот
00:56:26
поставщику прописать сказать он у меня
00:56:29
работают по контракту контракт вот эта
00:56:33
штучка которая пишу сам пирс андам это у
00:56:36
это не ampersand
00:56:37
с этим коммерческая и не знаю как
00:56:40
называется собачка короче это называется
00:56:43
декоратор я не хотел бы сейчас глубоко
00:56:46
вас уводить о декораторы работают вот
00:56:48
так это некая такой фишка некий
00:56:51
синтаксический сахар по на воротам над
00:56:55
функциями на воротам над классами
00:56:57
взять и вот и вкрутить им апгрейт
00:57:01
задекорировать его декоративный ремонт
00:57:04
сделать ему вот я делаю накладываю на
00:57:06
эту функцию дополнительный декоратор
00:57:08
который заключается в том что у меня
00:57:10
контракт к ней применяется
00:57:11
я прописываю этот контракт каким образом
00:57:14
я говорю x равно а дальше смотрите я
00:57:19
пишу здесь тип и через запятую но это
00:57:24
синтаксис собственно пай контракт это
00:57:27
уже синтаксис не питона то что по идее
00:57:30
вот с точки зрения питона оторви yamaha
00:57:33
mint но библиотека пай контракт
00:57:36
предполагает некий синтаксис
00:57:37
взаимодействия с ней вы ей объясняете
00:57:40
контракт на уж не будете договор со льда
00:57:42
вот есть крот короткие формы при помощи
00:57:44
которых можно что-то прописать против и
00:57:46
про значит эти самые значения допустимый
00:57:49
ну и соответственно я говорю int и что
00:57:51
еще больше либо равно 0 тогда вот и
00:57:56
теперь да это дело конечно не заработает
00:57:59
сейчас почему сейчас я сохранюсь начали
00:58:04
а теперь собственно запущу
00:58:06
запустим питон advanced свой тогда что
00:58:11
дело ну конечно елки-палки но он же не
00:58:13
знает такого
00:58:14
декоратора contract нужно библиотеку по
00:58:16
и контракта запустить вот поэтому я что
00:58:21
делаю from contracts импорт контракт
00:58:27
contract
00:58:30
так ну с богом давайте запустим значит
00:58:35
теперь мы его запустим соответственно
00:58:36
nevian python advanced пыл
00:58:42
ну проверим что это работает 12345 он не
00:58:46
печатает пять четыре три два один
00:58:48
откусывая с конца замечательно
00:58:50
замечательно давайте еще разок запустим
00:58:52
и скажем ему что-нибудь такое -10 то на
00:58:59
приплыли
00:59:00
что это такое обратите внимание я ведь и
00:59:05
сирт нигде не писал сейчас если не
00:59:09
ошибаюсь конечно но мы тоже посмотрим
00:59:11
давайте посмотрим еще а он есть к
00:59:16
сожалению java грохну я вы сейчас грохну
00:59:20
более того он проверяется на старте
00:59:24
функция стартует да и вот даже до того
00:59:27
как фактически в нее вошел уже
00:59:28
проверяется контракт черта не случилось
00:59:31
поэтому ничего страшного там сейчас было
00:59:32
вот так вот давайте посмотрим что за
00:59:35
жизнь случилось до текста много слушайте
00:59:39
еще раз вы оцените с текст и ошибок
00:59:44
когда вы потратите кучу времени на поиск
00:59:47
ошибки может быть вы уже потратили вам
00:59:49
не надо это объяснять
00:59:50
вот
00:59:52
короче тра-та-тару-та-там вот здесь
00:59:57
прописаны че вообще случилось да в каком
00:59:59
файле покой строки in print набор digi
01:00:03
digi так что дальше дальше contracts
01:00:06
main там произошло исключения чек
01:00:10
contract по проверке контракта давайте
01:00:13
ниже ниже ниже ниже давайте к концу до
01:00:15
компресс онлайн 89
01:00:18
чё он сказал contract нотр аспекты не
01:00:24
уважают контракт короче ребят респект
01:00:29
ему не выказали что именно bridge for a
01:00:33
bear gaming x да вы короче в аргументе x
01:00:37
читаю до по-русски на брусья честно не
01:00:41
помню данную
01:00:43
наваляли короче на на брить или для
01:00:46
аргумента x до в этой вот функции что
01:00:50
именно условии того что -10 больше либо
01:00:54
равно не уважается до
01:00:56
checking больше либо равна 0 литра
01:00:58
значит короче сейчас достаточно
01:01:04
собственно вот этой информации
01:01:06
да и вот того какое именно условиях
01:01:08
нарушилась там может быть целое целое
01:01:12
множество условий которые можно
01:01:15
прописать вот интересно то что можно
01:01:18
по-разному вызывать да и разные вещи
01:01:20
случаются вот там если вызвать со
01:01:24
строкой то будет соответственно говорить
01:01:26
что не соответствует
01:01:30
энту скаляр энту скаляр эры энтов короче
01:01:33
не подходит как эндо вот проверка
01:01:36
дополнительной диагностика это все
01:01:38
предыдущие тут пропускается как раз
01:01:41
пример контракта с проверкой результата
01:01:43
работы функции returns то есть
01:01:47
специальное слово при помощи которой она
01:01:48
предполагается что у вас нет такого
01:01:50
атрибута returns на тогда мы можем
01:01:54
соответственно проверить а чё она
01:01:55
возвращает у нашей функции ничего не
01:01:56
возвращает
01:01:57
мы возьмем сейчас пример вот прям из вот
01:01:59
вот этого текста
01:02:00
потом возьмем
01:02:04
тратата тратата тип сейчас секундочку
01:02:08
где он тут ну ладно давайте я просто
01:02:11
сейчас даже открою питона просто заведу
01:02:13
функцию прям вот в интерпретаторе прям
01:02:18
вот тут я создам функцию
01:02:21
ах тыж елки-палки еще раз он вел ее не
01:02:30
снимет не ожидаемо для меня не совсем
01:02:32
так придется по строчке вводите
01:02:38
тогда да ё-моё
01:02:45
ладно сейчас сделаем еще проще
01:02:51
вим этот самый рейтинг контракт . пай
01:03:10
сейчас посмотрим как мне это печатает
01:03:13
вот такое не сует на учил ручного
01:03:18
перебила все
01:03:27
df и соответственно функция reach an ex
01:03:35
тупо то есть функция это только
01:03:38
демонстрации все что вот как оно в
01:03:40
принципе работает если я не ошибаюсь у
01:03:42
нас опция минус и запускает с этим
01:03:47
контракта в прошу прощения так
01:03:55
как он называется то у меня еще раз жить
01:03:57
он контракт
01:04:09
так и запускаем его и остаемся после
01:04:12
этого в интерактивном режиме чтобы можно
01:04:14
было функцию запускать f от единички
01:04:17
возвращает не единичку пожалуйста да но
01:04:19
если ей суну сюда строку то она мне что
01:04:22
она скажет функция вернула не the
01:04:26
expected to paint a gat класс стр
01:04:30
видите да ну и соответственно короче вот
01:04:34
таким вот образом можно прописать
01:04:36
предполагаемый пост условия очень
01:04:37
компактна и мне очень нравится именно с
01:04:39
компактностью возможность но и
01:04:41
собственно есть три варианта описание
01:04:43
контракта функции мы говорим конкретно
01:04:46
покупай контракт значит да я вот что еще
01:04:50
покажу я сразу открою такая штука так не
01:04:53
было где она была я запас тут
01:04:56
презенташку это презенташку я а это моя
01:05:01
презенташку нет вот если и поискать по и
01:05:04
контракт в документации в принципе да то
01:05:07
это некий андреа цензе написал вот и ну
01:05:12
и соответственно она лежит на гитхабе
01:05:14
дед capcom андреа цензе контракт вот
01:05:19
пожалуйста с уточкой сеньор reset чернов
01:05:26
цюрихе
01:05:27
витаешь где-то недалеко от этого
01:05:30
бертрана мэра вот значит и
01:05:34
соответственно здесь же ссылка на вот
01:05:37
файлик на продаже на страничку с
01:05:39
документацией по ней
01:05:42
здесь ссылочка на презенташку очень
01:05:45
простую коротенькую 22 страничке вот
01:05:48
доклад в бостоне
01:05:50
значит мы сейчас быстренько пропустим
01:05:53
посмотрим на конкретные примеры добыть
01:05:55
как замкнулся с крючком вот ну вот этот
01:06:02
вариант который я вам показывал да
01:06:04
значит соответственно на возвращаемое
01:06:06
значение до можно через запятую
01:06:11
прописывать их много вот ему нравится
01:06:14
именно этот вариант вот но есть вариант
01:06:17
и прописывать через просто документ
01:06:19
строки то есть мы по сути к документ
01:06:22
строке прописан дополнительно этот
01:06:24
декоратор контракт и все ну и когда
01:06:27
нужно следовать
01:06:29
если уж мы пользуемся пай contracts ой
01:06:31
сорри
01:06:33
да щас я честно сказать не знаю как мне
01:06:37
это сделать а но выделения ног еще хуже
01:06:45
еще пульс становится это из-за пересвета
01:06:48
на самом деле я еще я надеюсь что отсюда
01:06:52
можно скопировать и она при этом не
01:06:53
сделать мне то же самое да давайте
01:06:55
посмотрим покажу альтернативный вариант
01:06:57
вим тогда как он называется docstring до
01:07:04
контракт пай давай о почти сейчас
01:07:13
секундочку смысл в том что в самом
01:07:16
декораторы не прописывается ничего
01:07:18
декоратора вызывается без параметров но
01:07:22
в документ строке прописывается нечто ну
01:07:25
я тут напишу некий там ps условно да
01:07:28
неважно что да да тогда нужно чтобы вы
01:07:31
строго соответственно строгое
01:07:33
соответствие вот этим вещам да вот есть
01:07:37
вариант описание документации к функции
01:07:41
до в котором у вас вот так вот : мы
01:07:44
выделяется type x это формата рост рака
01:07:47
черт текст известные форматы рст для
01:07:50
описания параметров
01:07:51
тип x там можно сам еще отдельно
01:07:55
прописать x но вот собственно здесь atf
01:07:56
type x прописывается что это такое
01:07:59
какие на его контракт и да и r-type
01:08:03
сотрите runtime что предполагается в
01:08:05
качестве возвращаемого значения так
01:08:07
видно хорошо да окей ну и последний
01:08:12
вариант это использование аннотаций в
01:08:15
питоне 3 появились аннотации мне очень
01:08:18
нравится вот этот вариант на самом деле
01:08:19
давайте просто открою
01:08:22
интерпретатор напишу функцию f у которой
01:08:25
я скажу x :
01:08:27
and почти как в pascal да вот но я хотел
01:08:34
бы чтобы эта функция
01:08:35
а под контрактом соответственно что я
01:08:38
делаю я пишу контракт секундочку
01:08:42
придется мне начать этого контракт
01:08:45
теперь пишут эф эф икс : int я просто
01:08:52
просто используя нотацию типа
01:08:54
а давайте и возвращает она тоже int то
01:08:56
есть я предполагаю что
01:08:57
и целое число получает целое число
01:08:59
возвращай и здесь я что-нибудь делаю там
01:09:03
не знаю require an ex пополам и про не
01:09:09
знаю там давайте умножить на 2 ч
01:09:15
контракт а прошу прощения тактного еще
01:09:22
раз тогда под контрактом функция
01:09:28
с аннотацией просто с аннотации типов и
01:09:33
что я теперь запускаю эту функцию и и
01:09:36
запускает для двоечки возвращают на
01:09:38
четверочку для шестерки 12 суперкласс
01:09:41
замечательно функция работает только
01:09:42
теперь ее нельзя вызывать с чем ты не
01:09:45
соответствующим если бы эта функция была
01:09:47
без контракта до
01:09:49
тогда я мог бы вызвать и она отработала
01:09:52
на начало fsd в два раза с помощью
01:09:54
строки можно нажать на числа а теперь
01:09:57
лапа мы получаем то что имеем си плюс
01:10:00
плюс строгую проверку типов то есть в
01:10:03
принципе те кто очень мечтает о си плюс
01:10:06
плюс най строгой проверке типов друзья
01:10:10
для этого не обязательно делать именно
01:10:11
компиляцию можно просто везде подписать
01:10:15
контракт contract contract везде
01:10:17
функциях в писать аннотацию типов через
01:10:19
двоеточие там стрелочку возвращаемое
01:10:21
значение у вас будет строго проверка
01:10:22
типов вопрос в том что это не всегда
01:10:24
хорошо для питона тоже тогда вы теряете
01:10:27
все возможности динамической типизацией
01:10:29
ну а вдруг тип не совпадёт не в точности
01:10:32
совпадет тут очень аккуратно надо вот
01:10:37
поэтому
01:10:39
думайте перед тем как делать значит
01:10:41
некие есть описание объяснения почему и
01:10:44
как это делать но я уже сейчас не буду
01:10:46
уходить в детали наше время истекает
01:10:48
поэтому мы закончим почему что там
01:10:53
описание какой-то короче как делать
01:10:57
логическое и и делается при помощи
01:10:59
запятой
01:11:00
логической или при помощи вертикальные
01:11:03
черты все это дело компактное очень
01:11:05
легко описывается в принципе прошу
01:11:08
прощения короче меньше нуля больше
01:11:09
единицы и наверно перегнулся яркостью
01:11:17
дорогой проект от вас не яркость и сразу
01:11:21
все появилось ведь неспроста людей
01:11:23
понизили яркость ну вот собственно вот
01:11:28
не контракт видите да и очень com
01:11:31
комфортно это дело смотреть
01:11:32
ладно дальнейшая то есть я самое главное
01:11:35
объяснил суть вам показал как это в
01:11:37
принципе работает вот можно какие-то
01:11:39
взять там сложные примеры
01:11:41
да там это дело работает и для списков у
01:11:44
меня помоему это делал там где-то были
01:11:46
примеры для контрактов связано не
01:11:53
значение различных вот эта презенташку
01:11:54
моя контракт с pdf к она валяется в
01:11:56
репозиторий с лекциями в моем гитхабе
01:12:00
можно найти его и в этих видеозаписях
01:12:03
лекции там ссылка на него есть вот ну
01:12:07
там вот какие-то еще есть варианты но
01:12:09
сейчас несут даже важно не суть даже
01:12:12
важно там чуть ли не функции можно из
01:12:14
проверки при проверке контрактов
01:12:16
запускать функции для проверки ладно
01:12:20
вопросы давайте все не видите завершил
01:12:24
во время звонка еще не было
01:12:28
а про инварианта ой чот я не помню как
01:12:38
он для любой контракт он может быть
01:12:40
вообще не реализованы а по может быть а
01:12:43
мне кажется он пишется просто в классе
01:12:45
но это нужно смотреть инвариант
01:12:49
запускается запускается по сути проверка
01:12:52
контракта каждый раз при любом после
01:12:57
любого метода
01:12:59
выполнился метод какой-то обновить
01:13:03
что-нибудь там обновить объект если
01:13:06
после этого объекта оказывается например
01:13:08
за пределами игрового поля вот у вас
01:13:10
шарики например до вас класс шарик к
01:13:12
нему можно писать контракт что его x y
01:13:15
не должен выходить за пределы экрана
01:13:17
влево вправо и вниз а верх можно
01:13:20
например да и пожалуйста а для другого
01:13:24
там объект например что пушка никогда не
01:13:26
смотрит дулом вниз а там вы
01:13:28
рассчитываете что это разделить на это
01:13:30
там или это умножить на это не должно
01:13:32
быть отрицательным числом условно да или
01:13:34
там оно должно там косинуса от этого там
01:13:35
должен быть больше там чего то понятно и
01:13:39
понятное дело что это некий кант как еще
01:13:42
раз это не то что вы должны проверять
01:13:44
пользователя да и пользователь должен
01:13:46
у меня кошмар че-то вывалилась какой-то
01:13:49
текст написан но это это будет гарантией
01:13:53
того так как только вдруг возникнет
01:13:56
такая ситуация супер шарик у вас так и
01:13:58
вылетел за пределы экрана то вы об этом
01:14:01
узнаете в на этапе тестирование очень
01:14:04
быстро то есть вы посадите своего
01:14:06
коллегу тестировщика и он все эти
01:14:09
контракты даже более того я вам скажу тестировщик
01:14:13
по хорошему тот кто вас в команде
01:14:14
занимается тестированием он должен
01:14:16
пройтись по проекту и везде где можно
01:14:19
уточнить фактический контракт ну то есть
01:14:23
вот от а какой ответственностью вот это
01:14:25
вот вот этот кусочек программа обладая
01:14:27
зачем должен возвращать а какого типа
01:14:29
это а какие допустимо а может ли этот
01:14:31
объект оказаться tanto понимаете вот эти
01:14:34
вещи их важно в первую очередь
01:14:36
осознать очень многие почему
01:14:41
хотя юридические фирмы падают друг на
01:14:44
друга в арбитражный суд и судятся
01:14:46
регулярно тем не менее этих судов мне
01:14:48
очень много по сравнить с тем сколько их
01:14:52
могло бы быть
01:14:53
почему то же сам факт наличия
01:14:57
письменного договора сам факт наличия
01:14:59
контракта от многих вещей защищает
01:15:02
понимаете грамотно составленный договор
01:15:05
и если обе стороны читают договора со
01:15:08
всеми мелкими пунктами да то тогда вы
01:15:11
просто не будете заключать сделку
01:15:13
понимаете вот точно то же самое
01:15:18
получается при использовании контрактов
01:15:19
программирования просто вот сама
01:15:21
продумывание контрактов уже улучшает
01:15:24
программу и кстати именно поэтому
01:15:26
называется не программирование по
01:15:27
контракту просто хотя так говорят
01:15:29
программный код а именно дизайн buy
01:15:32
контр потому что проработка контрактов
01:15:35
оно по сути является продолжением
01:15:37
структурного программирования вот этого
01:15:39
движение сверху вниз когда мы занимаемся
01:15:42
где композицией
01:15:43
а здесь по сути это процесс еще раз
01:15:45
говорю когда мы вас как бы склеиваем
01:15:47
обратно аборт то есть мы развелись
01:15:49
разрезаем на части мы делегируем говорим
01:15:52
дорогой там он у тебя про мошенника
01:15:54
рассказывал до который там строить дом
01:15:56
типа возвращает да не построенный и вот мы
01:15:59
прорабатывая контракт мы по сути
01:16:02
заставляем его да вот в итоге нам
01:16:05
возвращать вот так постепенно вот
01:16:09
декомпозиция вместе с проработка
01:16:11
контрактов приводит к отказу устойчивым
01:16:15
программу в таких программах ошибки есть
01:16:18
ошибки все равно будут них намного
01:16:20
меньше на порядок меньше
01:16:23
понимаете ну вот в следующий раз мы
01:16:27
будем с вами разговаривать про
01:16:28
тестирование тестирование модуль на в
01:16:31
первую очередь я покажу более
01:16:33
продвинутые техники тестирования unit
01:16:37
testing и немножко про само тестирование
01:16:40
как таковое спасибо большое до свидания
01:16:44
[аплодисменты]

Описание:

Практика: http://cs.mipt.ru/python Telegram-группа: https://t.me/tkhirianov_python_2019 Программа курса: https://github.com/tkhirianov/lections_2019/tree/master/semestr_1 Спонсировать: https://www.patreon.com/tkhirianov или https://www.paypal.com/paypalme/tkhirianov или 63900240 9020000598 (карта СБ).

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Практика программирования на Python 3, лекция №13"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Практика программирования на Python 3, лекция №13" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Практика программирования на Python 3, лекция №13"?mobile menu icon

  • Полностью зависать браузер/компьютер не должен! Если это произошло, просьба сообщить об этом, указав ссылку на видео. Иногда видео нельзя скачать напрямую в подходящем формате, поэтому мы добавили возможность конвертации файла в нужный формат. В отдельных случаях этот процесс может активно использовать ресурсы компьютера.

mobile menu iconКак скачать видео "Практика программирования на Python 3, лекция №13" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Практика программирования на Python 3, лекция №13"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "Практика программирования на Python 3, лекция №13"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.