Python курс для начинающих в одном видео Привет мир в процессе курса я познакомлю вас с самыми частотными конструкциями языка и библиотеками порешаем задачи которые программисты решают на реальной работе поработаем с http запросами и даже напишем простенький Telegram бот Неважно как вы хотите использовать Python после курса основы которые я изложу здесь по-любому пригодятся вам Меня зовут Саша Скоро будет 5 лет как я профессионально занимаюсь программированием большую часть этого времени я писал и пишу сейчас на Python на Python я решал разные задачи писал Кэн в компаниях разного размера анализировал данные работал рядом с нейросетями писал Telegram ботов
скреперы и так далее на Python Я видел всё Ну или почти всё Python на данный момент Самый распространённый язык программирования в мире об этом говорят рейтинги tiobe и pypl Python закрывает широкий спектр задач анализ данных backend Machine Learning автоматизация и скриптинг Спектр такой широкий что Python используют не только профессиональные разработчики даже если вы не планируете работать программистом знани Python окажется полезным для разных вещей если бы меня спросили Какой самый полезный навык прямо сейчас я бы не колеба Ясь ответил умение пользоваться пайном это высокоуровневый язык То есть он упрощает разработку и снимает программиста ряд проблем например
управление памятью то есть Python Хорошо подходит для новичков это интерпретируемый язык то есть результат от выполнения программы можно получить сразу и не ждать каких-то промежуточных стадий типа компиляции это язык с динамической типизацией Что делает синтаксис языка максимально простым как я советую проходить этот курс пишите код вместе со мной то есть буквально останавливайтесь будет задание которые я советую вам решить самому к заданию прилагается ответ смотрите в него после того как потратите хотя бы час на самостоятельное решение Практика - это главный источник вашего роста и помните в начале всегда тяжело но со временем У вас начнёт получаться
радость от самостоятельного решения задач не сравнить ни с чем И я желаю вам дойти до этой точки погнали обычно курсы начинаются с долгой установки софта на компьютер а я бы хотел сразу перейти к коду софт мы обязательно установим Вот на этом тайминг Для более быстрого погружения мы начнём писать код в онлайн интерпретаторе Я выбрал следующий сервис подобных сервисов много если именно этот сервис не работает то Вот по этому Google запросу можно найти другой онлайн Python интерпретатор если софт на вашем компьютере уже установлен прекрасно начинайте кодить прямо в нём Итак начнём с встроенной функции Print функция
Print будет помогать нам ориентироваться в коде она выводит значение каких-то переменных или просто строковых данных в терминал напишем первые Hello world запускаем видим в терминале значение функцию можно передавать сразу несколько строковых значений Hello world они в терминале будут разделены пробелом если мы хотим разделить их каким-то другим символом то нужно использовать аргумент SE то есть separator или разделитель и между словами Hello и World уже видится запятая и пробел если мы исполним функцию Print в разных строках то и в выводе значение выведется в разных строках А если мы хотим сделать какое-то другое разделение например второй вывод в
той же строке что и первый то нам нужно воспользоваться аргументом and и передать сюда пробел Тут нужно упомянуть что код в Python исполняется сверху вниз строка за строкой как мы это уже видели Давайте познакомимся с ещ одной функцией из встроенных это функция Input функция Input приостанавливает исполнение кода чтобы пользователь что-то вбил в терминал А вот исполнение приостановило мы сюда можем вбить то что мы хотим нажимаем Enter и код идёт Дальше например мы можем попросить пользователя вбить своё имя и вывести это имя обратно в терминал Enter и мы получили имя обратно в терминале перейдём к переменным
в пайне переменная это своего рода кой хранит значение это значение может быть разных типов строкой числом или какими-то более сложными типами с которыми мы познакомимся позже после того как вы сохраняете значение в переменную Вы можете пользоваться им дальше в своём коде Давайте создадим переменную name и выведем эту переменную в терминал всё получилось переменным давать осмысленные имена потому что код пишется один раз а читается в среднем пять и самое главный человек который будет читать ваш код это вы сами Поэтому лучше позаботиться о себе сразу Обратите внимание если в обычной математике мы используем равно для проверки на
равенство чего-то то в Python мы используем равно как знак присвоения А давайте создадим переменную H в первой строке у нас происходит присвоение в переменную значение во второй в переменную H значение 25 Давайте выведем их в терминал переменные можно Объявлять по-другому сразу же несколько например вот так H ра 25 при этом в левой стороне от знака присвоения должно быть лько же значений скоко вво Давайте выведем в терминал всё получилось переменные можно присваивать в другие переменные name other name равно name Давайте выведем other [музыка] name также elis допустим у нас есть переменная X в которой лежит значение
3 и переменная Y в которой лежит значение 4 нам нужно чтобы в переменной Y оказалось значение переменной X и А в переменной X значение переменной Y в Python для этого есть очень удобный синтаксис XY = yx и Давайте выведем их в терминал первый X в котором лежит значение четыре и вторая - это переменная Y в которой лежит значение 3 А я напомню что в начале у нас лежали в этих переменных другие значения в пайтоне есть встроенная функция Type которая показывает к какому типу относится значения например Давайте присвоил значение оди и узнаем тип этой переменной тип
переменной int то есть целое число если мы введём сюда строку Hello world то переменная будет типа стр или рин строка в пайтоне есть некоторое количество ключевых слов которые зарезервированы например это функция Print поэтому не надо называть переменные этими ключевыми словами например вот сделать вот так это очень плохо код просто упадёт с ошибкой в Python есть договорённости по поводу того как должны называться переменные классы название пакетов константы и так далее Вы видите эту договорённость на своём экране самое главное что вам нужно запомнить что А есть Snake Case это прописные буквы в которые слова разделены нижним подчёркиванием
Snake Cas используется для объявления переменных функций методов модулей и так далее пока мы будем использовать его со всеми остальными вариантами написаний мы познакомимся позже числа в Python множество числовых типов данных но нам Для начала нужно познакомиться с двумя из них это integer и float integer - это целые числа то есть например 10 там может быть -1 0 и так далее а FL - это числа с плавающей точкой числа Конечно же можно складывать друг с другом допустим у нас есть переменная X которая равна 10 и переменная Y которая равна 5 Давайте вычислим их сумму X +
Y Посмотрим что получилось 15 Также можно складывать числа с плавающей точкой сейчас уже получилось 16 точ 0 то есть сари в итоге сейчас относится к типу лот то есть числа с плавающей точкой можно делать умножение и деление Давайте посмотрим что получится давайте я присвою в переменную Z результат выполнения операции получилось 50 Также можно делить а Z тогда будет типа flot 2 то 0 если мы сделаем Y ра 0 то на ноль делить Нельзя интерпретатор говорит нам об этом э вот здесь всё написано Zero division Error division by zer то есть мы разделили на ноль и
интерпретатор ругается на нас в Python есть также другие действия если с вот этими действиями всё понятно то давайте подробней остановимся Вот на этом возведение в степень целочисленное деление и остаток от деления возведение в степень Давайте возведён 3 Это значит что 2 Умно на себя же на два три раза X = 2 Print x в степени 3 получилось воем это эквивалентно вот такой записи а что такое остаток отделения допустим нам нужно разделить число дев на число четыре при этом мы не можем пользоваться десятичными дробями Что будет если дев разделить на 4 то получится 2х 4 это
8 плюс 1 можно записать вот так два в данном случае - это результат целочисленного деления 9 на 4 А 1 - Это остаток отделения и мы можем посмотреть это в коде а целочисленное деление записывается вот таким образом а получилось два а остаток отделения делается Вот так по один порядок действий в пайтоне допустим у нас есть число integer которое вычисляется следующим образом это 2 + 3 у 5 первым будет выполняться умножение и затем сложение то есть на выходе нас будет ждать 17 если нам нужно первым выполнить сложение то мы просто берём его в скобки получилось 25
типы integer и flot можно складывать с друг с другом на выходе получится а число с плавающей точкой то есть типа flot 15,5 получилось Какого размера вообще числа можно засовывать в переменную переменная типа int может хранить числа любого размера если они влазят в оперативную память причём значения могут быть очень большие А например количество атомов в обозримой Вселенной равно примерно 10 в степени 80 То есть это число с воде нулями в пайтоне мы можем легко сделать число с 1.000 [музыка] нулями Для этого просто 10 возведён 1.000 Давайте посмотрим что получилось а так я умножил сейчас Да нужно
возвести в степень Получилось число вот с таким количеством нулей если нам нужно получить переменную типа FL из переменной integ то нам нужно использовать ключевое слово FL Например у нас есть переменная и переменная My сделаем вот ву аргументом переменную My int Давайте посмотрим что получится на выходе да получилось 1.0 если сделать следующим образом вот у нас есть переменная myf которая равна 1.5 и нам нужно сделать из этого integer А давайте посмотрим что получится если записать вот так получается единичка то есть а функция int она просто отрезает всё что после запятой То есть даже если будет здесь
вот так она просто возьмёт и отрежет всю дробную часть Как воспользоваться если мне нужно округлить число есть функция Round в питоне и Давайте посмотрим что будет два округляется всё по правилам арифметики то есть 1.5 будет равно двум а 1.49 будет равно единички Итак с арифметическими действиями всё прекрасно но как их применять на практике Давайте решим вот такую задачу вы видите её на экране Я бы советовал вам попробовать решить её самим но я сейчас расскажу её решение и подсвет сам процесс решения а Итак у нас есть дом в котором пять подъездов по 20 квартир а на
каждом этаже четыре квартиры То есть очевидно что этажей пять дом представляет из себя следующее А у нас идёт нумерация с первого этажа вверх первый этаж - это квартира 1 2 3 4 5 6 7 8 Ну и так далее последняя квартира в первом подъезде двадцатая вот э квартира двадцать Первая это сороковая сорок первая шестидесятая Ну и так далее а такая схема очень помогает Ну просто понять эту задачу и постараться найти решение Давайте начнём с номера подъезда чтобы получить номер подъезда в доме Где в каждом подъезде 20 квартир нужно применить целочисленное деление на 20 Давайте попробуем
это сделать так давайте начнём и вычитаем номе для квартиры номер д как это делается Ну что Давайте попробуем in Number номер подъезда равно Number целочисленное деление на 20 и получим номер подъезда получился ноль потому что 2 численно на 20 Дели и получается но нам нужно прибавить к этому единицу чтобы получился первый подъезд потому что в жизни мы считаем с единицы Так н Number для квартиры 2 равен один но у нас есть Давайте попробуем для квартиры 20 определить А подъезд у нас получилось два Хотя в нашем доме двадцатая квартира находится в первом подъезде это особенность целочисленного
деления Ну сама само число делится само на себя и получается единица нам нужно от числа отнять единичку от номера квартиры минус единица и уже это разделить численно на 20 и прибавить один Давайте попробуем всё для квартиры 20 подъезд один получается Давайте попробуем для квартиры 40 подъезд два Всё верно давайте для квартиры 21 попробуем подъезд два для квартиры просто один первый подъезд Всё верно для квартиры 81 должен получиться Подъезд пять Да всё верно Вот так высчитывается entrance Number с номером этажа ВС обстоит чуть сложнее давайте обратимся к нашей схеме вот допустим у нас есть квартира 12
и есть квартира 32 Она расположена вот здесь для этих квартир по сути должно быть одно правило для вычисления этажа Поэтому нам нужно избавиться от подъезда в нашем вычисления как это сделать Ну очень просто нужно начать с того мы уберём подъезд просто получив остаток от деления номера квартиры на количество квартир в одном подъезде остаток отделения вот так вычисляется Давайте попробуем найти остаток отделения квартиры 81 де на 20 у нас будет она вторым числом А это единичка А всё О'кей дальше нам нужно эту единичку узнать целочисленный остаток отделения на четвёрку это похоже с тем как мы вычисляли
подъезд четыре квартиры на каждом этаже пишем целочисленное деление от четырёх квартира 81 должна располагаться на первом этаже у нас получился ноль Ну мы считаем в жизни с единички поэтому надо прибавить единичку Всё верно квартира 81 расположена в пятом подъезде на первом этаже А проблема начинается когда мы опять-таки попробуем вычислить значение этажа для двадцатой квартиры получилось один Хотя квартира расположена на пятом этаже А проблема всё в том же 20 при делении на 20 оставляет остаток ноль Поэтому нам нужно вот сюда опять же воткнуть минус единичку Всё мы узнали на каком этаже расположе квартира и в каком
подъезде если мы начнём экспериментировать Давайте допустим квартира 24 она должна располагаться во втором подъезде на первом этаже Давайте запустим подъезд д этаж один Всё верно тип данных Bull Это тип данных который включает в себя два значения True или false как он объявляет пере наме перемен то есть пусть у нас есть какой-то объект какого-то ученика допустим в коде и нам нужно держать признак является ли он студентом и мы вот напишем Давайте посмотрим выведем значение в терминал Или допустим у нас есть опять же объект какого-то ученика Давайте присвоить сюда false и выведем is graduated переменную она равна
false самое главное что используется с типом Bull - это выражение допустим у нас есть X равны 10 и y Рав 10 и нам нужно сравнить равен ли X и или нет сравнение в Python делается с помощью оператора равно равно X = Y результатом выражения является переменная типа бу True или fse в данный момент это True если наш X будет равен де то в терминал выведется fse мы можем результат этого выражения присвоить в переменную Давайте назовём её Да и выведем е в терминал переменная равна fse Давайте заменим X обратно на 10 и переменная сейчас равна True
можно узнать что переменные присвоить сюда не равны друг другу not equ для того чтобы проверить что переменные не равны используют вот такой операторный зна равно сечас переменная equ ра Потому что эти X и Y равны друг [музыка] другу если мы присвоить в переменную Y значение 9 то переменная not equ будет уже True для выражений в Python используется множество операторов То есть например это больше меньше так же как в математике больше либо равно меньше либо равно допустим у нас есть переменная X и Y Давайте напишем принты что нам вернут разные операторы запускаем получилось True fse True
fse то есть True X Y Да X возвращается нет X не меньше и возвращается X боль либо равно Y опять возвращается True и возвращается fse А давайте посмотрим вот если у нас оставим только вот эти значения и если значения равны то оба выражение вернут True потому что X больше либо равно Y 10 больше либо равно 10 если нам нужно проверить два условия то используются операторы или or допустим у нас есть X равно одно и нам нужно проверить что одновременно X Мень п и больше -2 мы записываем вот так X Мень 5 и X бо -2
А в данный момент наш X удовлетворяет этим условием и в терминал должен вывести True это если число не попадает в интервал то выведется потому что уже первое условие провалено 6 не меньше пяти также с булевы переменными используется оператор not оператор меняет знак у переменной типа бу То есть если переменная типа бу была например то за работу операторов рядом с булевы значениями отвечает наука логика если у вас в ней Пробел то неплохо бы прежде чем погружаться в программирование или параллельно с тем чтобы погружаться в программирование почитать какие-то основы логики основы очень лёгкие и их изучение займёт
небольшое время когда мы работаем с булевы типом данных у нас также есть ключевое слово Бу мо передавать значения других типов например чисел Бул от единицы будет Бул от нуля будет ЛС Бул от мину оно будет также True то есть функция Бул в данном случае проверяет ели хоть какое-то значение отличное от нуля туда можно также передавать Роко данные Например если мы возьмём и функцию Bull передадим строку Hello world будет True если функции Bull окажется пустая строка то это false зачем это использовать мы поговорим в следующем модуле условные операторы как это устроено в Python оператор If является
началом условной конструкции А дальше идёт условие Давайте вместо условия сейчас просто напишем True затем блок кода отделяется либо табо либо четырьмя пробелами обычно в IDE когда вы нажимаете Tab то вместо него подставляется четыре пробела но здесь в онлайн интерпретаторе сразу же ставится Tab и следующая строчка следующий блок кода отделён отступом всё что отделено отступом по ДФМ а исполняется если условие равно True Давайте напишем здесь Print Hello world запускаем Hello world вывелся в терминал если мы напишем сюда false то Hello world не выведется в терминал потому что условия не выполняется допустим у нас есть переменная X
которая равна 10 и мы напишем и бо ну Print X положительны он написал Если x равен -10 то условие выполнено не будет иногда нам нужно проверить сразу несколько условий это сделается с помою допустим у нас есть X который равен Ну если X бо нуля то мы напишем X положительные X меньше нуля напишем что X отрицательные и мы можем также написать здесь конструкцию elif и перечислить что X равно 0 но я предлагаю сюда а сделать else в else пойдут все остальные случаи и написать собственно все остальные случаи и x равен нулю запускаем код X и Z
если X положительные то исполнение пойдёт вот в этот блок если X отрицательные то исполнение пойдёт в средний блок если условия наслаивается например мы напишем что X бо 0 и X бо оного то есть вот у нас и X ра 10 x удовлетворяет и этому условию и этому исполнится то условие которое расположено вы Да исполнение кода пошло вот в эту ветку допустим нам нужно проверить сразу два условия У нас есть какой-то X который равен 10 У нас есть Y 20 и нам нужно проверить что и X положительный и y положительный как это записать If X 0
здесь в блоке кода можно написать Вот так и Y > 0 и Print X and Y are positive но это не очень хорошо а Обычно когда мы проверяем два условия нужно делать их в рамках одного условного оператора и соединить их а ключевым словом end так лучше Мы также можем сделать проверку с какими-то текстовыми переменными Например у нас есть mess и нам нужно проверить что mess не пустой мы так и пишем If mess Print mess из not empty так как mess есть какие-то символы то условие исполняется и исполняется этот блок кода если будет пустой то блок
кода не исполнится То есть когда мы передаём в условный оператор текстовую переменную то происходит следующее Python берёт функцию бу накидывает её на M а функция бу от пустого межа это от от пустой текстовой переменной то исполнение кода не идёт в этот блок Но для удобства функцию Bull можно не прописывать и мы просто пишем If message и также можно делать с числами Например у нас есть какой-то X который равен нулю If X Давайте X поставим единички и проверим если x равен нулю то блок кода сюда Не зайдёт этот блок кода не исполнится Давайте напишем небольшой скрипт
который определит является ли год високосным правило определения високосного года достаточно хитрое год должен без остатка Дели 4но если при этом без остатка и при этом не делится без остатка на 400 то он не является високосным то есть например год 1800 не является високосным потому что он делится на 100 без остатка но при этом не делится без остатка на 400 год 2000 уже является високосным потому что он делится на 400 без остатка а и он является високосным Несмотря на то что делится на 100 без остатка давайте у нас есть переменная дава первое проверим 2000 и пишем
условие If разделить на 4 равно нулю и А сюда Давайте вставим сразу же условие деления на 100 и остаток от деления на 100 не равно нулю а напишем Print из lip lip - это по-английски високосное а при этом у нас должно быть сразу второе условие вот смотрите А вот сюда если мы а в объём год двухтысячные то он не пройдёт по этому условию потому что первое будет True Вот это условие он проверит будет True на четыре он разделится без остатка но деление от остатка на 100 не будет равным нулю поэтому исполнение уйдёт во второй If
и здесь мы напишем Е 400 ра 0 также год высокосный и всё остальное год не будет являться високосным Давайте проверим что будет когда в переменной будет цифра Да он пишет что год високосным Давайте напишем 1800 год и Давайте напишем какой-нибудь 2004 это тоже Високосный год Ну а 2003 он не будет являться високосным А в принципе мы можем сделать следующим образом можем убрать вот этот ноль и написать следующим образом If E раз на 4 и вот этот ноль убрать вот таким образом И здесь тоже сделать отрицание Давайте проверим год невисокосный 2004 костные двухтысячные високосный И 18800
это не Високосный год Да всё правильно строки Давайте поподробнее Познакомимся с ними А давайте начнём с того как объявляется строка А строка объявляется следующим образом а переменная My string равно Hello world как мы уже делали много раз в двойных кавычках объявляем её также строку можно Объявлять в одинарных кавычках то есть вот это будет абсолютным эквивалентом вот такого Давайте исполним чтобы убедиться что всё работает да При этом бывает иногда что нужно сделать так чтобы мы присвоили переменной какой-то большой текст а делается это следующим образом Аа три двойных кавычки и А давайте сейчас скопирую сюда какой-то большой
текст и Давайте его напечатаем в терминал строки Также можно складывать друг с другом пусть у нас есть First name Эс Last name smit и нам нужно полное имя мы берём и складываем First name п Last name Давайте посмотрим что получилось э а не хватает пробела Ну просто Давайте его сюда добавим Да вот так лучше бывают случаи когда нам нужно узнать длину строки это делается встроенной функции Len 11 символов Давайте проверим чему будет равна длина пустой строки она равна конечно же нулю иногда бывает так что нам нужно из численного типа перевести в строковые это делается с
помощью ключевого слова стр допустим у нас есть число и нам нужно сделать из него строку Давайте проверим тайп объекта Маст My string А класс стр То есть это строка сейчас а нам также Иногда нужно обратно сделать из строки число а это делается с помощью ключевого слова int и сюда а пуль строку 10 type my in и это число а что будет если передать в функцию int какую-то какое-то нерелевантно число например передадим туда программа упадёт с ошибкой value Error и интерпретатор напишет вам что вы туда передали не валидно значение это важно например Когда нам нужно из
инпута из функции inp взять какое-то число например мы делаем сообщение пользователю введите число и Давайте посмотрим что какого типа нам Верт функция так число 10 и нам вернулся класс string мы можем очень легко это сделать превратить его в число просто вот здесь сделаем int функцию int уберём вызов вот этой функции и Давайте посмотрим что получится 10 и всё сейчас у нас в переменной My string находится число Давайте вот такую задачу решим А у нас есть какое-то число очень большое и нам нужно найти количество цифр в этом числе А пусть число будет равно 2 в степени
1000 Какое количество цифр в числе 2 в степени ты А чтобы узнать это это очень легко мы переводим Big integer в строку и то что получилось просто пуля функцию Len Давайте посмотрим сколько получится 302 цифры в числе 2 в степени 1000 что ещ можно делать со есть оператор in который помогает найти вхождение подстроки в строку Например у нас есть строка Hello world и нам нужно определить Входит ли слово hello в строку My string мы пишем Print Hello in my string а вернётся булево значение True или в данный момент True А этот поиск регистра зависимый То
есть если мы ведём Hello с маленькой буквы то будет fse у строк Есть огромное количество методов которые помогают делать нам какой-то функционал например какую-то строку нам нужно написать капсом для этого есть метод uper У нас есть какая-то My string например elis и нам нужно имя написать капсом Print My string и метод uper и обязательно чтобы исполнить этот метод нужно написать открывающуюся и закрывающуюся скобку получилась elis если у нас наоборот строка написана капсом а нам нужно сделать а прописные буквы мы используем метод lower иногда строка к нам приходит с лишними пробелами например вот у нас есть
пробелы в начале Hello world и ещё несколько пробелов в конце нам нужно эти пробелы обрезать для этого есть метод рип Давайте чтобы определить что он работает мы выведем длину строки перед тем как этот метод применим а потом длину строки после применения метода стрип в первом случае длина строки 21 вместе вот с этими пробелами во втором случае 13 заметьте внутренний пробел метод стрип не убирает он убирает только пробелы справа и слева иногда нам нужно заменить какое-то слово или какие-то символы внутри строки а для этого есть метод у строк replace а вмед replace в начале прокиды аргумент
это строка которую нужно заменить Пусть эта строка будет World и заменим её на строку Python исполним Hello Python получилось в строках Иногда нужно определить количество символов А например Давайте определим количество символов а маленькой буквы английской L для этого используется метод Count и в качестве аргумента в этот метод пробрасывается тот символ или сочетание символов которые мы хотим определить количество букв L3 А например сочетание букв L с вместе с буквой R одно Ну и Давайте какой-нибудь символ которого нет в строке ноль иногда пользователь может нам прислать какие-то данные и нам нужно определить в строке находится фры или
нет для этого есть метод из digit наша строка 10 True а допустим мы сюда добавим X и получится а для чего нужен этот метод допустим у нас есть Като какая-то переменная Ир которая получается из инпута если мы сразу же сделаем in и пользователь забьёт туда допустим какое-то строковое значение допустим X то исполнение программы ут с ошибкой вот мы не делаем здесь in Мы сначала проверяем что внутри переменной integer только цифры а потом делаем так что переменная integer становится числом то есть мы засова в функцию int саму переменную Ира и Давайте здесь а в конце выведем
в терминал Type переменной integer А да я забыл двои точи здесь так я вбиваю число допустим это будет 10 да В итоге у нас переменной integer кла int Но если я вобью какую-то строку например X то в итоге вот эта строчка кода не исполнилась и у нас в переменной integer лежит строка очень частая Задача В пайтоне Когда в строку Нужно вставить какие-то данные эта задача называется форматированием допустим у нас есть name El H 25 и написать строку Hello my и My как это делается это делается Вот так перед кавычками первыми ставится буква F и дальше
переменные можно класть в фигурные скобки и я Вот столько вот такой возраст у меня А причём смотрите у меня в рамках строки использовано использованы одинарные кавычки А если я вот здесь поставлю одинарные кавычки то моя программа исполнение моей программы упадёт Поэтому если вы хотите одинарные кавычки поставить то их то всю строку нужно Объявлять в двойных кавычках Давайте посмотрим что вывелось Hello My name is elis And I 25 years Old если мы сюда напишем допустим Саша то строка изменится причём Если у вас есть какие-то численные переменные допустим x = 10 Y = 5 и А вам
нужно вывести допустим чего Чему равно А X + Y и X X Y мы пишем следующее и произведение X у y Давайте посмотрим что получилось Да всё верно Давайте ещё раз А сделаем задачу с как будто бы пользователь вводит нам строковое значение и мы приводим его к числовому и если оно не приводится к числовому то мы пользователю должны сказать что такое-то значение не является цифрами А сделаем это с помощью форматирования вот у нас а значение string Inter Number если My string is digit то а давайте введём переменную My integer и за принти My integer и
иначе строка Давайте поэкспериментировать число 10 а да В итоге исполнение перешло сюда и переменная My integer напечатала если мы какую-то строку введём то мы видим что программа подсказывает нам что это не число небольшая домашка Прочитайте сами про метод строк формат Вам нужно будет загуглить а гуглить можно по-русски если вы знаете английский Хотя бы даже чуть-чуть я советую гуглить сразу же по-английски у вас будет Google выдавать вам какие-то статьи там будут снипет коды по сниппета кода всё всегда понятно что делает тот или иной метод И вам нужно прочитать про форматирование через символ процент и загуглить можно
вот так как показано на слайде скопируйте примеры из статей и как-то Поиграйте с ними что там происходит Итак дальше наше написание кода в браузере закончилось и Мы переезжаем на IDE IDE - Это интегрированная среда разработки это такая программа которая написана специально чтобы вам было удобно писать код я сейчас покажу процесс установки языка и IDE сначала на Windows а потом на Маке заходим на сайт python.org и качаем последнюю стабильную версию языка работать нужно всегда на последней стабильной версии жмём установить обязательно ставим Галку добавить файл Python Pass и нажимаем Install Now ждём установки и нажимаем вот эту
опцию disable Pass L limmit закрываем дальше идём устанавливать P Community Edition Community Edition - это бесплатная версия но в не есть который нам сейчас понадобится обязательно Community Edition находим в списке скачиваем скачалось открываем установщик Я рекомендую использовать именно pch Как по мне это топовая среда разработки я сам работаю в пайчарме только в профессиональной версии установка пошла дожидаемся её запускаем что мы делаем дальше мы идм на диск и создаём папочку Python Projects в этой папочке будут храниться наши проекты на питоне и скачиваем с моего репозитория ссылка Там же в ссылках которые используются в курсе в описании
видео качаем архив и распаковываем его в нашу папку запускаем P arm новый проект указываем папку которую мы только что создали с нашим проектом Python Projects Python begin cse дальше должно быть выбрано создание новой среды разработки используя Virtual enf всё должно быть ровно так как на моём экране это очень важно потому что под каждый проект будет создаваться новая сре Работки это важно чтобы Например у вас не перепутались пакеты или вы могли работать на пайтоне разных версий и так далее и нажимаем Create Create From existing Source всё открылся наш код и мы можем начинать работать на Windows
если вы используете macos как я то также идём на сайт Python org download скачиваем свежий Python всё он скачался открываем папочку так он у меня уже скачен дважды экран инсталляции contin contin contin contin здесь нас система просит ввести пароль вводим пароль и устанавливаем Soft ждём пока загрузчик завершит установку так вот у нас появилась Папочка можно её Закрыть всё Close и удаляем наш установщик дальше идём и скачиваем pycharm Community Edition так это Professional вот Community Edition нажимаем скачать Всё пошло скачивание нажимаем установить переносим в папку applications так всё установка завершилась закрываем открываем pycharm Community Edition нажимаем
Open pycharm загрузился дальше идём в мой github репозиторий и скачиваем Python beginners cse нажимаем download Zip он скачался сразу же распаковываем его я создал специальную папку Python Projects она уже у меня создана Я там работаю И я просто переношу вот эту папку сюда Python beginners cse Main у нас открыт Community Edition нажимаем новый проект дальше выбираем путь к нашей папке Вот она Python C Main Open обязательно выбираем New environment вот у меня здесь так как у меня много версий пайтона установлено он по умолчанию выбрал 3.9 Я хочу 312 это интерпретатор который мы скачали вот только
что у вас скорее всего это интерпретатор будет выбран по умолчанию и нажимаю Create Create From existing sources и всё Мой проект загрузился а в нём сейчас нужно работать Пойдёмте к следующему модулю Итак P Charm открыт А я сразу же поставил чтобы масштаб текста был удобный для вас и вы могли это смотреть где-нибудь на мобиле Что из себя представляет pchar а слева у нас расположена структура папок здесь их 30 столько же сколько у нас модулей в курсе а здесь есть папка VF где лежит Virtual environment пайтона А эту папку нам трогать не надо Ну и какие-то
служебные файлы расположены А они тоже вас не должны беспокоить А мы сейчас на седьмой теме списке весь код который я расскажу в рамках модуля списки lists есть файлах но я советую использовать их эти файлы позже потому что лучше писать вместе со мной Я создам новый файл нажимаете делаете двойной Клик Python Я назову его у Ну что списки поехали Что такое списки списки - это структура которые используются для хранения упорядоченных последовательностей А давайте создадим My L А давайте нормально назовём переменную FR и создадим список фруктов Apple бана и и выведем этот список чтобы запустить программу в
пайчарме вот здесь есть такая Зелёная клавиша она есть вот здесь Run L и справа более бледным шрифтом расположен Hot на Маке это Ctrl R на Windows Скорее всего будет другой я запускаю поке но можно нажимать по нажатию кнопки нажимаем кнопку и наш файл исполнился и вывел список Apple Banana Cherry списки можно создавать по-другому А например через ключевое слово лист исполняем функцию лист и печатаем получится просто пустой список Да всё видим он показался в консоли Давайте вернём список frs у списка есть длина чтобы узнать длину списка нужно вызвать встроенную функцию Len и передать туда список он
равен три по количеству элементов в списке В списке а могут лежать не только однородные данные например сейчас вот здесь лежат только строки А в списке могут быть как строки так и одновременно инты Одновременно флоты одновременно Бул какие-то значения одновременно другие списки и так далее То есть Python позволяет это делать но так лучше не делать лучше держать в списке какой-то однородный тип данных Да исполнили код получили в терминале а наш список списки можно сравнивать друг с другом Например у нас есть Вот такой список Давайте создам mylist 2 который будет равен 1 3 2 и список 3
который такой же как список один Давайте сравним список один и список д они неравны потому что как я уже сказал список - это упорядоченная последовательность и если второй элемент списка он равен двум а второй элемент списка д равен Тём то списки не равны а Давайте сравним список оди и список три мы получили True списке можно передавать функцию Bull чтобы использовать их в выражениях с If А например бу отпуск пустого списка будет fse а Бул от списка в котором есть хотя бы один элемент и это даже может быть ноль будет True выводим видим false True Когда
у нас есть список мы можем посмотреть содержится ли то или иное значение в списке это делаем с помощью ключевого слова in исполняем получаем True Давайте попробуем найти в списке какой-то другой фрукт получаем на банана True на watermelon false в списке Также можно инициировать по-другому допустим у нас есть какие-то переменные с строками и нам нужно создать из них список frs мы делаем вот так просто перечисляем переменные в квадратных скобках и Давайте заприте их всё смотрим в терминал да получилось именно то что мы ожидали списки можно составлять из строк допустим у нас есть переменная где лежит строка
Hello и мы делаем следующим образом My list list и в функцию list передаём переменную Word Прим mylist и видим каждую букву каждый символ из строки Hello Python вывел в отдельный элемент списка списки Также можно складывать друг с другом пусть у нас есть переменная My list 1 где лежат список 1 2 3 и лист 2 где лежат список 4 5 6 давайте сделаем mylist 3 который равен mylist 1 П mylist 2 нтим получаем список от одного до шести у списков есть определённое количество методов как и у строк Давайте опять же возьмём список с фруктами и допустим
нам в него нужно добавить ещё один фрукт мы воспользуемся методом upend и добавим watermelon прин фрукты Да видим н находится в нашем списке Обратите внимание что изменился изначальный список который мы инициировали в первой строке это очень отличает списки от строк Например если мы возьмём строки и попробуем сделать следу мы заменим слово World словом Python Давайте заприте My string и в следующей строке заприте New string первоначальный объект My string первоначальная переменная осталась неизменной Вот этот repl который происходит здесь был присвоен в Новую переменную New string со списками же всё происходит по-другому изменения идут в первоначальной переменной
следующий метод который используется очень часто это метод po Давайте присвой фрукт вот такое значение и заприте переменную FR и frs а Обратите внимание метод Pop взял последний элемент списка удалил его из списка и присвоил в переменную В итоге наш список получился из двух элементов а строка Cherry была присвоена переменной FR мы можем не присваивать то что вернул метод Pop а просто написать Вот так вот и первоначальный список также трансформируется а допустим у нас есть ещё один список frs 2 в котором перечислены другие фрукты И нам нужно сделать так чтобы добавить второй список к первому а
для этого есть метод extend FR extend frs 2 и Давайте за принти Fruits Да список получился уже из пяти элементов и мы добавили второй список к первому иногда бывает такая задача что список нужно развернуть И для этого есть метод reverse Обратите внимание А мы трансформировались список Так что он начинается с строки Cherry и заканчивается строкой Apple также частотная задача когда список нужно отсортировать Давайте создадим список с рандомными значениями My list sort и Print My list значения отсортированы по возрастанию если нам нужно отсортировать список по убыванию то мы передаём аргумент reverse True функцию sort и получаем
сортировку по убыванию также Бывает такое что к нам прихо какая-то строка и нам нужно создать список из слов разделённых пробелов из этой строки это делается очень легко с помощью строкового метода слит mylist равно My string Split а Сплит - это разделить и нам нужно аргументом передать разделитель в данном случае наш разделитель - это пробе и Прим My у нас получился список из четырёх слов наоборот собрать из списка строку со словами разделённым пробелами можно следующим образом Давайте создадим переменную Joint string mylist и дальше следующем нам нужно разделитель наш пробел Join и сюда передаём My list и
Давайте запри Joint string Да строка собралась заново My name is Al списки можно передавать в различные встроенные функции которые работают с числами строками и так далее но нам сейчас более наглядно можно посмотреть их работу на числах Давайте создадим Рандомный список из интов узнаем Какой максимальный элемент в списке 14 Также можно узнать минимальный элемент и даже сумму элементов минимальный элемент единичка сумма элементов 48 что будет Допустим если мы хотим узнать сумму вот в таком списке в котором есть какая-то строка что будет ну собственно будет ничего наш код упадёт с ошибкой потому что int и строка не
складываются кстати Python чаще всего используется для бэнда для того чтобы стать энд разработчиком на Python нужно намного больше чем изучить синтак я написал roadmap потому как стать энд разработчиком на Python почти без вложений денег со всеми ссылками на бесплатные материалы и последовательностью что учить и в каком порядке главное в нём что я не только Рассказываю что надо изучить и сделать но и то что не надо учить и тратить на это время ссылка на гайд в моём Telegram канале будет в описании Ну и если окажешься там подпишись погнали дальше к курсу следующая тема индексы и срезы
программисты считают элементы с нуля а не с единицы как в обычной жизни зачем это делается это достаточно тонкий вопрос но он помогает программистом работать эффективней вот смотрите помните когда мы решали задачу с домами давайте я напомню и покажу код код получился вот таким имы прибавляли то отнимали единицу причём эта единица очень путает нас вообще непонятно код не воспринимается интуитивным Посмотрите на вот эти два дома Вот первый дом из нашей домашней задачи про квартиры нумерация и подъезда начинается с единицы и квартира начинается с едини и на второй дом Обратите внимание в этом доме живут программисты нумерация
здесь квартир начинается с нуля и нумерация подъездов начинается с нуля также Обратите внимание что если здесь нумерация этажей начинается с первого второй третье четвёртый и пяты то в доме для программистов нумерация будет начинаться с нулевого этажа и тогда задача для нахождения этажа и подъезда код для этой задачи становится очень лёгким допустим нам нужно найти а квартиру 19 квартира 19 будет располагаться на четвёртом этаже последнем доме в обычном доме Это был бы пятый этаж и в нулевом подъезде а Давайте попробуем это сделать Мы просто убираем все вот эти единицы которые не прибавляют ясности нашего кода а
то что не прибавляет ясности для нашего кода нужно выкидывать и Давайте попробуем а получилось что подъезд ноль этаж 4 допустим квартира 99 расположена в последнем четвёртом подъезде и на этаже четыре то есть вот она Давайте найдём квартиру а 80 Она расположена вот здесь вот это четвёртый подъезд первый этаж Всё верно только этаж нулевой не первый и именно для такого удобства чтобы не маяться с вот этими единичка программисты считают с нуля Так давайте на создадим опять-таки э файл Lesson Pie в папке и А сделаем вот такой Лист с фруктами и попробуем взять элемент с индексом но
синтаксис у индексов это квадратные скобки рядом со списком или какой-то другой последовательности с которой вместе с которой можно использовать индексы элемент Но - это Apple индексы считаются по следующим прави допустим у нас есть строка Hell буква H будет иметь нулевой индекс буква и первые второй третья четвёртая а также можно использовать отрицательные значения то есть возможный диапазон значений от минус длины строки до длины строки -1 то есть от -5 до Четы Давайте попробуем это сделать вот у нас здесь четыре элемента а Apple Можно вызвать по индексу ноль или по индексу ми4 Всё верно Давайте какие-то другие
значение достанем из индексов допустим напечатаем что у нас находится в индекс 3 это Мелон но элемент но 1 2 и 3 Что будет если мы вызовем элемент с индексом 4 которого здесь нет Интер скажем либо если мы вызовем -5 интерпретатор также ренет ошибку как ещё можно использовать индексы мы можем делать Вот такое присвоение как в переменную в список допустим здесь у нас будет pineapple Давайте запри вместо элемента App у нас там лежит P Apple А с помощью индексов Также можно сделать такие вот перестановки элементах в одном списке например Нам нужно поменять местами нулевой элемент и
третие мы напишем следующим образом всё крайние элементы были заменены средние элементы так и остались на месте следующее слайсы Для чего нужны слайсы допустим у нас есть вот такой вот лист с числами и мы хотим выбрать первые Пять элементов мы записываем следующим образом Пять элементов выбраны то есть вернулся список из первых пяти элементов изначальной последовательности их можно присвоить в новый список и этот список окажется в новой переменной самое главное что нужно знать про слайсы это то что слайс - это всегда полуоткрытый интервал то есть первое значение которое вы указали в слайс будет возвращено это ноль который
находится вот здесь а третье значение - это тройка не будет возвращена её не будет в конечной выборке например чтобы нам в слайсера значение полного списка нужно указать 10 в конце потому что у нас тут 10 элементов либо можно записать следующим образом вместо здесь написать Вот также мы видим нам вернулся полный список А вот эту запись вообще можно если у вас слайс начинается с нуля то Ноль можно опустить он подставит автоматически также автоматически подставит длина списка То есть в принципе можно записать Вот так и нам также вернулся полный список либо если мы хотим допустим первые Пять
элементов То слайс будет вот таким слайсы можно сделать с шагом Например у нас есть слайс 010 и мы хотим каждый второй элемент в нём мы ставим ещё одну две точи и Число два и в итоговом наборе у нас получилось 0 2 4 68 Ну и эта запись конечно же эквивалентно Вот такой у на получилась та же выборка важно знать что слайсы менее требовательны к индексом внутри То есть вы допустим можете сделать вот так и вернётся пустой список Либо мы можем указать здесь какое-то число индекса которого нет наме 20 и нам просто вернулся полный список для
слайсов Также можно использовать значения например сделать вот так Но тогда у слайсов начинает быть очень большая когнитивная сложность Я рекомендую использовать только положительные значения в слайса так будет гораздо легче а слайсы также можно разворачивать в обратном порядке для этого нужно применить вот такую запись исполняем код и как мы видим Мы просто развернули список всё что мы делали со слайдами можно делать и со строками и Давайте попробуем напечатать допустим с пятого символа до самого конца А мы получили всё что после запятой включительно Допустим можно сделать вот так и напечатать каждую вторую букву частенько Python разработчиков на
собеседовании задают такой вопрос Расскажите о трёх способах которыми можно развернуть лист собственно Какие способы первый способ мы делали его только что это использовать вот такой слайс а мы получаем развёрнутый лист второй способ это использовать функцию reverse и Давайте посмотрим что получится Да всё верно получилось опять-таки развёрнутый лист сделать и третий способ можно использовать встроенную функцию rever и туда передам Давайте посмотрим обект какого ти и за принти его А получился вот такой класс list reverse iterator А чтобы из него сделать лист нужно вот этот вызов обернуть ещё функцию лист и тогда получится то что нам нужно
и это третий способ развернуть лист следующая тема - это цикл 4 цикл 4 возможно одна из самых частотных конструкций которые вы будете использовать в своём коде допустим у нас есть Вот такой список с именами файлов и нам нужно обойти каждый из них и что-то сделать с ними А например давайте для простоты сейчас выведем их в терминал для этого мы пишем следующую конструкцию for F name Обратите внимание F - это другая переменная она отличается от filen по F name ines дальше мы отделяем внизу блок кода четырьмя пробелами или табам и пишем Print Давайте запустим был выведен
в терминал каждое исполнение цикла называется его итераций количество итераций цикла равно количеству элементов в какой-то коллекции которую вы перебите очень важно что переменная F name меняется каждый раз с каждой итерации цикла цикл Можно также использовать вместе со строками Например у нас есть переменная gre приветствие Давайте заприте каждый символ переменной greeting for char in greeting и Print char а смотрим в консоль а интерпретатор вывел каждый символ а строки Hello world в консоль естественно внутри итерации можно сделать гораздо больше вещей тем чем просто принти каждый символ Давайте Сосчитай количество букв O в строке Hello world давайте сделаем
переменную Count O она равна 0 If char равно O Count O равно Count + 1 Ну и Давайте внутри блока If ещё заприте Чар чтобы убедиться что туда попали только буквы и в конце C за принти запускаем вот два раза у нас написала буква О то есть два раза в этот блок зашло исполнение кода и в конце переменная равняется двое Обратите внимание Вот на эту конструкцию эта конструкция ну не сказать что она выглядит очень удобно а в питоне есть а синтаксический сахар для этой конструкции синтаксический сахар - это какая-то конструкция в рамках языка которая помогает
записывать какие-то частотные вещи быстрее и А в питоне есть такая конструкция а то есть если нам нужно прибавить что-то к переменной уже существующим то мы пишем вот так плюс равно и а то что нам нужно прибавить к переменной вот получится то же самое мы исполнили код заново эта конструкция выглядит вот так для разных действий вверху запись без синтаксического сахара внизу с синтаксическим сахаром эта конструкция очень помогает сократить код в программе сделать его более читабельный циклы могут быть вложенными друг в друга Например у нас есть вот такая переменная а список студентов мы написали цикл верхнеуровневый и
внутри этого цикла Давайте за принти Student и внутри можно написать каждый символ в переменной Student исполняем этот код Нам нужен этот пример чтобы понять Как исполняется программа в рамках двух циклов а сначала придется эс то есть мы сначала вот здесь затем Эс исполняется внутренний цикл с переменной в которой значение Эс и выводится каждая буква затем цикл после того как он закончился вот этот внутренний цикл исполнение переходит к верхнему циклу опять и у нас переменная Боб и её буквы и так далее вообще вложенность для циклов это опасная вещь если мы сделаем какой-нибудь трёхэтажный цикл и что-то
здесь ещё какой-то ещё фор здесь это будет не читаемым такая негласная договорённость что максимум можно сделать какой-то один вложенный цикл Но дальше программу нужно как-то дробить вместе с циклами используется два очень важных ключевых слова это и bre допустим у нас есть Вот такой список и нам нужно сделать следующее если число в списке нечётное то мы выводим его в терминал Если нет то ничего не делаем Давайте запишем это если число чётное то есть остаток отделения на дра то мы пропустим цикл и здесь напишем нам этот пример не лучше всего написан но он очень показателен чтобы понять
вам как работает конструкция с ключевым словом Давайте запустим её смотрите что происходит здесь на каждой итерации цикла если это условие исполняется То есть у нас чётное число то слово contin возвращает нас к циклу for обратно к следующей и переносит к следующей итерации если мы в это условие не зашли то исполнение продолжается вот здесь и у нас число то есть нечётное которое не удовлетворяет этому условию выводится в терминал Это пример использования ключевого слова как используется ключевое слово допустим нам нужно если просто остановить цикл и не исполнять его дальше а все числа которые меньше де мы затим
мы делаем следующее и нам равно 10 Б И сюда затим нам при слове Брей исполнение программы сразу же выходит из цикла Давайте посмотрим в терминале показались числа до де то есть при десятке когда была десятка исполнение зашло сюда Это было True отработал ключевое слово Брей и программа просто вышла из цикла и продолжила там своё исполнение дальше функция Range функция Range генерирует последовательности чисел как это происходит Давайте создадим переменную Range object и туда допустим Range 10 и запри Range object А у нас запла Вот такая странная конструкция то есть Range от нуля до де чтобы нам
иметь доступ непосредственно к числам из Range нам нужно обернуть допустим его в лист вот у нас получилось а получился лист из вот этого Range обк А причём Обратите внимание Как как и в слайса это полуоткрытый интервал то есть последнее значение не входит в финальную совокупность элементов последовательность Можно также начать с какого-то числа не только закончить каким-то числом То есть например Давайте 11 10 сделаем и Print list My Range вот Обратите внимание единичка которую мы передавали сюда входит в лист Ну и собственно десятка полуоткрытый интервал не входит у Range может быть шаг какой-то как и со
слайсами то есть сюда вошло каждое второе число каждое нечётное число последовательность может быть убывающей то есть вот сюда мы передаём 10 1 и шаг ми1 Обратите внимание что так же как и с рейджем с положительным шагом это полуоткрытый интервал и единичка которая идёт вот здесь не вошла в финальный ренж допустим у нас есть вот такая последовательность из чисел и нам нужно к каждому числу прибавить единичку и изменить список а Давайте попробуем это сделать в лоб а что получится получилось изначальный список это происходит из-за того что инто воя переменная не может меняться в пайтоне мы попозже
поговорим Почему устроено так но тип переменный список может изменяться по индексу и нам просто нужно изменить Каждый элемент по индексу как это сделать мы сделаем следующим образом обычно переменную которая обозначается буков кой I английской это переменная индекс дальше мы сюда следующую конструкцию используем Range а Range функцию Range мы аргументам передаём длину нашего массива Давайте просто заприте что у нас в переменной окажется это индексы нашего массива вот их тут как и количество наших элементов и мы сделаем следующим образом Numbers и плюс равно 1 и заприте финальный Numbers А всё получилось у нас на единичку изменилось значение
каждого элемента Давайте решим такую задачу А вот у нас есть такая строка и нам нужно определить количество букв о а также их индексы что мы сделаем мы создадим list indexes где будет в итоге храниться индексы А наших э букв O создадим переменную Count которая будет равна нулю и сделаем следующим образом По I inrange Len тин если переменная гритинг с этим индексом То есть буква с этим индексом будет равна букве то мы во-первых изменяем переменную каут на один а во-вторых в нашу переменную indexes кладём этот индекс и Давайте затим в конце и ind всего букв и
лежат они по индексам 4 и8 то есть вот это 0 1 2 3 4 Ну и здесь 8 в модуле 4 есть вот такое домашнее задание обязательно Сделайте его вам нужно зан таблицу умножения построчно Сделайте это домашнее задание используя циклы конечно же функции мы пользуемся функциями с самого начала нашего курса потому что например Print - это функция Но это встроенная функция в язык Python а нам нужно научиться писать свои Что такое функция функция - это блок кода для многократного повторения Представьте что у нас есть вот такой код допустим у нас есть и там у нас
есть числа и нам нужно высчитать среднее в этом списке как мы найдём его мы найдём его следующим образом мы сумму элементов этого списка разделим на длину этого списка и давайте затим что у нас получится средний элемент равен т и допустим у нас есть две последовательности у которых нужно высчитать то же самое допустим у нас есть второй список список два и мы также высчитывают одинаковая мы просто передаём туда разные аргументы А в программировании есть правило Dry расшифровывается оно как Don't repeat Yourself не повторяй себя хороший код написан Понятно Так что его может прочитать другой программист а
также хороший код не повторяет себя и чтобы не повторять себя мы используем функции Давайте напишем функцию которая находит среднее вот этот массив оставим точнее так оставим вот этот массив И вот этот всё остальное сотрём и напишем функцию А как пишется функция функции пишутся с помощью ключевого слова Def у функции должно быть какое-то осмысленное название например Давайте назовём её find функцию в нашем случае должен заходить аргумент это какая-то последовательность Давайте назовём её Numbers А дальше ставим здесь двоеточие и здесь вычисляем среднее Давайте его вычислим также как вычисляли до этого мы берм Numbers и делим его на
L Numbers Давайте исполним эту функцию и сделаем следующим образом приво в переменную average 1 исполнение функции find average с со списком Numbers 1 и зам average 1 исполняем мы получили N мы сделали ошибку мы не вернули из функции Вот это значение Что значит вообще возвращать возвращайте Это значит что например при присвоении в другую переменную значени которое мы вычисляли в этой функции мы возвратим собственно то значение которое мы вычисляли и для возвращения из функции есть слово дава получилось что такое N мы получили N Когда у нас не было вот этой строки функция когда нет ключевого слова
возвращает ничего собственно N - это ничего переменную n можно вот следующим образом допустим у нас есть и вот мы присвоили N это одно из ключевых слов в пайне функции без ключевого слова быт они редкие так скажем функции в Python ещё отделяются От остального кода а двумя строками Всё у нас есть функция find average мы можем передать сюда м там вычислить переменную average 2 которая будет find average и список Numbers 2 и Давайте вот здесь через запятую их вычислим да 3 080 давайте сделаем другую функцию которая сочетает количество гласных в строке А давайте назовём эту функцию
а Count wows сюда передаётся какая-то строка Давайте выпишем э вот эти гласные в какую-то константу их уберём константы пишутся капсом в пайтоне и у нас есть в английском языке Вот такие гласные да стоит не забывать что в пайтоне всё регистр зависимым и прописная буква а и заглавная буква а - это разные буквы а переменная C у нас будет которая равна нулю которая будет подсчитывать а значение и мы пишем for char in string If char in wows так вот Я вот здесь ошибся и не записал букву R и в Count прибавляем единичку и в конце делаем
Выходим из этих блоков Они под отступами просто возвращаем C и давайте сделаем и допустим Вот в такой строке считаем исполняем в первой строке три гласных вот мы их видим и и здесь 10 гласных если ой 11 гласных если посчитать то именно так окажется иногда нам нужно сделать какую-то заглушку например чтобы функция ничего не исполняла давайте сделаем это вот у нас функция мы объявим её ничего не будем передавать в качестве аргументов и здесь напишем Давайте исполним её мы хотели сделать функцию которая ничего не делает но она в итоге запт Вот это значение Да функции без аргументов
вызываются просто синтаксис мы делаем две скобки обычно чтобы функция ничего не делала мы передаём туда ключевое слово пас и мы ничего не увидим при исполнении программы А такие функции заглушки иногда нужны нам чтобы там мы пишем какой-то блок кода просто раскидали название функций ещё не написали их и просто паса их закрыли чтобы они просто были у нас в кодовой базе у функции может быть больше одного аргумента И когда у нас больше одного аргумента то у нас возникает Вот такая проблема смотрите Давайте пусть у нас будет функция form Date А мы будем туда принимать день и
месяц и возвращать вот такую строку с форматированием и Давайте напишем обязательно Когда вы у вас будет какой-то общий например проект то кто-нибудь возьмёт и перепутаешь и сделает вот так вот в день Он передаст месяц А в месяц передаст число пайчарм в нашем случае подсвечивает агу Это делат не все которыми можно пользоваться вот и получится что вторая строка плохая там может также упасть ошибка Если там в процессе исполнения как-то там с типами переменных возникнет ошибка поэтому что мы делаем вообще мы делаем две вещи чтобы так было нельзя перепутать аргумен вопервых прова ти В пайтоне прописываются следующим
образом вот смотрите у нас в переменную Day по-любому зайдёт число и мы вот таким синтаксисом говорим интерпретатору что сюда заходит число А сюда заходит строка и тогда при вызове вот следующим образом если мы перепутали переменные то IDE нам подсказывает что мы ожидали тип int но получили тип string также во всех вообще проектах в которых я работаю мы делаем следующую гигиену мы прямо прописываем аргументы внутри функции в следующем образом Day 15 Mon oct и сразу же вызов этой функции очень Да нужно Print чтобы это исполнилось причём мы месяц можем передавать первым а день вторым и функция
исполнится одинаково в пайтоне также есть конструкция которая прямо заставляет программиста прописывать аргументы вот таким образом что а они прописываются явно А в пайтоне есть тако докумен он называется Zen of Python и одно из первых правил там явное лучше неявного мы ставим перед аргументами вот такую звёздочку и это значит что мы функцию просто не сможем вызвать вот таким вот образом мы не сможем передать туда переменные без наименования и в процессе выполнения курса в каждой функции я буду ставить вот эту звёздочку и являть типы переменных а также тип возвращаемого значения тип возвращаемого значения пишется следующим образом перед
двоеточием у функции ставится стрелочка и сюда вбивается тип возвращаемого значения То есть если я здесь например верну какое-то число то IDE опять-таки мне показывает что ожидается тип string но возвращается in функция кстати ВС равно исполнится Давайте здесь напишем что у нас это Day это month функция всё равно используется вот у нас вернулась единичка но а это скорее не для интерпретатора а для другого программиста чтобы он понимал что за тип вернётся ему при вызове также в функции можно Объявлять дефолтные аргументы Например у нас есть вот такая функция А Custom greeting и она принимает э на вход
следующее будет типа string и типа string и мы сюда передаём дефолтный аргумент Пусть дефолтный аргумент будет и нам возвратиться STR делаем F переменная можно будет вызвать следующим образом name А пусть будет дн и А давайте а тин передадим Good morning но вызывать также мы можем вот без этой переменной гритинг и в первом случае Good morning joh во втором случае Hello joh следующая тема - это область видимости переменных Давайте напишем вот такую функцию и здесь объявим переменную Local War пусть её значение будет Вот такой равно вот такой [музыка] строке Давайте заприте эту переменную и вызовем а
функцию функция запри Вот эту локальную переменную если мы прямо сейчас вне вызова функции попытаемся вызвать вот эту локальную переменную то наш код упадёт ошибкой что Local War not Def то есть не определена Local War не определена это переменная которая определена в теле функции и вне этого тела мы не можем её использовать если мы говорим допустим про цикл и сделаем вот такой простой Цикл А там что-то здесь сделаем не знаю давайте запри и Давайте цикл поменьше сделаем из трёх элементов и вот здесь за принти и это допустимая конструкция но лучше её никогда не использовать потому что
вот это и всегда будет равно последнему элементу вот в этом рендже то есть это и будет равно двум в данном нашем примере вот переменная 2 запри дважды если мы берём опять-таки вернёмся к вот такой функции а так сейчас я сделаю заглушкой вот у нас есть какая-то переменная которая определена здесь а переменная вне Скопа функции и Давайте её здесь заприте это допустимо Давайте вызовем функцию то есть всё нормально она запри а но если мы возьмём допустим и пере присвоить очень аккуратным у нас В итоге запри Вот это значение Вот это значение а это Значение было отброшены
Если мы снова вызовем после функции myfunction зам то мы увидим следующее что значение Несмотря на то что оно было переде внутри функции оно осталось неизменным вне скоупа этой функции Поэтому с этим всегда стоит быть осторожным вообще стараться Вот таких переменных не Объявлять которые как-то Бут меняться вообще это нормально только для использования констант например давайте сделаем какую-то функцию которая вычитает разницу между комфортной температурой и температурой воздуха в какой-нибудь комнате например и сделаем тогда константу а и напишем функцию следующую и вернём просто разница между comfortable Temp ми Temp так здесь я ошибся допустим 20 и разница оказалась
п то есть использование констант в качестве Вот таких глобальных переменных которые существуют на уровне там пакета или модуля это нормально но использование каких-то других переменных приведёт скорее всего к какой-то ошибке Поэтому лучше это не делать мы это делаем но в рамках курса в рамках нормальной программы лучше так не делать никогда иначе будет Вот это смешение и вы не Определите где у вас локальная область видимости А где глобальная и с переменными что-то пойдёт не так но бывают кейсы когда какой-то функции нужно изменить глобальную переменную в пайне есть для этого синтаксис Но это абсолютное зло но я
вам так или иначе его покажу потому что вы можете где-то это увидеть Давайте вот есть глобальная переменная которая существует вне скоупа А И у нас есть какая-нибудь функция которая должна переопределить значение глобальной переменной А у нас есть ключевое слово Global GL glob War рано Давайте здесь напишем что А так это должно быть следующим образом сделано вот мы определили что переменная является глобальный Так давайте переименую эту переменную я сделал там ошибку А мы объявили что переменная является глобальной и вот здесь её определили и Давайте заприте Global War вызовем функцию myfunction и опять заприте Global War до
вызова функции у нас значение Вот это и после вызова функции у нас переопределение внутри функции но делать такого не стоит всегда существуют пути по которым можно перестроить программу чтобы этого избежать вне скоупа функций используйте только константы давайте для закрепления вот этой темы с скопом и с константами напишем такое полезное упражнение а допустим у нас есть какой-то персонаж в мо RPG игре и нам нужно написать функцию которая определяет Нужно ли увеличивать уровень персонажа набрал ли он достаточное количество эксе уровень можно оставить тем же А давайте определим такую константу она называется default level Experience и пусть она
будет равна 200 и у нас функция А нужно ли поднимать level назовём её Is leveled Up функция будет в качестве аргументов принимать следующее а значение текущего уровня типом которого является int и значение уже заработанного опыта который также будет интом и возвратим мы Бул то есть нужно поднимать или не нужно это бу True или fse А exper будет exp п Experience Давайте сразу же определим константу level Up которую мы вернём она будет изначально равна false и вот здесь мы пишем условие If Total Experience больше либо равен чем default level Experience level Up R и вернём level
Up Давайте вот такой йс сделаем что curent level exp current Experience 150 G 60 и Давайте вот такой кейс будет curent Experience 10 и G 60 в первом случае должно вернуться True и во втором случае false Да кстати я вам не рассказывал о комментариях а в коде Можно оставлять комментарии они делаются с помощью вот такого хэштега Обычно по правилам Нам нужно два пробела после кода и мы можем в тоже в той же строке комментировать код либо можно прямо сначала строки оставлять какие-то комментарии вот Давайте исполним наш код Ну и нам вернулась в первом случае и
во втором случае вот это использования констант в коде и следующая тема - это цикл while цикл while используется не так часто как цикл for В чём между ними различие между двумя этими циклами цикл for повторяется определённое количество раз чаще всего количество его итерации равно количеству элементов коллекции которые мы перебираем цикл Wi может повторяться неопределённое количество раз цикл - это цикл который тся По условию чаще всего его работа связана с какими-то кантера то есть подсчётов каких-то элементов где-то По какому-то условию а давайте сделаем переменную Counter которое равно о и синтаксис такой мы пишем while Counter меньше
либо равно пти А давайте здесь заприте Чему равен наш каунтер и будем прибавлять на каждой итерации цикла к каунтер единичку Давайте исполним этот код в первой итерации Мы зашли каунтер равен единички он написал прибавил к нему единичку случился вторая итерация третья четвёртая Пятая и после пятой итерации каунтер был равен шести и Вот это сравнение дало fse и следующая итерация цикла уже не исполнилась также часто кейс использование цикла while - это когда у нас есть какой-то лист и нам из листа нужно удалять элементы while My list То есть пока лист в листе есть хотя бы один
элемент элемент равно mylist Pop Pop удаляет последний элемент из списка Давайте заприте его и исполним а и в конце Давайте после исполнения Да мы видим что элемент 2 1 0 Давайте в конце убедимся что лист пустой и вот последний Принт - это наш лист циклы цикл while можно сделать бесконечным просто сделав вот такую запись while True и Давайте здесь напишем что это бесконечный loop А И вот Обратите внимание он начинает принти Infinite loop просто бесконечно это будет пока мы не рвём программу давайте сделаем так чтобы исполнение программы останавливал пользователь для этого мы сделаем цикл while
но приём его с ключевым словом Break Давайте вот у нас будет переменная Answer она будет Input мы просим пользователя ввести число Но если Answer будет равно qu то мы сделаем Break А здесь напишем следующее запускаем эту программу А давайте введём число 10 10 а и я наберу quit и программа завершилась то есть исполнение пришло сюда вот это условие дало True и отработала ключевое слово Брей давайте сделаем небольшую практику по уже изученному материалу и для того чтобы сделать практику мы сделаем симуляцию игры азартного игрока по стратегии martingale Что такое стратегия martingale у неё есть даже целая
своя статья на Википедии А здесь описывается её суть я расскажу коротко своими словами У нас есть рулетка в рулетке есть ставка на Красное и чёрное если мы Ставим на красное и выигрываем то наша ставка удваивается и уже давно-давно игроки придумали такую стратегию А что если мы будем при выигрыше просто забирать его а при проигрыше удваивать ставку то есть мы начинаем с минимальной позволено ставки в казино если мы выигрываем мы забираем выигрыш и ставим снова минимальную ставку если мы проигрываем то мы удваивает смотрите у нас есть допустим ставка оди мы проиграем ставим два если выигрываем то
мы уже выи и это больше чем Наши затраты то есть мы потратили 1 ид на ставки выиграли четы То есть три против чех э стратегия конечно же не работает но на этой стратегии замешано много скама всякие ставки на спорт какие-то пирамиды используют объяснение что у них вот эта стратегия она выигрывает и неподготовленный человек это не интуитивно что эта стратегия проигрывает и мы просто симуру е с помощью языка Python Итак давайте сначала напишем мы будем писать не на рулетке эту стратегию А на кидани монетки кидание монетки - это даже выгоднее для игрока потому что в рулетке
У тебя есть зеро не Красное и не Чёрное что уменьшает твоё матожидание кидание монетки у него матожидание единица и мы просто покажем что даже с мато ожиданием единица стратегия не работает орл и решка по-русски называется по-английски это Heads and сделаем две и Давайте список ещё сделаем тоже константу coint values Heads А дальше напишем такую функцию которая будет определять бросок монетки Flip Coin чтобы написать функцию Flip нам нужно воспользоваться модулем Random из стандартной библиотеки пайтона Как импортировать модули и как устанавливать библиотеки мы поговорим чуть позже здесь Давайте просто напишем Random А я вас научу позже импортировать
всё и из библиотеки Random мы воспользуемся такой функцией как Return Random Choice а функция Choice просто возвращает случайные элементы списка и передадим туда Coin values Давайте попробуем посилити напишем функцию которая симулирует работу стратегии martingale прямо до конца денег у игрока и пусть эта функция значение in это будет количество шагов до проигрыша количество бросков монетки а что мы передадим функцию А мы передадим стартовые средства игрока а минимальную ставку и максимальную ставку максимальная ставка важна во всяком казино она есть например вы не сможете ни в какое казино прийти и поставить там несколько миллиардов долларов на Чёрное потому
что в случае вашего выигрыша казино просто исчезнет оно перестанет существовать А давайте сразу же переменную количество шагов до поражения оно равно ноль пока что А сделаем переменную текущие средства игрока оно равно в начальном этапе стартовым средством и сделаем такую переменную current Bet а она равна изначально минимальной ставке и дальше мы пишем цикл while А пока текущие средства больше нуля мы а делаем следующее Аа мы сразу же переменную Step to Lose прибавляем единичку потому что у нас началась игра как бы ещё один шажок к полному проигрышу игрок уже прол текущие средства из текущих средств вычитаем текущую
ставку и кидаем монетку в переменную Flip Coin value присваиваем выполнение функции Flip и дальше у нас развилка идт если давайте для простоты мы будем считать что игрок всегда ставит на Heads если у нас значение Flip Coin value равно Heads А то мы фиксируем выигрыш текущая ставка удваивается текущие средства становятся больше Вот на этот размер выигрыша и текущая ставка становится равна минимальной ставке если мы проигрываем то что у нас происходит текущую ставку нам нужно поднять вдвое мы удваивать А например если у нас текущая ставка больше максимальной ставки то так Макбет то мы сразу же делаем так
что мы сразу же откаты как бы к самому началу и у нас текущая ставка становится минимальной и ещё одна проверка что если у нас текущая ставка больше текущих средств пользователя то текущая ставка становится равной Ну мы сразу же поставим максимум поставим сразу же все свои деньги Нан Вот вот эти ифы будут исполняться последовательно но они не противоречат друг другу и там не будет кейсов Когда что-то пойдёт не так и Давайте после того как мы выйдем из цикла мы просто возвратим количество шагов до поражения вот нам нужно сейчас как-то симулировать одну игру мартингейл и Давайте чтобы
сделать всё хорошо мы тут принты раскидаем Вот давайте мы так как итерации много будет и чтобы у нас не наслаивать принты друг на друга Мы вот здесь а-а сделаем вот такое равно чтобы мы видели каждый Цикл А нашей игры А давайте сюда а заприте а текущие а средства А вот смотрите А вот эта запись А вот я имя переменной сюда вводил у пайтона есть очень удобное средство строках мы можем вот здесь равно написать и это эквивалентно он сразу же переменную он подпишет её и зант и здесь же мы в этом же логи выведем текущую ставку
вот сюда мы напишем также Давайте строкой это сделаем а нет нам не нужно знать Flip потому что Вот здесь мы затим размер выигрыша А вот здесь просто запри вот в этом кейсе затим всё этих принтов нам хватит чтобы симулировать игру Вот давайте простоты 100 минимальная ставка один и максимальная ставка пусть будет 100 и давайте сделаем симуляцию вот мы сделали симуляцию А игроку понадобилось всего лишь 63 шага чтобы проиграть всё это цифру мы получили вот отсюда вот и Sprint Play martingale потому что мы здесь возвращаем количество шагов до поражения и Давайте посмотрим как игра этого азартного
игрока развивалась первая итерация Вот у него текущие средства 99 и у него есть ставка которую он поставил он проиграл То есть у него на следующем шаге у него текущие средства 97 ставка два то есть у него 99 денег в совокупности оставило и он выиграл четыре он прибавил эти четыре и у него получилось уже 101 в сумме весь его банк То есть он Вот его бан и он тратит на ставку совокупно это равно 101 То есть он выиграл 101 А вот здесь он опять выиграл цикл Хотя вот здесь он проваливался а у него там уже ставка
была четыре но всё-таки выиграл его вот здесь у него уже 102 банк и так далее так он вот по единички идёт прибавляет по единички прибавляет по единички пока прибавляет прибавляет и в какой-то момент него случается такая последовательность при которой он проигрывает все деньги а вот смотрите эта последовательность у него случилась здесь то есть он проиграл Сначала со ставкой оди потом со ставкой 2 8 16 32 64 и в итоге он проиграл 128 и это был примерно его весь банк вот если мы здесь здесь посмотрим и в итоге у него осталось всего лишь на одну ставку
которую он тоже благополучно проиграл за 63 цикла он слил весь банк то есть в этом заключается стратегия мартингейл что ты выигрываешь много раз по чуть-чуть но проигрываешь единоразово почти всё Ну или какую-то там максимальную ставку умноженную на два и давайте сделаем Сейчас большую симуляцию где мы просто Пустим не знаю там допустим 100 игроков которые сыграют мартингейл и мы узнаем какой Какое среднее количество ходов до поражений давайте сделаем так давайте вот этот Принт уберём А вот эти принты Мы тоже можем убрать потому что когда мы будем симулировать там сразу же 100 игроков они нам будут мешать
и сделаем такую функцию что вот симулирует войдёт давайте у нас будут все игроки начинать с одними и теми же средствами у нас также будет нбет у нас будет ма и у нас будет количество игр которые мы хотим симулировать и мы вернём это будет среднее значение который среднее количество итераций игры в ман одним игроком и так как это среднее значение то у нас вернётся ло В итоге начнём с переменной Total steps оно равно Ну и Да мы сием много-много и смотрите а нам нужно а создать количество игр по количеству игроков А и мы сделаем это следующим
образом fore in Range а end Games Step toose равно Play martingale А сюда мы передадим Starting funds Starting funds minb и maxbet так к сожалению у меня вся функция не входит на экран давайте я сделаю поудобнее чтобы она в столбик Была записана вся я сделаю следующим образом вот когда много аргументов входит в функцию можно записывать вот следующим образом и вот здесь я также Вот вызов этой функции столбик сделаю а и Total Step toose у нас плюс равно Step toose и мы возвратим А количество Total Step to Lose делённое на количество игр Вот и Давайте симулирует
количество игр а такая штука что эта симуляция это не быстрое дело потому что там нужно в одной из в одной игре если особенно если мы сделаем так что минимальная ставка будет маленькая а средства игрока будут большие и ещё мы сделаем какую-то максимальную ставку вотк там типа там если мы сделаем средства игрока 1000 а максимальная ставка будет 100 то это всё будет очень долгая симуляция я предлагаю сделать следующее Я предлагаю сразу же воткнуть такие параметры у нас будет а количество игр end Games Давайте 10 Starting funds игрока Пусть равно 1.000 а минимальная ставка будет один и
максимальная ставка 100 Давайте запустим такую симуляцию вот среднее количество игр в ман будет равно 186 это достаточно большое число но нам важно Наша задача была изначально вообще типа узнать Может ли эта игра быть бесконечна будет ли она прибыльная ответ нет игрок рано или поздно проигрывает и обычно сторонники стратегии манге они говорят Ну Слушай но а Ели у меня бесконечное количество денег допустим очень большое Давайте сделаем миллион и я найду такое казино где я смогу этот весь миллион поставить по-любому же случится Так что такого огромного количества проигрышей подряд не будет я смогу играть в плюс но
это тоже всё байка и конечно же игрок всё равно проиграет всё равно так или иначе ему выпадет какое-то определённое количество большое количество проигрышей подряд Давайте симуру на такую симуляцию нужно будет время она не быстрая но она рано или поздно закончится а да симуляция закончилась понадобилось вот такое большое количество шагов тут 15 порядка 15 млн но игрок каждый игрок всё равно ловил какую-то серию поражений в Монетку и в итоге сливал все деньги следующая структура данных с которыми Познакомимся - Это кортежи или tle tle похожи на лист но они не изменяются Как выглядит синтаксис Давайте создадим кортеж
User RS дальше открываем круглые скобки и здесь перечисляем Admin редактор и наблюдатель и Давайте заприте это терминал показал наш тал у тала конечно же есть длина равна ТМ по талу можно проводить итерацию Давайте посмотрим да В каждой строке высь роль которую мы забили в Тап можно посмотреть что находится ли наме сделать вот так вот будет Давайте какую-нибудь ещё роль придумаем и посмотрим ели она Давайте Пусть это будет роль видим у тала есть индексы они также конечно Нана с ну Когда вы созда с одним элементом то синтаксис Казалось бы должен выглядеть вот таким образом Давайте посмотрим
что это за Тап это строка скобки Кроме того что с помощью них объявляется кортеж используется ещ много где в пайне и нужно понимать что T объявляется вот таким образом из одного элемента и в конце запятая тогда этот Apple эта ошибка очень часто встречается в коде и допустим там объявляют кортеж с одним элементом вот таким образом хотят через него можем вот таким образом сделать присваивание переменных и Давайте заприте то что получится то есть в каждой переменной Roll 1 Roll 2 и Roll 3 лежит элемент из кортежа если бы здесь Было два элемента то распаковка не сработала
то есть количество переменных должно быть равно количеству элементов тала допустим нам нужно взять первые два элемента кортежа а третий просто опустить то он присваивается вот в такую переменную нижнее подчёркивание и тогда всё происходит нормально А кстати таким же свойством обладает и список то есть вот я заменил User Rolls на список и распаковывать переменные Можно также tle применяется тогда когда Вы точно знаете что структуру данных не нужно будет менять такое встречается нечасто и чаще всего tle используется вместе с функциями об этом мы поговорим позже а сейчас давайте рассмотрим другую структуру данных возможно одну из самых часто
встречаемых Зачем нужно программирование программирование существует для того чтобы переложить реальный мир на язык цифры и когда мы обекты в реальном мире у него есть какие-то атрибуты Например у человека есть рост вес фамилия имя гражданство серии номер паспорта и так далее и самое логичное хранить это в структуре с именованными полями собственно для этого существует словарь или дикт словарь - это набор ключ значения ключи словаря должны быть уникальными как объявляется словарь Давайте создадим Person у которого будет name John у него будет возраст 30 лет и Сити где он живёт Пусть это будет нью-йорк и Давайте напечатаем вот
мы напечатали объект словаря в словарь когда он создан Можно присваивать другие ключи это делается через следующий синтаксис Давайте пусть у Person будет Job работа и он будет инженер и напечатаем наш объект А вот мы видим что в словарь был добавлен ключ и значение ключ Job и значение engineer словарь можно Объявлять также по-другому с помощью фигурных скобок и уже дальше накидывать в него ключи печатаем и АА терминал выводит ровно те ключи которые мы с вами положили значение в словарях можно вызывать по ключу Давайте например запри имя объекта который Мы создали терминал вывел дн Давайте попробуем запросить
ключ которого нет исполнение упало с ошибкой терминал пишет нам что это ошибка и то есть такого ключа нет в словаре чтобы э ошибка в пане есть у словарей метод Get Давайте сначала через метод Get Запроси ключ имя получился дн если запросить ключ Country то вернётся объект N также мы можем положить функцию Get дефолтное значение которое вернётся нам в случае если в словаре ничего нет по этому ключу намну USA если мы допустим Запроси также и добавим сюда дефолтное значение например Джек то нам всё равно вернётся джн естественно по словарю нужно итерироваться но как итерироваться по словарю
когда у него есть и ключ и значение если мы напишем вло Давайте P in Person он выведет просто ключи Но нам же важны значения верно Можно конечно делать следующим образом и запрашивать прямо по ключу через который мы итерируемый распространённый способ который встречается в коде на пайтоне обычно используется Вот такая конструкция у словаря дёргается метод Items и Давайте запри item и Type этого айте нам распаковывается ключ значения в виде кортежа который мы только что проходили первым значением в этом кортеже идёт ключ и второе значение а как Мы помним кортеж можно распаковать в две переменные таким вот
образом Давайте посмотрим что получится мы итерируемый name и вторая строка value - это John Мы можем написать это сразу же в когда объявляем итератор ки val in Items Print и Print val и вот John h30 City New York если нам нужно итерироваться только по ключам обычно используется вот такой синтаксис у объ ре если вас будет читать другой программист Или вы сами вы сразу же поймёте что вы тут хотели сделать мы итерироваться по значениям для этого есть метод vales Давайте переименую вот этот объект и здесь мы получили значение словаря сравнение словарей допустим у нас есть два
объекта и Обратите внимание ключи и значения здесь одинаковые но они идут в разном порядке объявляются В разном порядке для словаря порядок абсолютно не важен потому что ключи у нас всегда уникальные и Давайте попробуем сравнить их и возвращается True Если какое-то значение будет другим то вернётся fse также если у нас будет Допустим разное количество ключей то также возвращается fse частотная задача Когда нам нужно объединить два словаря допустим у нас есть Person и additional info два словаря А вот мы можем обратить здесь внимание что есть повторяющийся ключ си возможно пользователь Возможно это объект нашего пользователя который внезапно
куда-то переехал и это отражается в словаре additional Personal info Что нам сделать тогда у словаря есть такой метод update мы вызываем Person update и сюда передаём другой словарь и Давайте затим Person Обратите внимание То есть он объединил ключи то есть вот мы видим например Mar True ключ Job engineer а Сити этот ключ берётся из последнего объекта из того объекта которым обновляется первоначальный объект но это не единственный синтаксис который есть Как по мне более удобный синтаксис такой присваиваем в объект Person объединение с помощью символа Pipe на клавиатуре если что загуглите где он находится это такая длинная
самая длинная палка и additional Person info Прим Person и у нас получился тот же самый результат то есть второй словарь перетирает ключи первого если они одинаковые в модуле есть домашнее задание обязательно выполните его и там же в этом же файле лежит ответ к домашнему заданию Давайте чуть больше углубился в функции допустим у нас есть вот такая функция функция берёт два аргумента XY и возвращает их сумму получилось ри А что если нам нужно сложить множество элементов Как положить целое множество функцию когда мы объявляем аргументы по одному для этого в пайне есть синтаксис синтаксис выглядит следующим образом
Давайте назовём функцию по-другому пусть она называется All сложить все и поставим звёздочку и напишем обычно так обозначается какое-то множество и Давайте вообще посмотрим что это за AR к нам пришли и какой у них Тип и допустим вызовем нет вызов и передадим туда 1 2 3 1 2 3 - это tle кортеж вот функция ty возвращает tle А каким образом нам сложить сейчас все числа Ну мы можем сделать очень легко Мы можем взять объявить переменную summary пусть она равна нулю и итерироваться через Arc и Давайте возвратим сари так Да тут я забыл прин написать получилось шесть
Давайте проверим что точно всё работает передадим ещё другие значения получилось 15 Всё верно что если у нас есть вот такие два списка которые нужно сложить между собой каким образом их запихнуть вот в такую функцию это также делается с помощью синтаксиса со звёздочкой мы кладём values и other values просто со звёздочкой и получается 55 существуют моменты когда нам функцию нужно передать не только аргументы допустим числа но и какие-то именованные аргументы И для этого в пайтоне тоже есть свой синтаксис Давайте напишем функцию introduce Она будет принимать на вход quarks а этим словом в пайне обозначаются именованные аргументы
Давайте затим и Type qu и вызовам функцию вот с такими аргументами Сюда можно передавать какую угодно пару и бесконечное количество поименованных значений следующим образом Вот давайте передадим сюда joh H 30 то есть разных типов и допустим C New York А ркс - это на самом деле словарь функция Type говорит нам именно об этом Пусть функция introduce будет устроена следующим образом мы там просто итерируемый Так проверим что всё работает так да у quarks Нужно обязательно вызвать метод Items всё работает а А что если задача такая у нас есть реально словарь и нам нужно запихнуть его в
функцию introduce А каким образом это делается это делается через синтаксис с двумя звёздочками и результат получился точно такой же давайте сделаем функцию которая примет вообще все возможные варианты аргументов чтобы посмотреть как это устроено Давайте объявим функцию следующим образом пусть будет приниматься какой-то X ти Y типа int затем будут приниматься какие-то Arc аргументы затем пусть будет какой-то значение которое инто и почему-то равно шести Пусть оно будет Вот так дефолтное значение и здесь quarks и пусть функция просто будет печатать эти Аргументы и давайте сделаем вот такой вызов а X допустим равно 1 2 затем мы сюда скормлю
вот что у нас выводит прин Обратите внимание Print XY на первой строке 1 ид затем идут AR кортеж на следующей строчке вот мы его здесь передали Затем идёт val оно равно 6 мы его не трогали и Затем идёт на к который мы туда передали с такими функциями нужно быть оче аккуратными потому что не ВС так явно что туда переда без это синтаксиса не решить какие-то проблемы и в случае применения такого синтаксиса я конечно же расскажу только позже следующая штука которую умеют функции - это возвращать сразу несколько значений и этот функционал частенько используется например Давайте напишем
функцию которая будет модифицировать словарь и возвращать первым аргументом модифицированный словарь а второй вторым аргументом Был ли словарь модифицирован функция будет следующая а функция называется modify dict она принимает аргумент Old dict типа dict и какие-то к ключ аргументы ключ значения на которые предположительно будет меняться наш старый словарь возвращать она будет два аргумента и записывает в синтаксисе в нотации функции следующим образом tle так как элементов два и одно значение будет КТ это наш словарь а другое будет Бул изменился словарь или нет Давайте сразу же заведём переменную из modified которая будет равна fse потому что у нас ещё
пока ничего не изменилось и дальше мы циклом пойдём по нашим к а Ke value inar Items и дальше такое условие If dict нам нужно проверить есть ли значение с таким ключом в старом словаре в старом словаре конечно же таких ключей может не быть поэтому мы воспользуемся методом Get если в старом словаре значение не равно то есть значение ВК том что лежит ВК то мы сделаем следующим образом равно так вот здесь я забыл двоеточие и так как изменение значения произошло то мы сразу же сделаем ключ из modif РА и в конце после слова нам нужно вернуть
два объекта я напомню Это словарь и Был ли этот словарь Но это изменённый словарь и был ли словарь изменён Нужно вернуть и Давайте пусть у нас будет Вот такая структура какой-то продукт у него есть есть название п и какой-то у него есть функцию modif Давайте просто пока получим какую-то структуру в ответ мы ещ не знаем что это за структура но просто посмотрим как она выглядит dict равно product и здесь мы перечислим наши quarks Давайте добавим к словарю такую переменную instock то есть участвует в распродаже и зам structure и тип этой страк и нам вернулся кортеж
Собственно как мы и возвращались функции кортеж а с двумя значениями вот первое значение это словарь уже изменённый здесь есть ключ instock True и переменные из modif Давайте посмотрим как будто бы мы в изменение словаря к передали ПП и словарь остался тем же самым и модифицирован ли он был Нет давайте ког из функции возвращаются два аргумента они присваиваются в два аргумента распаковываю как мы это делали с Тами мы распакуем их в две переменных будет прок и modif и за принти две переменные в одной у на оказался словарь другой значени из modified следующая очень важная тема -
это Jon Jon - это текстовый формат обмена данными весьма вероятно большинство данных которые циркулируют туда-сюда в различных мобильных приложениях в веб-приложения ходят именно в джейсоне Jon расшифровывается как JavaScript object notation Но несмотря на то что этот формат был впервые применён именно внутри языка JavaScript он стал мы поговорим чуть попозже сейчас просто будем использовать их и J допустим пусть у нас будет какая-то какой-то объект бук книжка у неё есть ключ title автор допустим есть esbn чтобы это не обозначало но на самом деле это какой-то международный идентификатор книг и это такой идентификатор его используют в базах данных
ну привыкайте J выглядит примерно так и упаковываются туда именно такие данные и давайте сделаем а переменную json string и туда возьмём вызовем метод dumps и упакуем объект Book и посмотрим что у нас получится во-первых что там за тип будет во-вторых Давайте посмотрим как сам объект будет выглядеть получается строка то есть наш объект преобразовал в строку и у строки вот следующий формат То есть он переделал кавычки из одинарных одинарные или двойные в питоне не имеют никакой разницы но в Jon они играют роль там одинарные кавычки Ну используются как апостроф А чтобы упаковать ключ и значения нам
нужно двойные кавычки то есть J если вот этот объект взять и скопировать Во что примерно он переносится то вот он равен следующему вот такой строке то есть это строка и внутри вот так упакован объект Давайте Вот это сотрём чтобы распаковать этот J нам нужно вызвать функцию давайте сделаем переменную бук и J и туда передадим J Strings Давайте посмотрим Почему Чему равна переменная бук и какой у неё Тип запускаем тип dict то есть мы распаковали обратно ну и там ключи значения уже внутри ну и тут нужно сказать что в J можно упаковать какие-то другие Поля не
знаю например пусть у будет какая-то какой-то каут который там равен 30 книгам допустим на складом допустим какие-то лейблы которые у нас есть Допустим Допустим не лейблы а назовём это жанры допустим жанр антиутопия и заприте Как выглядит J string вот число без двойных кавычек и жанры он упаковал листом я показал что такое J чтобы поделать запросы но до запросов нас отделяет ещё одна тема которую важно знать Это импорты итак импорты для начала Что такое модуль в Python Что называется модуле модуль в Python - это файл который содержит Python и имеет расширение точка py Например я каждый
раз в каждом уроке создаю файл Lesson то есть урок точка py модуль может содержать как исполняемый код так и определение функций или классов каждый модуль содержит приватное пространство имён посмотреть его очень легко а есть встроенная функция globals и функция globals возвращает словарь я сразу же верну ключи вот здесь разные непонятные строки хранятся Давайте просто объявим переменную какую-то переменная My int Рав 1 и запустим функцию globals мы увидели переменную My int здесь то есть globals содержит все переменные функции классы которые вы можете как-то использовать в своём коде и Давайте тием библиотеку J которой мы пользовались в
прошлом уроке библиотека также попала в пространство имён этого модуля то есть импорт в модуле нужен для того чтобы завести в локальное пространство имён нашего файла какие-то другие библиотеки или другие файлы А это очень важная штука потому что это помогает нам лучше компоновать код и лучше ориентироваться в нём потому что если бы у нас были файлы не знаю там по несколько 1.000 строк то в них было бы очень тяжело ориентироваться например допустим у нас есть какой-то mylist и нам нужно выбрать из mylist какой-то Рандомный элемент для этого в Python а существует модуль Random и у Random
есть такой метод Choice и в Choice передаём My list Вот давайте сейчас распечатаем исполнение этой функции и распечатаем что у нас есть в globals чй вернул нам Рандомный элемент в этот раз это оказалась тройка и в нашем пространстве имён вот есть модуль Random который мы импортировались который мы импортировались здесь какие-то классы представлены у них какие-то методы Ну мы сейчас не будем в это углубляться Я лишь хотел проиллюстрировать что мы просто переносим пространство имён из Random к нам в наш модуль который называется lon P в данный момент чтобы посмотреть методы можно ВМ дёрнуть есть функция DIR
она также встроено и тут огромное количество всего А например вот здесь есть функция Choice которую мы только что дёргали ну и масса других каких-то функций Ну и конечно же мы сами можем создавать модули допустим я вот здесь создал файл M operations у него есть две функции это Add сложить он складывает два числа и substr Давайте файле lessons попробуем по импортировать эти функции вот Обратите внимание у меня в проекте папки называются через нижнее подчёркивание и дальше идёт число я специально так сделал это не самый принятый в пайне метод название папки я сделал так специально чтобы ни
очередность и нам нужно сейчас импортировать в наш файл lon функции из файла M operations как это делается Мы пишем наш модуль называется 17 и мы пишем From 17 и точка нам показывает подсказывает M operations и и там есть две функции Add и substr и дальше мы можем их использовать например можем сложить два числа и также вычесть два числа запускаем всё работает импортировать мы можем разными способами например Мы можем взять и сделать следующим образом мы можем из папки 17 ипор импортировать просто модуль M operations и уже здесь вызывать функции из этого модуля так я прин забыл
получилось три можно делать следующим образом А мы берём импортируем из модуля M operations все функции которые там есть с помощью звёздочки такой синтаксис лучше не использовать потому что мы не знаем что там внутри файла M operations и там может быть какие-то функции или переменные названы также как у нас в нашем скрипте лучше создавать импортировать по одному либо импортировать сразу же модуль math operations то есть вот здесь мы можем сейчас вызвать функцию Add она сразу же есть уже сразу в нашем пространстве имён Давайте убедимся в этом вот этот абстракт присутствует Давайте вызовем чтобы убедиться и заприте
результат получилось три я так очень не советую делать иногда допустим у меня бы здесь была бы функция какая-то Add совершенно другая которая бы использовала Аргументы и возвращала сумму этих аргументов чуть изменённая Функция которую мы делали в предыдущих модулях и мне нужно импортировать функцию Add из Mass operations и будет очень плохо Даже Python подсказывает что вы переопределить под другим именем и я допустим напишу addition и давайте я вызову функцию addition которая складывает X Y также мы можем сделать относительный импорт то есть не спускаться до папки в корне то есть мы по сути импортируем сразу же из
вот этой папки а просто написать From M operations import Add и это также будет работать Всё работает а также я бы в рамках этой темы обратил бы внимание на такой файл как init он указывает интерпретатору что вся папка является питонов Ским пакетом и её можно импортировать вот этим образом То есть если у вас где-то не работает какой-то импорт Обратите внимание что там лежит файл init Pie одно из преимуществ Python - это пакеты которые не входят в стандартную библиотеку вообще в Python решены многие проблемы другими разработчиками и вы можете пользоваться плодами их труда в Python есть
установщик пакетов пип он помогает управлять зависимостями которых нет в стандартной библиотеке в следующем модуле мы будем делать запросы к AP Для этого нам понадобится библиотека requests и нам нужно её установить в пайчарме А есть кнопка терминал Давайте нажмём её это терминал командная строка в которой активирована наша среда Где установлен Python у вас в терминале среда может быть не активирована давайте я сейчас у себя её деактивировать Если вы на линуксе или на Маке то нужно сделать следующим образом sce и у нас появился вот здесь на виндоусе это делается по-другому на Windows это делается через вот такую
команду у меня она не сбое запускать Script AC и там сши ещё в другую сторону у меня она не пойдёт Но на Windows она должна сработать и дальше мы просто берём и пишем Pip Install request нажимаем Enter и библиотека скачивается если г не получилось это сделать то Зайдите в настройки здесь есть вкладка Project и Python interpreter во-первых Убедитесь что вот здесь у вас интерпретатор установлен из вашей папки то есть делается это следующим образом у меня уже он установлен из моей папки А где я нахожусь либо установить библиотеку можно следующим образом я Давайте её сейчас удалю
здесь и так вот нажимаете плюс здесь куча доступных пакетов А и набиваете requests и здесь должна быть где-то кнопка Install package всё package request installed successfully выходим отсюда Давайте проверим что requests установилась Мы просто импортируем его к себя всё работает Итак что такое apia apia - это интерфейс для взаимодействия программ между собой вы прекрасно знаете что такое интерфейс приложения или сайта например с помощью интерфейса юба Вы можете останавливать или возобновлять воспроизведение этого видео увеличивать скорость включать субтитры Ну и так далее программный Интерфейс - это такой же интерфейс Но для другой компьютерной программы и мы сейчас
будем делать Запрос к другому ресурсу в Интернете у которого есть свой API или AP То есть я смогу из своего кода вызвать другую программу через http запрос мы пойдём и узнаем стоимость биткоина на бинансе это не реклама мне бинанс вообще ничего не платил за это я взял его потому что у него есть доступны AP с со стоимостью криптовалют у AP есть документация вы её сейчас можете видеть ссылка на документацию если что лежит в описании в ссылках используемых в видео так первое что нам нужно - это выписать URL на который мы будем ходить а он выглядит
вот таким образом и дальше мы берём и делаем следующее мы делаем переменную respon ответ и вызываем библиотеку request с методом Get в Get передаём наш URL и нужно передать аргумент params params будет следующее нам нужно туда передать а ключ симбол и дальше нам нужно узнать стоимость биткоина к доллару в бинанс это сделано следующим образом я два Кера подряд пишу Bitcoin который имеет btc тикер и usdt и Давайте посмотрим что у нас пришло то что вернётся нам хранится в атрибуте контент Давайте напишем этот контент и тип этого контента Всё я запустил пошёл запрос запрос отработал к
нам пришли Вот такие байты это клас bys и вот они что означает то есть символ btcusdt - это собственно курс биткоина к доллару и сегодня биткойн стоит 29.000 долларов 781 доллар это байты с байтами Мы ещё не работали и в рамках этого курса не будем работать с ними нам нужно перегнать их в J потому что ну это же просто чистый Джен это дикт и это всё очень легко сделать мы возьмём сделаем переменную и у вызовем метод J за принти Прай и тип прайса А да Тип dict и вот наш словарь то есть дальше мы можем
пользоваться ключом Прай и как-то его использовать Обратите внимание что прайс к нам пришёл в виде строки и я его сейчас перегон сразу же в в тип FL например давайте я сделаю там Price object Price равно Price object ключ Price вызываем так я тут использую одинарные кавычки Давайте чтобы для консистентность я их тоже сделаю и сразу же его перегоним в тип FL и затим Вот давайте сделаем следующим образом Давайте напишем код который каждую секунду ходит капи бинанса и узнаёт цену биткоина и добавляет её в список А что нам нужно для этого сделать во-первых нам нужно делать
секундные задержки как их делать есть модуль стандартной библиотеки и здесь мым нам нужно сделать раз в секун in 30 делаем запрос Get запрос по урлу в params передаём btc USD сразу же переведу его Price так вот здесь надо вызов сделать и сделаем здесь список Bitcoin prices пустой список и в этот список добавим прайс и здесь нам нужно замереть на секунду а это делается это с помощью метода slep сюда передают секунды Time Sleep о и давайте а в конце за принти Bitcoin prices заприте длину объекта Bitcoin prices заприте максимальное значение из списка Bitcoin prices и минимальная
поехали ждём 30 секунд а Итак программа отработала получился список А из стоимости биткоина в нём получилось 30 элементов мы сразу это закладывали в нашем Рей и максимальная цена получилась 2976 3 доллара и минимальное 29.7 59 долларов в этом модуле есть домашнее задание обязательно выполните его оно тоже связано с запросами следующая тема comprehensions перевести на русский язык это можно словом включение списочное включение list comprehensions - это такой более удобный способ создания разных списков списков нам нужно создавать в коде очень много обычно и для того чтобы сократить строчки кода сделать код более читаемым мы используем ли comprehensions
например вот есть традиционный способ нам нужно создать будет включать в себя квадраты всех чисел от нуля до де а как это сделать for X in Range 10 мы берём и в list squ добавляем x в степени 2 и Давайте посмотрим чему у нас равен и на это ушло вот три строки Хотя операция достаточно очевидная мы эти три строки можем заменить одной можем сделать так S равно X ква для X из Range 10 и Давайте затим S получилось тоже самое есть вот эти способы абсолютно равнозначные только один более лаконичный и у него чуток другой порядок элементов
в синтаксисе то есть мы вот здесь делаем цикл 4 и вот здесь просто объявляем этот элемент или что-то делаем с ним сравниваем с чем-то и так далее Давайте создадим список чётных квадратов чисел назовём его чт квадраты если у нас X чётные то мы добавляем квадратово числа в список Давайте здесь напишем это если X остаток от деления на два равен нулю то мы берём и в list even squares добавляем этот x в квадрате и вот получилось он туда добавил только чётный элемент If тоже можно убрать в list comprehensions например эта запись сворачивается до следующей X квадра
for X in Range 10 если X при делении на 2 даёт остаток ноль и Давайте Вот это уберём эти записи абсолютно идентичны только вот это занимает одну строку А это две и Давайте распечатаем получилось то же самое туда же в список можно добавить слово else например Давайте решим такую задачу вот у нас есть список чисел и мы на каждое чётное число будем заменять словом even чётное а каждое нечётное словом od нечётная Давайте назовём этот список labeled Numbers и он будет пустой и допустим у нас есть вот такой вот список Давайте по порядку туда для простоты
выпишем числа и Numbers если число при делении на Д даёт остаток ноль то мы в Label Numbers добавим even else Давайте num затим да оди - это od even even это же можно записать в list comprension как это будет выглядеть тут Обратите внимание Мы создаём список на основании другого списка и это будет выглядеть следующим образом else от in Numbers Так это сейчас сотрём нам нужен только список Numbers так Нет я не сотру я себе Буе а получилось всё тоже самое то есть вот эта запись здесь аж сразу пять строк легко убирается в одну Вообще в
начале могут очень тяжело восприниматься это просто тренировка нужно начать их использовать то есть знать что если вы создаёте список то попробовать это сделать чере Ида правда двухэтажными вот тогда их не нужно использовать То есть если запись умещается в одну строку то мы её используем Если нет то нужно уже как-то создавать другими способами типа циклами они будут более явными через Lens Также можно создавать словари например Давайте создадим словарь sct там мы использовали листы здесь словарь и нам нужно сделать следующим образом Вот это ключ словаря это ние словаря X и X к для X in Range 10
и Давайте заприте его и вот такой словарь получается то есть у нас пары чисел 0 0 1 1 2 4 3 9 41 и так далее Давайте выполним такую операцию с помощью list comprehensions как транспонирование матрицы Что такое Матрица Матрица - это такой двумерный массив чисел у которого есть строки и столпцы обычно в пайтоне он записывается следующи образом у нас есть строки и Столбцы то есть строка Вот первая вторая строка там третья и Столбцы соответственно вот один столбец 17 2 58 Ну и так далее 369 А что такое транспонирование это такая операция над матрицей когда
еро становятся столбцами с тем же номером Столбцы становятся строками то есть транспонированная Матрица К этой матрице будет выглядеть следующим образом 1 4 7 2 5 8 3 6 9 то есть нам вот эту матрицу нужно таким образом перевернуть чтобы получилось вот это как это делается давайте сделаем переменную transpose Matrix и делаем следующую штуку for in Range L Matrix А здесь нам нужно сделать переменную transpose Row и складывать в неё строки а делаем здесь второй цикл for in Matrix transpose Row up and Row E то есть мы берём проходим в цикле который равен длине матрицы по
вот этим чисел то есть индексам допустим в первый проход она будет равна ноль дальше мы берём по строкам из Матрицы проходим и в строчку который Мы создали здесь берём и кладём элемент с индексом ноль Потом также элемент с индексом оди уже в другую строку в другую переменную И вот здесь мы сделаем transpose Matrix transpose Row А и Давайте заприте transpose Марик получилось ли Да всё получилось и у нас получился достаточно громовский и если честно не очень-то понятный код согласитесь и смотрите Какую красоту можно сделать с помощью лист комн Так давайте это оставим чтобы было пока
чтобы мы Потом могли сравнить и мы пишем transpose Matrix равно строка для строки из Матрицы for E in Range L Matrix Ну как по мне эта штука да пусть непонятная но выглядит то потрясающе выглядит очень коротко и Давайте заприте это да всё получилось тоже самое следующий Тип который нам надо изучить с вами это множество Что такое множество множество - это коллекция из уникальных элементов Давайте создадим такую множество в пайтоне называются Set и Set создаётся следующим образом синтаксис похож на дикт но в дикте хранится ключ значения А в сете только значение и Давайте заприте клас Set
и 1 2 3 4 5 сет также можно делать по-другому с помощью ключевого слова Set вызываем его как функцию и наполняем этот сет R 5 Давайте My есть то есть изменять так же как словари или списки и добавляем туда и и принти mys 0 2 3 4 из Сета Также можно удалять элементы команды Remove Давайте удалим двойку из Сета и наш сет стал меньше в сете хранятся только уникальные элементы То есть если я вот здесь добавлю двойку то се не изменится он будет также равен 01 2 3 4 Несмотря на то что я добавил ещё
одну двойку туда потому чтот включает только уникальные элементы и сетами естественно можно сделать всякие операции например пусть у нас есть и есть 2 и нам нужно объединить два этих множества синтаксис такой Set 1 Union Set 2 Обратите внимание здесь есть одинаковые элементы он их запишет ровно один раз 1 2 3 4 5 6 Ну и естественно у Сета есть а давайте сделаем переменную UN Set который равен 1 Union Set 2 Да Union наверное плохое название United и Давайте длину этого Сета шесть а сеты Также можно находить их пересечения Что такое пересечение это элементы которые есть
и там и там получился сет 34 собственно тройка и четвёрка есть и там и там также можно делать difference например между сетами будет 1 то есть 1 2 - это элементы которых нет в сете 2 сеты можно создавать с помощью включений давайте я создам Set squares а вот он равен следующему сет - это неупорядоченная последовательность порядок элементов не не имеет никакого значения То есть например вот такой сет о 2 3 будет равен сету 3 21 важно лишь что и тот и тот сет включают одни и те же значения неважно В каком порядке и см чаще
всего решается Вот такая задача допустим у нас есть список Numbers в нём есть разные одинаковые элементы и нам нужно по-простому из листа удалить дубли делается это следующим образом Numbers Давайте typ напишем Ну typ естественно будет Set и сами Unique Numbers Да types уникальные цифры вот от одного до семи чтобы это естественно сделать листом нужно просто сделать вот такое преобразование list UN Numbers получился вот такой Лист В итоге Ну и в одну строчку это можно написать следующим образом list Set Numbers вот такую конструкцию можно частенько увидеть в коде и Type Да получился такой Лист и лист
вы могли заметить что се dict похожи У них даже одинаковый синтаксис объявления переменных в фигурных скобках внутри эта структура данных представляет из себя хэш таблицу Что такое хэш таблица выходит за рамки этого курса но Неплохо бы знать что это такое Я советую на начальном этапе прочитать книжку грокаем алгоритмы она даст вам первоначальное представление о том как работают алгоритмы чтобы Вы могли уже дальше углубляться в эту тему потому что она очень важна Итак следующая тема сортировка и фильтрация вообще частенько вижу что понимания этих терминов Нет давайте объясню на пальцах Что такое сортировка в сортировке не изменяется
количество элементов меняется только их порядок по определённому принципу сортировка может быть по возрастанию по убыванию если мы сортируем слова Например то мы можем сортировать их по длине этих слов и так далее фильтрации же конечная выборка может меняться например мы можем отфильтровать только чётные числа Давайте посмотрим как это делается в Python допустим у нас есть вот такой массив давайте отсортируйте это при помощи функции S и затим sed Обратите внимание поменялся порядок элементов А сейчас массив отсортирован по алфавиту от меньшего к большему дефолтные сортировки всегда идут от меньшего к большему а также Давайте посмотрим изменился ли первоначальный
список остался тем же допустим нам нужно сделать то же самое только отсортировать в обратном порядке Мы просто доки дым функцию sorted argum reverse True Смотрим А как мы видим сортировка в обратном порядке Как сделать так чтобы отсортировать слова например по длине нам нужно пробросить функцию sorted ещё один аргумент ключ сортировки ключ сортировки - Это обычно функция и передаётся она как объект я сейчас объясню что это такое Давайте напишем вот такую функцию sort by Len она возьмёт какой-то элемент а и вернёт длину этого элемента так м сразу же сделаем аннотации для этой функции функция когда вызывается
у неё синтаксис Мы в скобках пробрасывается если функцию просто запри аэ вот сюда просто в Print мы функцию без скобок кладём интерпретатор вывел что это функция sort byen Ну и расположена она вот в такой-то ячейке памяти а давайте Type этой штуки выведем CL function функции в пайтоне - это объекты в пайтоне вообще всё это объекты и как и Любой объект функцию можно передавать в другие функции как аргумент например и давайте сделаем это передаём первым аргументом list Fruits и в аргумент Ke кладём нашу функцию sort by Len обязательно без скобок потому что мы её не вызываем
что там произойдёт под капотом под капотом он вызовет вот эту функцию с каждым элементом массива получит результат по ней и уже этот результат отсортируйте напишем А давайте посмотрим что получилось и он отсортирован к большему от Date до Cherry Давайте посмотрим ещё одно применение ключа при сортировке допустим у нас есть список из объектов каких-то персон у них есть какие-то признаки и нам нужно список отсортировать допустим по возрасту мы пишем функцию sort by H которая принимает какой-то элемент Давайте Пусть это будет не элемент а Person типа dict и она будет возвращать возраст наш Возраст - это переменная
типа int и просто пишем Person То есть когда мы засовы какой-то объект типа в эту функцию она просто возвращает возраст и уже этот возраст сортируется sort by H и обязательно без скобок и заприте это а Первый элемент стал Боб потому что у него возраст 20 Обратите внимание это отличается от первоначальной выборки затем Эли затем Чарли допустим нам нужно сортировать сразу по двум признакам то есть пусть у нас в первоначальной выборке будет несколько объектов с одним и тем же возрастом давайте мы условимся что в случае когда у объектов одинаковы возраст Мы хотим отсортировать их по алфавиту
им фн которую мы передадим как ключ сортировки H name элемент dict будет и вернёт он массив из Инта и строки Точнее не массив А tle и просто сюда возвращаем элемент H и элемент name и вызываем функцию с ключами смотрим что получилось Боб Элис Затем идёт Чарли потому что Чарли буква раньше расположена чем буква и Диана функция на функцию в пайне она также принимает какой-то массив данных и ключ для фильтрации только если ключ для сортировки возвращал какую-то скалярную единицу которую можно сравнить с другой например там когда мы сравнивали длину длина слова 3 она меньше чем длина
слова п в фильтрации функция ключ должна возвращать значение бу или fse в зависимости от того удовлетворяет ли элемент какому-то условию и Должен ли он оказаться в конечной выборке То есть например когда мы фильтруем числа и нам нужно выбрать чётное то нечётные числа будут возвращать ЛС от этой функции а чётные числа будут возвращать когда мы передаём в эту функцию True Давайте напишем такую функцию из even число является чётным А сюда какой-то N приходит и возвращается Бул и просто возвратим остаток отделения N на 2 равно нулю пусть у нас есть массив каких-то чисел и отфильтрованные числа мы
получим следующим образом функции фильтр сначала пробрасывается функция ключ а потом массив А давайте распечатаем отфильтрованные числа функция фильтр возвращает объект класса фильтр И для него нет вывода в терминал какого-то читаемого значения нам нужно результат завернуть в лист и тогда будет всё нормально И как мы видим результат он отсортированы числа также можно делать с списком объектов каких-то допустим нам нужно отфильтровать людей из этой выборки которым больше восемнадцати мы пишем функцию ключ которая будет фильтровать Она будет принимать обк Person который dict и будет возвращать Bull и вернём просто Person Age больше 18 так больше либо равно обязательно
заворачиваем результат в лист А сюда кладём функцию без скобочек и масив пи принти финальной выборки оказались люди старше 18 лет У нас есть проблематика вот есть различные функции сортировки фильтрации есть ещё некоторые функции которые принимают на вход какой-то ключ нам Обычно вот такой ключ нужен всего один раз если мы будем всё это хранить в кодовой базе то мы будем загромождать код и в пайтоне есть такой механизм объявить функцию очень коротко этот механизм называется лямбда функции вот у нас была такая функция S by Она принимала какой-то элемент А это была строка и возвращала int мы возвращали
просто Len Element Как выглядит лямбда функция которая делает то же самое ключевое слово лямбда дальше мы сразу же пишем аргумент который она получает на вход здесь могут быть несколько элементов двоеточия Len Element то есть Обратите внимание место слова Def слово лямбда названия функции нет сразу идёт аргумент двоеточие и то что возвращается Давайте просто присвоить что это вообще работает и туда передадим Давайте чтобы сравнить я вызову верхнюю функцию сюда дам слово банана и лямбду вызову с банана внутри и там и там получился шесть То есть это один и тот же синтаксис но сейчас мы можем делать
следующее У нас есть массив фруктов например и мы хотим их отсортировать по длине и мы пишем также функцию sorted которая принимает list frs и здесь мы просто пишем лямбда функцию которая принимает элемент и возвращает длину элемента так да я забыл здесь поставить что это ключ У нас сде это новам сейчас всё работает лямда функции Также можно вставлять в другие встроенные функции пайтона например Мак mean и так далее давайте сделаем так чтобы функция Мак вернула нам один элемент из этой выборки и условие этого элемента должно быть что это самое длинное слово переменная longest функция вст на
МАКС сюда передаём наш масив frs и пишем и принти самое длинное слово Несмотря на то что слово банана и слово Черри одинаковой длины слово банана шло раньше и поэтому он вернул Именно его в есть домашнее задание обязательно ознакомьтесь с ним и выполните ответ там прилагается Accept Давайте начнём Погружение в эту тему с того что напишем функцию которая находит среднее значение в функцию заходит какой-то лист из чисел на выходе возвращается Flat среднее значение и функция устроена следующим образом мы берём сумму чисел так я тут лишний скобки поставил делим на длину массива чисел так получаем среднее значение
и Давайте проверим что всё работает передадим сюда вот такой массив всё классно но Что будет если мы передадим просто пустой массив длина этого массива будет ноль и это будет деление на ноль как отреагирует на это интерпретатор мы разделили на Но это неприемлемо и наш код упал с ошибкой а если бы вот здесь Было бы что-то ещё то до этого места код просто не достанет а ошибки вообще в коде это не страшно Но иногда у вас может работать сервер если на сервере произойдёт ошибка то сервер упадёт и поэтому нам эти ошибки нужно как-то перехватывать и делать
так чтобы программа что-то делала Если она падает с ошибкой для этого существует следу Давайте оставим исполнение функции здесь есть блок TR естественно дальше чтото что внутри блоке нужен отступ и дальше следует ключевое слово Accept после ключевого слова Accept мы перечисляем ошибки которые могут при исполнении этой функции случиться ошибка которая упала у нас здесь и Давайте [музыка] запри The list empty и посмотрим что будет сейчас программа зашла вот в этот блок он упал с ошибкой Zero division всё перешло вот сюда в итоге интерпретатор запл что лист пустой и дальше исполнение программы пошло дальше если бы здесь
был непустой массив то Аа он бы его вычислил А давайте его запретите просто то он его вычислил и пошёл дальше по исполнению то есть в этот блок уже не заходил интерпретатор в блоке про запросы у нас был вот такой кусок кода мы шли в апе бинанса и узнавали стоимость биткоина к доллару Давайте посмотрим что будет если выключить интернет я сейчас потуш свой Wii и посмотрю что случится с исполнением этого кода Код упал с ошибкой ошибка requ Exception Con он говорит что после нескольких походок он сделал несколько Раев он не досту до этого ресурса делаем какие-то
походы в разные а то нам нужно как-то оборачивать исключения и Давайте просто напишем что делать коду если у нас случился Connection мы уже весь блок убираем вй берём выделяем весь массив кода нажимаем T Чтобы код отступил Accept и здесь пишем путь ошибки указан здесь путь из модуле Connection eror и здесь мы запри что there is Internet пробуем А всё получилось этот Принт исполнился очень часто в ошибках питонов ских также передаётся какая-то информация получить её можно следующим синтаксисом As Error и Давайте здесь напишем что что-то пошло не так и ошибку сюда заприте something goes Wrong и
вот здесь надпись которую мы видели в исключении что мы сделали ретрай вот по этому урлу но [музыка] э до сервера нам не удалось Достучаться следующая тема классы кстати вы-то свой класс поставили там внизу классы как я считаю одна из самых сложных тем и в этой теме плавают новички основная сложность класса в том что это такой уровень абстракции который контри интуи но я попробую рассказать о проблематике и о том как вообще использовать классы в работе Мы в конце этой темы запрограммируй бой как будто бы мы написали MPG между двумя существами и пока мы будем их писать
мы будем сталкиваться с распространёнными ошибками рассуждать над ними порой там будут философские проблемы и решать их средствами языка классы - это часть ооп Что такое ооп ооп - это объектно ориентированное программирование определение из Википедии вот такое скучное что это методология программирования основана На представлении программы в виде совокупности объектов каждый из которых является экземпляром определённого класса и первое с чем нам нужно разобраться - это то Что такое экземпляр и чем он отличается от класса это фундаментальная штука для понимания всего дальнейшего нарратива в этом уроке допустим у нас есть строка Давайте заприте тайп этой строки строка -
это экземпляр класса строка как это ни странно сам класс строка Вот давайте просто в Type передадим стр это экземпляр класса Type стр является классом а My string является экземпляром класса Чем отличается инс и класс я могу привести аналогию из реальной жизни класс - это чертёж дома а instance - это конкретный дом по одному чертежу может быть построено множество домов причём они могут отличаться достаточно сильно например один дом может быть жилой а второй сдаваться под нежилые объекты например офисы при этом построены они будут по одному чертежу синоним слова экземпляр - это instance или объект и экземпляры
класса могут называть по-разному класс стр это класс из стандартной библиотеки и нам нужно научиться писать свои классы как это делается для этого есть синтаксис класс в пайтоне объявляется всё следующим образом Ну и Давайте здесь просто напишем Pass Пусть это будет такой класс заглушка и попробуем запри а type my CL это экземпляр класса Type как и класс стр экземпляр класса Type давайте сделаем сейчас экземпляр класса My CL делается он следующим образом и ставим скобочки всё это уже My CL это экземпляр класса My CL Давайте перейдём к конкретным примерам и вы уже там поймёте как используется сам
класс и экземпляр класса Давайте напишем какой-то Монстр будет в нашей MG у класса есть метод init Метод инициализации класса это так называемый dunder метод Да методы - это методы в синтаксисе которого есть два подчёркивания спереди и сзади два подчёркивания - это dou und Ну Отсюда название dunder dunder методы также называют магическими методами они определяют как будет вести себя объект класса с разными конструкциями языка допустим когда объект засовывает функцию Print что он должен вывести функция init работает при создании экземпляра конкретного класса при создании орка нам нужно указать какие-то его свойства верно Он же не может просто
так появиться из ниоткуда пусть у него будет свой уровень А мы причём будем передавать его аргументами Что такое слово Self я объясню чуть позже пока просто будем писать его с него есть level int и возвращает функция init ничего None и в Self level мы кладём level и Давайте создадим экземпляр класса org с левелам один и Давайте заприте or и атрибут level который мы присвоили level был один он и здесь один что же такое слово Self слово Self - это экземпляр класса за который отвечает вот эта переменная то есть вот как будто бы мы прописали вот
здесь такой синтаксис то есть ра lv Но мы же не знаем там как мы будем называть переменную и нам нужно как-то конструировать её какие-то туда атрибуты атрибутов может быть очень много и мы передаём ключевое слово Self то есть Self - это экземпляр класса которые мы передаём в метод класса Давайте ещё сделаем какие-то атрибуты допустим Health Points это 100 умножить на левел то есть 100 хит поинтов будет у героя если левел о 200 если левел 2 и пусть у нас будет сила атаки которая тоже будет равна 100 у на level и заприте эти атрибуты класса атрибуты
Они же свойства принти да получилось О 100 100 если передадим сюда два то получится 2 200 200 давайте у класса сделаем метод Атак Ну на шорк же должен кого-то атаковать Обратите внимание что когда я нажимаю на скобочку сразу же появляется там аргумент Self первым так мы передаём экземпляр класса Давайте в принте просто напишем что org атакует со своей силой атаки or attacks with А как узнать его силу атаки она будет равна Self Attack Power и сюда напишем слово Power и Давайте вызовем вот Attack Power ставим и вызовем метод att Метод вызывается двумя скобочка как и
функция причём смотрите если здесь есть аргумент Self это экземпляр то мы его не передаём экземпляр как бы передаётся вот здесь вот он вот это Self и он должен запри здесь Attack Power и мы её сравним с принтом а Power который мы вызывали вот здесь 200 и or att Простите что я так долго на этом месте топчу но я встречаю непонимание Что делает слово Self причём смотрите если мы вызовем функцию А из класса org то наш код упадёт интерпретатор пишет что функция метод а пропустил один необходимый аргумент Self то есть пропущен экземпляр класса А экземпляру класса
не Откуда взяться здесь Потому что мы вызываем из объекта класса а не экземпляра класса важно сказать что атрибутами экземпляра класса можно управлять например взять и level поднять на единичку получится три также Давайте заприте объект org Вот это уберём а вывод не очень красивый то есть мы вообще не понимаем что это за орг был запри функция Print - это встроенная функция Python и для взаимодействия класса с различными встроенными функциями и ключевыми словами в классах есть магические методы dunder методы и чтобы управлять то что пользователь увидит в принте есть метод р а и Давайте здесь напишем что
мы хотим здесь видеть Наверное мы бы хотели увидеть уровень И ХП и мы пишем и принти нам уже какой-то человекочитаемый текст следующая тема в рамках классов - это наследование Давайте начнём с проблематики вот я написал Сейчас тот же класс org который я писал в предыдущей части Давайте напишем другой класс другого существа эф класс эф будет похож на класс org но с некоторыми исключениями например вот это строка будет идентична а мы также будем инициировать класс то есть сюда будет заходить level Ну и метод ИТ будет возвращать N так вот здесь у нас ошибка Но вот сейчас
пойдут отличия например л поинты у эльфа будет не 100 Уно а 50 а сила атаки у эльфа наоборот будет больше не 10 при этом у него будет также реализован метод Атак который будет похож на метод класса org только здесь мы сделаем не or attacks with Self Attack Power а ELF attacks with Self Attack Power и конечно же у него будет dunder метод р который будет отличаться словом ф вместо словом org ничего не замечаете мы полностью скопировали код А у нас есть принцип Don't repeat Yourself не копировать себя и именно для того чтобы избежать проблемы копирования
в Python есть наследование у классов Давайте напишем общий класс character я этот код сотру character - это какая-то подложка для написания других персонажей в нашей MM RPG игре так CL у него будет метод init будет также заходить level в него и возвращаться ничего эту строку мы повторяем Self level равно level Но дальше мы идём чуть по-другому смотрите у нас как Мы помним давайте я снова код верну вот у нас есть вторая строчка где - это 100 у а здесь 50 умножить на level Значит нам нужен какой-то м атрибут для каждого класса который будет хранить какое-то
базовое количество ХП Давайте Base Health Points назовём его и запишем следующую конструкцию Self Health Points равно Self Base Health Points умножить на level и также Self Attack Power равно Self Base так Power умножить нал Так я вот эти классы пока закомментировать они лежат рядом Они мне будут нужны так дальше Давайте скопирую метод а полностью отсюда раском сделаем отступ здесь Здесь у нас было написано мы напишем следующую штуку причём смотрите вот эти атрибуты они нигде не определены и интерпретатор нам подсвечивает их Мы конечно же их определим чуть позже и Давайте сде таже соль только здесь опять-таки
используем вот этот параметр Self name Всё мы сделали некий базовый класс И сейчас нам нужно от него от наследоваться нам нужно создать орка и Эльфа и мы пишем ла org и нам нужно определить три параметра в нём мы запишем их прямо после объявления класса То есть Не будет никакого метода init или чего-либо такого эта запись означает что я определил атрибуты класса атрибуты класса - это что-то типа констант класса С атрибутами класса можно делать более хитрые вещи но это выходит за рамки курса пока Давайте использовать их просто чтобы определять некоторые константы и эта константа у нас
будет равна 100 Вот здесь мы умножать на 100 она будет равна 100 а следующая Константа - это для орка она будет равна 10 и name org Обратите внимание мы в классе org не определяли никаких методов типа метода Атак или метода стр мы просто объявили три атрибута класса и дальше у инстанса этого класса будут все методы наследуемого класса Например у него будет метод а Давайте проверим level равно 1 Ну и заприте так вот это можно всё убрать и Давайте запри org 1 так запускаем и в терминале появилось or Attack with 10 Power и Давайте ещё Print
orc 1 затим instance класса org а org level 1 а hp-100 и так как у нас есть этот наследуемый класс Давайте тогда сделаем класс ф а ф вот здесь ф пропишет ф переопределить метод Атак и я здесь просто напишу что этот метод из класса наследника Давайте создадим Эльфа сюда Нужно пробросить обязательно Давайте Пусть 2 будет и у него метод а и посмотрим этот метод так сейчас будет из класса наследника или из наследуемого класса то есть вот этот вот is From CL inheritor то есть из класса наследника то есть мы таким образом в классе Наследники можем
переопределять методы наследуемого класса Давайте воспроизведён же Для этого нам нужно первым делом переопределить метод а первое что должно происходить в методе а нам нужно передать туда цель по которой идёт атака и давайте это сделаем тагет тип Target будет но такая запись в пайне недопустима допустима Вот такая запись мы возьмём в кавычки и из метода вернётся N это стираем и здесь нтим следующее нам нужно просто посмотреть для ди Бага что там происходит вообще внутри класса А я вызываю здесь Принт и Принт такую строку что а Self character name то есть существо которое является инстан сом класса
атакует переданное существо у него у этого существа вот такие хлс поинты И это существо атакует с силой атаки вот такой дальше что происходит Мы просто здесь возьмём и снимем у цели ЛС поинты которые равны а силе атаки существа которые наносит урон и Давайте здесь заприте ещё что после атаки у таргета вот такое-то количество хелс поинтов дальше Нам нужен метод что существо является живым которая вернёт True или Фолс Как узнать что существо живо Ну у него будет положительное количество хелс поинтов а дальше Давайте писать Сам бой бой будет представлять из себя просто функцию А и туда
будет передан первый персонаж причём Мы здесь уже можем использовать класс в тайпинг А мы просто внутри метода его не могли тогда использовать потому что он как бы определяется внутри класса и Car 2 и вернёт он Ну ничего не вернёт этот класс тут просто бой будет происходить бой идёт пока оба существа живы и вот это как раз-таки очень хороший пример где можно применить цикл while те 1 из Life и Carter 2 из Life дальше кте 1 атакует так тут аргумент Таргет атакует кте 2 если от атаки кте 2 не умер То есть он живой то он
атакует кте о давайте в конце затим 1 причём наверное вот так вот сделаем и Car 2 и вот здесь is life corrector 1 is the life character 2 is life Так ну что давайте инициализирует поехали Итак смотрите что у нас получилось в выводе персонажи начали друг друга бить вот орк атакует Эльфа после атаки у эльфа 40 ХП затем Эльф атакует орка после атаки у 85 ХП и так далее происходит пока Эльф не умирает и в итоге у орка 40 ХП и он живой А у эльфа ноль ХП и он неживой Итак у нас написано базовая
боёвка в игре Но это неинтересно и к нам приходит какой-то продакт менеджер или какой-то наш заказчик и говорит что игру нужно улучшить и выдаёт нам такое задание нам нужно реализовать два вида существ Эльф и орк и у них должны быть свои свойства а свойства следующее это эльфы базовое количество ХП 50 базовая атака 15 и базовая защита есть 10 и есть такой перк свойства у эльфа эльфы бьют по существам у которых меньше 30% ХП в два раза сильнее и при этом есть Орки 100 ХП базовая атака 10 и базовая защита тоже 10 и Орки увеличивают защиту
в три раза если у них меньше 50 ХП вот такое свойство и нам сейчас нужно очень хитро инкапсулировать эту логику В класс Наследник и В наследуемые классы то есть перки - это как раз-таки реализация для классов наследников А вот вся эта логика должна пойти в класс наследуемые первое что нам нужно - это переписать метод Атак это глубоко философская проблема она лежит здесь вот смотрите Я как Эльф когда атакую орка Я в методе Атак должен просто выпустить стрелу Каким образом Стрела попадёт в орка и каким образом там будут сниматься ХП Это зависит от свойств орка и
отнимание ххп у орка должно быть инкапсулированная получить урон и в методе го damage у нас будет передаваться damage который равен Self Attack Power я употребил слово инкапсулировать инкапсуляция - это важное свойство класса А что значит инкапсуляция мы это свойство встречаем в реальной жизни Вот например у нас есть автомобиль Это хороший пример инкапсуляции у водителя есть интерфейс которым он управляет это там несколько кнопок руль ручка коробки передач автомобиль без инкапсуляции выглядел бы так вы бы вручную переставлять шестерни у коробки передач впрыскивать бы топливо бы сами в камеру сгорания управляли бы сами цилиндрами двигателя и так далее
но в автомобиле управление упрощено и инкапсуляция - это как раз-таки скрытие вот этой всей внутренней логики внутри класса и наружу должны быть выведены всего лишь несколько методов причём у классов есть ещ не несколько свойств эти свойства любят спрашивать на собеседовании это полиморфизм инкапсуляция и наследование инкапсуляции я сейчас объяснил Давайте объясню что такое полиморфизм и наследование полиморфизм - это возможность переопределять поведение в какой-либо конструкции языка этим занимаются в питоне дандер методы то есть мы можем переопределить как объект будет вести себя с встроенной функции Print или как объект можно допустим пройти в цикле for объект и так
далее наследование это чем мы занимались собственно мы определили класс Наследник и от него от наследовать свой код Итак что должно произойти в методе damage так в го damage должен зайти dage он ра возвращать мы будем мы просто сечас п давайте договоримся что защита у нас будет работать следующим образом у нас будет она как бы в процентах то есть будет следующим образом определяться это дальше нам нужно его порезать об защиту вот я предлагаю вот такую формулу Self Self мы будем определять и разделить на 100 дальше у нас вот в этой операции Верн а нам нужно для
ровного счёта нам нужно чтобы у нас были инты и я вот здесь просто предлагаю damage округлить и вот здесь SF Health Points равно Self Health Points мину damage дальше нам нужно определить что же такое защита защита будет определена как свойство класса А что такое свойство класса а синтаксически свойство класса загоняется под декоратор Property это необычный синтаксис Сейчас вы встречаете его первый раз я покажу дальше как пользоваться декоратором в следующих главах И я также сейчас покажу Каким образом пользоваться Property Итак проперти будет называться Defense собственно мы уже его использовали вот здесь Defense будет равен Self Base
Defense умножить на уровень и будет возвращаться int у этого класса Итак нам нужно сейчас у орка определить bas Defense Давайте вот это вот всё сотрём точнее Fight пока оставим У нас есть org и ф и у нас нужно Base Defense определить мы берём его из нашего задания которое мы смотрели первоначально у эльфа будет bas Def 10 у орка будет bas Def 15 к сожалению у меня тут изначально параметр стоял но я сейчас его поправил чтобы они отличались Итак org bas Defense 15 10 Давайте инициирует Property Defense как оно вообще работает or level 1 и Давайте
запри org 1ра То есть он зашёл Вот в это свойство тут сделал расчёты и вернул Defense вот смотрите Property работает следующим образом если мы захотим А orc 1 Defense назначить допустим равно 20 вот здесь Извне то код свалится с ошибкой что этот объект нельзя переопределить то есть Property - это такой вид инкапсуляции Когда нам нужно пользоваться чем-то как атрибутом при этом должны произойти какие-то вычисления внутри и чтобы в этот атрибут одновременно нельзя было присваивать значение давайте сейчас определим перки Давайте первым определим перк орка орк увеличивать защиту в три раза если у него меньше п ХП
Это значит что нам просто сейчас нужно пойти в кла org и переопределить Property Defense Итак что такое Defense вначале нам нужно получить какую-то стандартную защиту орка и неплохо бы вот в этом классе наследнике вызвать вот этот метод его можно вызвать очень легко Для этого нужно написать следующее defens равно су су Это значит что мы Обращаемся к классу наследнику и там мы вызываем Property Defense Давайте просто сейчас вернём вот этот Defense и просто опять-таки затим что всё работает вот этот принт Пусть вот работает да Всё вернулось 15 То есть у нас инициализирован а это Property внутри
переопределения и накинешь If Self heals Points меньше пся Defense это Defense Умно на 3 и возвратим Ден давайте сейчас проверим что наш перк исполнился у орка и просто переопределить He Points Пусть оно будет равно 49 это меньше п и посмотрим чему будет равен О он равен 45 ует у эльфа всё чуть хитрее смотрите у эльфа бьют по существам у которых меньше 30% ХП в два раза сильнее а нам нужно написать свойство которое определит процент ХП и Мы это сделаем в классе те потому что Ну возможно появятся какие-то другие существа или какие-то другие существа с перками
с какими-то и нам нужно знать процент от ХП будет функция Health Points percent и нам нужно будет вернуть а Self Health Points разделить на Self Max Health Points и Давайте Max Health Points тоже сделаем в виде Property Ma Points level умножить на так я по-моему неправильно написал давайте я скопирую отсюда атрибут Так давайте на нашем орке вызовем межно 49% что мы вот здесь забыли умножить на 100 Всё 49% возвращается Итак Как должен выглядеть перк Эльфа перк Эльфа должен выглядеть следующим образом смотрите как будет если Таргет heth Point per меньше 30 то T Power равно Self
Attack Power ум 3 вот здесь нам тоже нужно определить Attack Power просто здесь будет S Attack Power и Attack Power вставляется вот сюда давайте у орка посмотрим что перк прокл то есть исполнился Мы у орка сделаем 29 ХП а создадим Эльфа и Ф1 а Target org О исполним так да конечно не Attack Power А А так у нас тут нет никаких принтов давайте а вот Я вот здесь за прин Так это будет строка и а Power туда передадим Attack Power 45 то есть всё наш перк сработал и давайте сейчас сделаем новый бой функция у нас
уже есть ирим кто сейчас победит так сейчас здесь Мы инициирует отсюда ещё уберу Принт и в этом бою тоже победил ок и Эльф погиб классы - это очень сложная тема она перекликается с каким-то представлением о реальном мире там даже есть какой-то некий объём философии какой класс должен управлять и чем и так далее когда я сам изучал язык классы были непонятными у меня на постижение этой темы ушёл наверное полгода и я до сих пор продолжаю открывать что-то в классах новое для себя Поэтому если вам этот урок показался не переживайте продолжайте практиковаться с опытом придёт понимание этой
темы в конце есть домашка советую её выполнить Итак декораторы вы заметили что Я использовал вот такую конструкцию с символом который почему-то у нас называется собака в английском языке он называется декоратор про Вот давайте научимся писать свои декораторы Что такое декоратор декоратор - это синтаксический сахар синтаксический сахар - это конструкция языка которая делает более быстрым написание каких-то частотных паттернов и в пайтоне декоратор - это функция которая принимает как аргумент другую функцию и как-то обогащает поведение вот этой принимаемой функции Давайте посмотрим на реальном примере напишем ма декоратор который внутри будет принимать функцию внутри My decorator объявляется функция
wer переводится как обёртка Давайте здесь вот заприте Что что-то случилось до того как функция была вызвана Вот здесь мы вызовем функцию А здесь напишем что что-то случилось после того как функция была вызвана и нам нужно вернуть функцию вра как объект это конструкция как объявляется декоратор самый простой и давайте у нас будет Функция которую мы захотим обернуть функция hint Hello и как работает декоратор он работает следующим образом я сейчас покажу запись какой она бы была без синтаксического сахара сюда мы передам здесь мы делаем вызов функции Вот давайте заприте вот строчка Что что-то случилось до вызова функции
Вот это отработала сама функция Print Hello и вот это что-то что отработала после функции и эта запись эквивалентно вот такой записи мы просто My decorator объявляем над функцией я это закомментировать Say Hello всё тоже самое то есть вот эта запись эквивалентна вот этой записи это и делает декоратор Давайте чуток усложни функцию Say Hello Пусть функция Say Hello будет принимать аргумент name который представляет из себя строку Так ну и Давайте тут сразу же напишем что она ничего не возвращает и мы будем здороваться Hello name нам нужно декоратор улучшить То есть у нас функцию сейчас прокиды аргументы
функции без аргументов функции без аргументов Ну это там редкие достаточно функции А в основном функции бывают с аргументами И для этого мы используем А Арк quarks arks прокиды ется сюда и прокиды в функцию и Давайте Say Hello name Саша всё наш декларатор опять отработал он сделал что-то До того как функция вызвалась и сделал после того как функция вызвалась А внутрь были пробро нужные аргументы при этом Сейчас наша функция ничего не возвращала давайте мы сделаем так чтобы функция что-то возвращала Пусть функция будет устроена вот таким образом то есть мы принимаем а иб Аргументы и возвращаем их
суммум переписать наш декоратор следующим образом вот здесь у нас будет какой-то и из функции wrapper мы этот вернём и Давайте тут затим Numbers А = 1 B = 2 и Print result чтобы удостовериться запускаем вот у нас что-то случилось до того как мы вызвали функцию потом мы зашли внутрь функции исполнилось вот эта строка adding Numbers вернулся результат а затем что-то случилось после исполнения функции и дальше всё это возвратилась в результат и мы заприте результат собственно вот наш вывод говорит о том же самом Дальше я бы хотел бы сделать небольшую практику по декоратором и обратиться к
ресурсу Visual crossing Visual crossing - это такой бесплатной API с погодой вам нужно зарегистрировать там аккаунт собственно ссылка будет в описании ссылки используемые в курсе после того как вы зарегать и залогинится у вас вот во вкладке аккаунт а будет AP Ke вот этот AP Ke нужно скопировать в проект если у вас вдруг не получилось зарегистрироваться на этом ресурсе или вам лень например то сделайте просто по-другому сходите к ка бинанса ещё раз очень важно никогда не храните различные AP ключи или какие-либо токены в своей кодовой базе я это сделал в качестве исключения информация о том как
хранить секреты выходит за рамки этого курса но когда столкнётся загуглите это Итак у нас есть Аки Представьте что у нас есть какой-то сервис который входит в AP Visual crossing за погодой и мы как-то своим пользователям там в зависимости от погоды какое-то поведение предлагаем иногда до AP нельзя Достучаться и нам нужно сделать механизм трав Что такое й это когда сервис а недоступен но мы через какое-то время Обращаемся к нему ещё раз Итак давайте начнём с того что напишем Get weather by hours for Day У нас тут будет заходить Date в виде строки будет заходить в виде
Роки будет возвращаться такой объект дальше мы импортируем библиотеку requests и делаем следующее response requests Get А дальше нам нужно вставить URL туда на сайте Visual crossing там достаточно хитрая система аутентификации это когда сервер узнаёт Кто вы такой URL выглядит следующим образом это всё описано в документации То есть я это там никак не придумывал тут достаточно хитрый URL в который мы вставляем Сити и два раза дату и вот сюда вставляем наш ключ и сюда передаём URL и всё и Давайте посмотрим что нам вернулось в ответ мы передадим следующим образом будет написано вот так 2023 допустим 0804
и City Лондон UK передаём Date равно Date City равно City и сейчас всё должно запри Давайте посмотрим Итак нам вернулась Вот такая сложная структура Давайте её скопирую и посмотрим как она выглядит вообще я чтобы посмотреть J структуру хожу на сайт Jon Format он тоже будет в описании в ссылках используемых в курсе так я раскладываю и вот что у нас получилось у нас здесь внутри хранятся дни мы запрашивали за один день собственно там всего один объект и внутри нашего дня вот этого одного есть температура по часам температура по часам там на каждый час приходит вот такой
объект и у него есть различные поля типа там Какая средняя температура была в этом часе и какой был идекс uv индекс - это ультрафиолетовый индекс Давайте представим что наш сервис делает следующее он определяет В какие часы а uv индекс опасны Что значит uuv индекс опасны Это значит что он больше либо равен трём если uv индекс больше либо равно трём то мы будем своему пользователю писать что воспользуетесь солнцезащитным кремом Итак А чтобы достать вот эту структуру по часам а нам нужна только по часам мы делаем следующее by Days равно resp J Days и нам нужно достать
погоду по часам by hours by Days Но и здесь ещ Вот так вот и вернём weather by hours Давайте ещё напишем функцию которая мы видели что там температура в Фаренгейтах А мы сейчас напишем функцию которая перегонит Фаренгейты в Цельсии так это закроем так заходит т и давайте мы int выкинем а уберём там дробную часть и делаем следующее заворачиваем функцию Round следующее выражение а temperature -32 Умно на 5 раз 9 так перегоняет Фаренгейт в Цельсии вот по такой формуле так только не цельсиум а цельсиус нейминг очень важен так и Наша задача - это достать опасные часы
Dangerous hours Так Сюда войдёт Как раз-таки наш weather by Hour который мы вернём вот отсюда тип у него это лист диктор лист Дик список Danger hours и for wea in weather by Hour мы делаем следующее uv икс равно wether U Index Time рано wether daytime cus temperature на равна Фаренгейту цельсиус и так и здесь дальше условие если у нас опасный час это uv индекс больше либо равно 3М делаем следующее добавляем наши опасные час вот таю а так здесь неправильно и возвращаем опасные часы Вот делаем wether by Hour и Danger HS вызываем вот так Так у
нас сечас я перемену здесь так запускаем сейчас вроде всё должно работать Да у нас в этот день получи чем Причём здесь декораторы вот мы написали какой-то базовый функционал но Представьте что у нас запрос не прошёл с первого раза а это достаточно частотный случай нам нужно запрос сделать таким образом чтобы он проходил несколько раз Вот давайте я сейчас вырублю wi-fi у себя и посмотрю А как мы свалим с ошибкой Вот мы свалились с ошибкой request exceptions Connection Error А давайте завер в декоратор обработку ошибки и если возникает ошибка чтобы он ещё раз пошёл в AP Visual
crossing Только сначала через 5 секунд а потом через 30 Итак пишем декоратор Def retry А сюда входит функция внутри Я назову это wrapper retry он принимает аргументы разные аргументы т у нас будут через 5 и 30 секунд и Seconds in я делаю следующее я делаю TR и возвращаю функцию с аргументами и аргументами и если случись Exception нам надо импортировать From request exceptions request Exception если случился request Exception то я запри что failed to get Data Ring in так сейчас строку сделаю Seconds Seconds и здесь мы ещё напишем чтобы скрипт уснул на количество секунд Time вот
при этом смотрите как исполнение будет двигаться вот у нас есть первый Он попробует вызвать функцию после уснёт на 5 секунд вот на эти п потом вот в этой переменной окажется 30 и он попробует вызвать и уснёт уже на 30 секунд и в конце нам нужно вызвать ещё раз после 30 секунд последний ретрай сделать и если уже не получилось это то он свалится и нам нужно вернуть raer retry функцию не исполняя её вот такой декоратор получился и мы просто этот вызов де так я сейчас вызову Так у нас упала с ошибкой Давайте посмотрим где это так
да Я вот здесь забыл звёздочку поехали а итак у меня сейчас работал интернет ВС вернулось вот видим наш опасный час вернулся Я сейчас вырубаю интернет и исполняем сейчас а всё Fail to get Data retrying in 5 Seconds через 5 секунд он опять исполняется и сейчас ждёт 30 секунд чтобы попробовать ещё раз я вот сейчас врубаю интернет и Давайте посмотрим что сейчас получится и да всё сработало на третий раз он забрал данные Давайте напишем простенько Telegram Бота Что нужно сделать чтобы написать Telegram Бота ну во-первых его нужно зарегать для этого нужно зайти в Bot father это
бот для управления ботами официальный от телеграма естественно Вот у него юзернейм но ссылку я приложу на него в ссылках используемые в курсе А я сейчас начну нового Бота Командо New Bot И назову его Давайте Пусть Вот так вот будет назван сейчас нам надо его назвать я его для никнейма я его назову вот так вот а всё он меня поздравляет говорит что регистрация закончена и вот здесь он написал мне мой токен я этот токен копирую к себя токен равно так и Вставляю его вот сюда делать Бота я буду с помощью вот этой библиотеки P Telegram Bot
App мы сейчас её установим идём в терминал и копируем Pip Install P Telegram Bot всё супер У нас появилось естественно документация там же лежит Как пользоваться этой библиотекой со снипет кода Я очень всегда советую смотреть в документацию если что-то пишете не руководствоваться только гайдами мы сейчас напишем сначала простого который будет отвечать нам Эхо то есть дублировать наше сообщение и прислать его в ответ Итак импортируем класс телебот первым делом Несмотря на то что библиотека называлась Telegram в коде она фигурирует под названием телебот и нам нужно инициировать ин класса ра и у Бота всегда нужно сделать обработчик
команды Start и команды Help чтобы сделать обработчик этой команды нам нужно использовать декоратор message handler который является методом класса telebot Bot message handler А сюда мы кладём команды команда Start и команда Help и дальше у нас идёт функция Send welcome Так Сюда у нас проходит mess Давайте его затим и т вызывается дальше мед и мы Давайте ответим вот так а что там происходит вообще смотри мы инициали Бота бо инициализирован значит что в телеграме под капотом скрипт сходит в Telegram и скажет что все сообщения которые должны приходить в бот нужно слать на наш сервер мы сейчас
запустим небольшой сервер сервер запускается следующим образом Infinity polling функция вызывается а метод Infinity poing у класса telebot наш сервер стартанул каждое сообщение которое прокиды ется в наш бот приходит к нам на сервер и дальше в зависимости от того что пришло вызывается обработчик message Hander Вот давайте сейчас нужно запустить этот скрипт чтобы он работал Внутри там в Infinity polling какой-то запущен бесконечный while loop что-то типа while True и он крутится И ждёт сообщений мы просто сейчас идём в Telegram заходим вот здесь Бота и нажимаем команду ста старт и он отвечает hudi How are you doing круто
всё получилось давайте сейчас напишем обработчик всех остальных сообщений которые будут просто отвечать тем же сообщениям в ответ собака бот message handler сюда мы сделаем следующее вот каждый меседж который приходит если это не команда Стар или Help будет попадать вот в этот обработчик для того чтобы сделать это нам нужно сделать лямбда функцию которая просто вернёт True и здесь мы пишем E All mess А давайте затим mess причём смотрите мы уже принти mess в прошлом сообщении То есть у него есть какие-то атрибуты всякие разные например вот здесь есть это мой аккаунт Являюсь ли я Ботом Нет не
являюсь ID мой здесь расположен и что мы делаем чтобы ответить всем мы вызываем у месед Property Text и вызываем вот так Reply to message message Text то есть ответь на message медж текстом вот Я сейчас перезагружу скрипт и Давайте попробуем я напишу Хай и он ответил мне Хай при этом Вот сообщение которое я написал Но нам же не нужен хобот верно хобот - это какая-то чушь Ну мы просто проверили что он работает и всё Давайте напишем следующее Давайте пойдём в апе бинанса и пусть наш бот будет выдавать цены нескольких криптовалют я останавливаю Бота и Давайте
сделаем следующее у меня будет Вот такой словарик а crypto name to ticker и вот здесь имя Bitcoin Вот такой тикер у него то есть мы будем btc usdt получать стоимость и пусть будет здесь Эу и Dodge криптовалюты вот что будет проходить на команду Старт на команду Старт мы будем делать следующее так вот это всё сотрём А у телеграма есть такая штука Keyboard markup это такие кнопочки вот что-то типа кнопки Старт Давайте создадим свою кнопочку такую эта кнопочка будет следующая импортируется из From teleb types Keyboard Mar и мы создадим тут Mar равный rep Keyboard markup и
здесь передаётся такой аргумент Row то есть ширина ячейки туда передаётся количество наших кнопочек их будет три forp in в словаре keb name to ticket Case будем делать следующее it Button нам нужно создать кнопки то есть наполнить структуру вот эту кнопками для того чтобы это сделать нам нужно е импортировать вот такую штуку Ke But Button и сюда передадим crypt name markup Add item Button и дальше выходим Bot send message А дальше мы ему пишем в какой чат нужно отправить message и КСТ choose A crypto и вот здесь Reply markup слаем Mar Так давайте запустим Бота и
проверим что он нам шлёт кнопочки Так я вот это всё сотру и у меня появилась кнопка Старт я нажимаю старт и у меня здесь essp и менюшка из кнопок если я выберу какую-то одну из кнопок то ничего не произойдёт потому что нам нужно сделать обработчик кнопок идём и делаем обработчик кнопок причём когда к нам прилетает Мы выбираем какую-то из кнопок просто текст и нам нужно сделать обработчик на типы текста которые хранятся в кнопках чтобы сделать это нам нужно сделать следующее сюда передадим лямда функцию у нас приходит mess и мы возвратим mess tck ин делаем которая
получает mess и делат следующее crypt равно mess нам нужно сразу ке с которым мы подм ке храни вот в этом словаре мы вызва его по клю и на нужно Price Price Вот давайте PR by ticker здесь функцию вызовем мы пока её ещё не определили но сюда у нас войдёт тикер и дальше отправим Bot send message mess Chat ID и вот здесь такую штуку сделаем price of crypt name to usdt is PR А что у нас не так у нас не определена функция Get ке сейчас напишем эту функцию Так что она делает она принимает тикер и
с этим тике идёт в бинанса мы уже не раз ходили в AP бинанса Я просто скопирую э функцию Так нам надо вернуть т и нам нужно заимку requests так всё Вроде должно сейчас работать запускаем так наш бот запустился идём и Давайте цену биткоина узнаем price of Bitcoin 37.000 долларов Давайте проверим Что это у нас отработал код Так ну это у нас отработал код только мы ничего не принти здесь Давайте я просто сделаю здесь Print crypt name так вот так перезапуск давайте цену Этери price of eum 2.000 долларов э Давайте посмотрим Ну вот он написал риу
То есть всё работает всё Поздравляю Вы написали простейшего Telegram Бота который ходит в апе к другому сервису daytime частенько во время написания кода нам нужно как-то работать со временем и датами и в пайне за это отвечает модуль daytime Итак как это делается нам нужно импортировать модуль daytime и в модуле daytime мы можем достать время UTC равно Day и сюда Нужно передать часовой пояс и дава принти его а вот в данный момент э 10 часов по UTC например от Москвы это время отличается на 3 часа от часового пояса Москвы можно также убрать вот этот аргумент мы
сюда просто передали часовой пояс и достать текущее время текущее время на моей машине а 1213 Да у меня сейчас именно столько же когда мы передаём А время в запросе например А мы делаем Это в ISO формате чтобы получить время в и формате у объекта есть метод и формат оно отличается чуть-чуть от того что мы видим в принте здесь есть такая буква посередине которая отделяет дату и время и дальше уже вот такой строчный объект заворачивается в J Какие ещё есть методы у обекта мы вообще можем вызвать какими-то свойствами щего объекта времени Например год месяц день час
минуту Ну и так далее Давайте заприте это И вот сегодня 2023 год одиннадцатый месяц дй день 12 15 мину как ещ можно собрать можно инициализировать следующим образом можно вызвать daytime Time и сюда передать прямо через аргументы следующим образом Ну и Давайте зам получилось то что мы передали в объект можно работать не только со временем но и с датой работа с датой идт следующим образом мы можем вызвать curent Date dat Time Date и today и заприте её это тоже объект времени но у него нет часов минут и секунд причём объект времени можно получить из объекта Date
Time то есть Давайте обратно вернём к C Date Time Date Time Now и current Date равно current Date Time Date и затим current Date получилось то же самое иногда бывают такие ситуации что нам нужно получить объект daytime день назад получить время которое было ровно 24 часа назад и это делается следующим образом у нас есть Day и будет следующим образом получен мину Time Del Days полу число Ив то время было вчера в тот же момент времени иногда бывают такие ситуации когда daytime объект нужно вызвать в каком-то читаемом виде чтобы ей мог воспользоваться человек если бы мы
на сайте допустим где-то увидели Вот такое время то мы бы наверное ужаснулись то есть Нам нужен какой-то более читаемый формат и у daytime объекта есть метод для работы с этим это метод stref Time в метод нужно передать так называемые формат коды эти формат коды есть в документации Time объекта чтобы туда попасть достаточно просто загуглить stref Time и Format codes Давайте преобразуем текущую дату Во что-то читаемое так у нас есть current Day Time и Давайте напишем следующим образом strf Time и формат коды накидывай сюда и принти всё это Sunday 12 ноября 2023 года с помощью формат
кодов дату можно вообще полностью сделать так как вам нужно её отображать также Иногда случается Так что к нам приходит какая-то дата в ISO формате и нам нужно её преобразовать в объект чтобы работать с ним внутри кода и сделать очень легко daytime From ISO Format и сюда прокиды ISO формат и принти Давайте Type myd Time и сам My day Time заприте Да получился объект класса Day Time и он перегнал его в из формата в объект с которым уже там можно работать вызывать какие-то атрибуты вызывать какие-то методы и так далее работа с файлами частенько программист на Python
сталкивается с такой задачей что нужно либо что-то прочитать из файла либо что-то записать файл и Давайте посмотрим как это происходит Я сейчас создам здесь папку Files и буду туда скидывать всё что буду создавать в этом уроке Давайте первым делом пишем файл какой-то J я импортируют дата и что я делаю первым делом Я открываю файл папка фа сейчас пустая я могу там Создать файл Пусть он будет называться Data json дальше сюда передаётся режим в котором открывается файл режим сейчас будет открыт на запись от английского слова wi писать начинается слово Wi на букву w и дальше Мы
из библиотеки J вызываем метод Dump метод Dump записывает информацию файл а метод дам вызывается с такими аргументами мы передаём дату потом передаём файл и я ещё Сейчас передам такой аргумент он называется indent это отступы чтобы файл выглядел красивей запускаю всё файл запускался иду смотреть результат вот лежит Data Jon А и записались все поля то есть с помощью такой вот такого инструмента можно смотреть какие-то большие структуры данных если бы мы сюда не записали аргумент indent то файл бы получился вот таким ну это не очень удобно когда он в одну строку мы забыли сейчас сделать очень важное
дело файл после того как мы с ним поработали нужно закрыть а и мы вызываем метод Close запускаем всё произошло то же самое но если забывать закрывать файлы там при работе продакшена например то может произойти утечка памяти Может там возникнуть много процессов которые работают с файлами и так далее и ваш Кэн начнёт работать не так как вы хотите Давайте прочитаем сейчас из файла информацию чтение происходит следующим образом нам нужно открыть файл на чтение файл у нас уже существует Мы только что его создали и вызвать метод J L сюда передаём файл интим наши данные же не забываем
файл закрыть и мы получили именно тот же J который клали файл второй распространённый формат файлов с которыми Приходится работать программисту - это файл CSV Что такое файл CSV CSV - это построчный набор данных разделённый каким-то сепаратором чаще всего запятой как он выглядит пусть у нас есть вот такие данные это также набор каких-то людей у которых есть имя возраст и род деятельности импортируем библиотеку CSV которая идёт в стандартный поставки питона и делаем следующее Мы открываем файл Пусть он будет называться Person CSV также открываем его на запись и делаем следующее а создаём объект CSV Writer и сюда
передаём файл и в CSV Writer пишем все строки и закрываем файл запускаем и смотрим Что у нас получилось так вот здесь а нам по HR пишет что есть профессиональные Тулы работы с CSV файлами но мы это закрываем и Мы записали файл CSV файл обычно представляют из себя следующее очень похоже на Excel первая строка - это какие-то заголовки чему посвящён тот или иной столбец и дальше идут Столбцы В каждой строчке новые через запятую давайте сейчас прочитаем этот же файл читать Удобнее всего через такой класс в библиотеке CSV он называется dict Reader открываем файл на чтение инициирует
Reader КТР сюда передаём файл и дальше Просто итерируемый и закроем файл обязательно и мы просто прочитали построчно строки из CSV файла кроме строки с именем столбцов но имя столбцов мы перечисляли вот здесь когда обращались к этому диктум а каждый объект Это был км при этом у нас сейчас есть файл Там три строки всего с данными и допустим Нам нужно в Person CSV Добавить новых людей Пусть они будут Вот такими как это делать Мы открываем CSV файл в режиме Add это буковка A то есть добавить У нас есть поля это name так я тут Давайте консистентность
с одной кавычкой и дальше мы делаем следующим образом мы объявляем CSV dict Writer и он создаётся следующим образом мы инициирует Field names и просто пишем wr rows и передаём persons туда и не забываем File Close сделать запускаем смотрим persons ещё две строки добавлено менеджеры контекста когда мы в предыдущем уроке работали с файлами Я всегда вызывал файл методом Open и потом делал файл Close и понятно что иногда где-то ты забудешь вызвать метод Close и вот когда есть две такие операции которые нужно вызвать вместе То есть открыть и закрыть например или какие-то две другие операции мы используем
текста Как выглядит синтаксис Я просто скопировал код из другого урока и у меня вот здесь в файловой системе лежит фй Person CSV который мы сделали в прошлом уроке Я сейчас напишу этот же код с использованием менеджера контекста with Open Person CSV read s f и дальше Просто скопирую код это сотру и всё менеджер контекста сработал и я могу не волноваться что я забыл закрыть файл всё очень легко есть две парные операции Значит вам нужен менеджер контекста изменяемые и неизменяемые типы данных отсутствие те приводит к самым сложным багам которые вы можете словить на первых порах эти
баги ещ очень тяжело расследовать хотя за неизменяемыми и изменяемыми типами данных стоит достаточно простая концепция Чтобы объяснить концепцию изменяемых и неизменяемых типов данных мне Нужно привести вам несколько примеров Давайте создадим переменную X которая ра 42 и сделаем такую штуку Y присвоить в переменную Y значение переменной X и Давайте заприте вызов функции ID с объектом X А что делает функция ID функция ID возвращает ячейку памяти а точнее идентификатор ячейки памяти в которой хранится значение переменной X Вот в такой ячейке памяти хранится объект X и Давайте заприте ID объекта Y это абсолютно одинаковые объекты и они ссылаются
на одну ячейку памяти и значение у них тоже одинаковое Давайте вот здесь напишем следующее Y п рано 1 просто к значению Y прибавим о перед вызовом за принти ID и значение XY и после того как мы прибавили к и 1 затим также ID обеих переменных и их значения А Обратите внимание на вывод у нас ячейка памяти которая хранит объект Y поменялась потому что мы там поменяли объект его значение сейчас 43 то есть после того как мы изменили переменную Y они стали ссылаться на разные ячейки памяти Итак числа при изменении кладутся просто в другую ячейку памяти
то есть Старый ассоциированный объект полностью удаляется но с листом происходит не так пусть у нас есть My list 1 2 3 и будет Another L мы ему присвоили и Давайте запри ID My L и ID Another L они одинаковые как мы видим но Давайте добавим 4 так и сюда за принти значение mylist и она за list и этот же Принт вызовем здесь запускаем и смотрите у нас они как ссылались на одну ячейку памяти так и ссылаются на ту же ячейку памяти при этом мы изменяли только объект наза list но изменился и My list и определение
неизменяемых структур данных такое что неизменяемая структура данных Однажды будучи инициированной не может быть изменена если мы её изменяем то создаётся Новый объект в новой ячейке памяти и переменная начинает ссылаться на неё изменяемые же типа данных будучи единожды созданным может по-разному меняться наполняться что-то с ними ещё может происходить Но это будет Объект который ссылается на одну ячейку памяти и не изменяемые типы данных это int string flot tle Bull NAN и другие а изменяемые типы данных - это lct и Set для того чтобы понять ссылается ли объект на одну и ту же ячейку памяти в пайне есть
ключевое слово is Вот например мы создадим две переменных А и B и они обе будут равны N и затим А из B это True и допустим Мы также создадим 1 он равен будет 1 2 3 и лист 2 в него мы присвоили 1 и затим также лист 1 из list 2 это тоже True потому что оба объекта ссылаются на одну и ту же ячейку памяти а ключевое слово is используется для того чтобы определить что объекты ссылаются на одну и ту же ячейку памяти если мы вст 2 приво такой же лист как и вли 1 то
в 2 вернётся fse при этом эти объекты будут равны если мы их сравним то они будут равны это будет True то есть они равны друг другу Но ссылаются на разные ячейки памяти То есть это два разных объекта который внутри себя держат одинаковое значение из этого есть одно следствие когда мы пытаемся сравнить какую-то переменную с булевы значением или СН то нам нужно употреблять ключевое слово вот смотрите Например у нас есть какая-то переменная которая равно True И если мы сделаем вот такой вызов то это будет плохим тоном он вернёт True Но даже IDE подсвечивает что мы нарушили
один из стандартов pep8 Поэтому нужно писать вот так some variable is True она также возвращает True но IDE уже здесь не ругается на нас и также СН и также вернулась Т С mutable и mutable Type идёт ряд распространённых неприятных ошибок и мы сейчас их рассмотрим первая ошибка - это копирование объектов допустим у нас есть какая-то структура My dict которая равна следующему и нам нужно сделать его копию и мы просто делаем следующим образом у нас dict присваиваем My dict и как-то где-нибудь в коде в другом месте мы просто изменяем ключ X Делаем его равным 100 и
эта запись изменяет начальный объект а нам такое поведение не всегда нужно Мы хотим как-то управлять нашими объектами и скорее всего вот эту копию мы создавали для того чтобы как-то её модифицировать отдельно от первоначального объекта И когда нам нужно такое сделать у КТА есть специальный метод копия Мадик копия и А давайте также его изменим и затим My dict и всё первоначальный объект остался без изменения а второй мы изменили и уже как-то можем с ним работать отдельно от первого объекта но это не всегда работает когда в значениях у ключей лежат объекты например лист вот у нас допустим
есть такой данные пациента и у него есть какой-то He Rate и вот он там пусть будет равен 60 61 63 60 61 и мы берём и копируем туда patient Data и допустим как-то хотим с копией поработать и добавляем туда в ключ He Rate ещё какой-то пульс хотим добавить допустим 63 и Давайте посмотрим а изменится ли от этого patient Data И после этого добавления изменились оба объекта Вот посмотрите в конце обоих списков лежит 63 значения как этого избежать в пайтоне есть такой механизм From Copy это также библиотека которая поставляется с языком мы импортируем функцию Deep Cop
и вот этот копи мы не используем мы берём Deep Cop добавляем туда patients и также изменяем затем patient Data Copy и Обратите внимание уже первый объект не изменился Я рекомендую вообще всегда не использовать метод копи у КТА а использовать Deep Copy сразу же потому что если какие-то структуры будут mutable внутри диктовка Точнее они скопирую также по ссылке и вы когда будете модифицировать эти объекты изначальные объекты Также будут модифицировать и иногда если вы просто словили такой баг с ним можно провести вообще многие многие часы и даже дни следующая распространённая ошибка это функции которые изменяют свои аргументы
вот у нас есть какая-то какая-то функция где происходят какие-то вычисления и мы сюда передадим какой-то лист из интов и пусть функция возвращает N и в процессе функции вот здесь происходят какие-то вычисления А вот здесь просто мы берём лист и гроха и вот у нас есть My list function with computation мы сюда передаём list равно My L и заприте My list я ожидаю сейчас что там будет значение 1 2 но так я вот здесь Забыл да и точи но там будет пустой массив так происходит потому что лист - это mutable Type и функцию мы передаём ссылку
на этот объект этот объект вычищаем ну и соответственно изменяется объект по ссылке и лучше передавать в такие функции которые из первоначальный объект копия объектов Deep Copy My list и тогда и тогда всё будет нормально изначальный лист остался неизменным либо иногда Нам действительно нужно модифицировать объект но лучше тогда возвращать уже изменённый объект из функции и присваивать его в переменную у нас функция осталась абсолютно Такой же А я просто тут допишу что Return list и вот здесь я mylist вот сейчас лист пустой но я именно это и ожидал потому что я здесь присваивался с помощью конструкции и
следующий программист который придёт после меня и будет читать мой код Он увидит что я изменённый объект присваиваю в переменную И тем самым я ожидаю что объект будет модифицирован следующая распространённая ошибка это когда мы модифицируем объект какого-нибудь листа например или КТА прямо в момент когда мы по нему итерируемый конструкцию по in list list append и сюда нам в квадрате кладём Давайте заприте нам через который мы итерируемый числа Каждый раз когда проходим и цикл не прекращался цикл упал из-за того что мы достигли предела максимального размера числа получилось что мы наполняли коллекцию данных через которую итерироваться становилась бесконечной
вот здесь Наверное программист хотел увидеть какое-то поведение что он добавит сюда квадраты чисел ещё Ну это просто очень легко делается мы берём вот это вот убираем делаем вот такую конструкцию list comprension и затем просто делаем extend этого листа и смотрим и вот в принципе то что программист хотел сделать изначально получилось с помощью другой чуть-чуть конструкции правило такое лучше производить какие-то модификации коллекции данных которые вы перебирает случиться то чем вы можете не управлять Вот например пусть у нас будет Вот такая коллекция чисел и Допустим мы хотим модифицировать этот список так чтобы там не осталось чётных чисел
и мы делаем такую такую конструкцию in Numbers If нам остаток отделения ран но то на я опять изменяю коллекцию данных через которую итерируемый создать рядом другой список пустой и в этот список просто наполнять значение если оно является нечётным и уже на выходе работать с со структурой от Numbers всё нечётные числа лежат здесь следующая распростра ошибка что во время гани один час ини одни сутки были потрачены на выявление багов и э ошибка пробрасывается [музыка] дефолтное пустым и вернём лист на выходе и здесь мы сделаем следующее list append наш элемент и возвратим лист и вот мы берём
делаем My list прямо добавляем какой-то элемент туда допустим Один и делаем переменную Another list и туда добавляем с ходу двоечку и Давайте здесь сделаем My list А здесь и нас очень удивит результат Так а ну да я забыл пробросить аргумент по имени и результат такой My оказался таким каким мы и хотели лежит единица которую мы вообще не хотели там видеть мы хотели видеть только двойку и что нам нужно сделать если мы хотим вс-таки иметь такую функцию а нам нужно её чуток переписать и сделать следующее лист по дефолту должен быть N и здесь вот такая конструкция
If L из N то лист и просто инициирует равно один и Another list элемент два и за принти и всё Поведение стало уже нормальным следующая распространённая ошибка - это когда путают методы которые меняют какой-то порядок структуры изначальный либо возвращают Новый объект это бывает sort и sorted например У меня есть допустим mylist ра 31 2 я делаю mylist sort и My L и этот список изменился про такой говорят что он изменился in Place он отличается от того что мы инициировали в самом начале распространённая ошибка здесь такая можно в коде встретить какую-то такую конструкцию L равно My
List и дальше автор кода думает что вза list лежит какой-то новый список а list лежит N потому что мед S ничего не возвращает он просто in изменяет изначальную структуру данных и это всё из-за того Потому что есть метод sorted который как раз-таки возвращает новый список и старый список остаётся без изменений вот Обратите внимание mylist остался таким же а оза list изменился Ну что ж мой курс Подошёл к концу и я бы хотел напомнить вам что обучение - это неравномерный процесс и какие-то темы вы могли усвоить хорошо а в каких-то до сих пор плаваете это абсолютно
Рабочая ситуация в своё время я уже работал программистом и чтобы понять тему асинхронный Python мне пришлось пять раз по кругу посмотреть двухчасовой цикл видео и секрет вашего дальнейшего овладения пайном - это практика Не расстраивайтесь если что-то не получается просто продолжайте практиковаться Я благодарю вас что досмотрели этот курс до конца лучшей благодарностью для меня была бы подписка на другие соцсети особенно на Telegram канал если ты от мне в комментах любой фидбек по курсу Я буду рад Ну и лайкосик воткни так для проформы на моём канале Вы можете найти другие материалы по тому как стать программистом и
развиваться в профессии с тобой был Саша респект Пока