Интро
00:00:00Доступность Python и удобный для начинающих дизайн позволяют освоить его прямо сейчас Python возглавляет рейтинги TIOBE и PYPL и охватывает анализ данных, серверную часть, машинное обучение, автоматизацию и написание сценариев, поэтому его основы ценны даже для непрограммистов. Будучи языком высокого уровня, он упрощает разработку и устраняет такие проблемы, как управление памятью. Интерпретация дает мгновенные результаты без компиляции, а динамическая типизация упрощает синтаксис, что идеально подходит для начинающих. Освоение Python - один из самых полезных навыков, который необходимо приобрести прямо сейчас.
Приступайте к обучению на практике: реальные задания, упражнения и онлайн-старт Для более быстрого погружения начинайте программировать сразу в онлайн-интерпретаторе; локальная настройка происходит позже, а альтернативные варианты легко найти с помощью быстрого поиска в Google, если какой-либо сервис выйдет из строя. Учебная программа сосредоточена на общих языковых конструкциях и библиотеках, решении реальных задач, обработке HTTP‑запросов и создании простого Telegram-бота. В нем использованы пять лет профессионального изучения языка Python в компаниях разного размера, анализа данных, нейронных сетей, ботов и скрейпинга. Прогресс зависит от практики: пишите код параллельно с уроками, делайте паузы, чтобы попробовать каждую задачу самостоятельно, и проверяйте предоставленные решения только после того, как потратите не менее часа. Ранние трудности уступают место уникальному удовлетворению от самостоятельного решения проблем.
Функция print
00:03:00Встроенная функция печати отображает значения переменных или строковые данные в терминале и принимает несколько строк, которые по умолчанию разделены пробелом. Используйте аргумент sep, чтобы установить другой разделитель, например запятую и пробел между Hello и World. Отдельные вызовы print выводят данные в отдельных строках; измените это, передав end=" ", чтобы продолжить в той же строке. Python выполняет код сверху вниз, строка за строкой, поэтому вывод следует порядку вызовов print. Функция ввода приостанавливает выполнение, чтобы пользователь мог ввести текст в терминале, возобновляет его после ввода и может запросить имя, а затем распечатать его обратно.
Переменные
00:05:50Сохраняйте, присваивайте и меняйте местами значения с помощью переменных Python Переменная хранит значение, которое может быть строкой, числом или более сложными типами, и после сохранения его можно повторно использовать в коде. В Python = присваивает значение (в отличие от математики, где = проверяет равенство), поэтому создайте name и выведите его, чтобы увидеть сохраненное значение. Множественное присвоение позволяет вам определить несколько переменных одновременно, если значения с обеих сторон совпадают. Вы можете скопировать одну переменную в другую и кратко поменять значения местами с помощью x, y = y, x.
Типы и присвоение имен: type(), зарезервированные слова и snake_case Встроенная функция type() показывает тип значения; присвоение "Hello world" приводит к типу str. Избегайте зарезервированных слов при присвоении идентификаторам имен — использование таких имен, как print, для переменных приводит к ошибкам. Предпочитайте осмысленные имена, потому что код пишется один раз, но читается много раз, часто вами. Соблюдайте соглашения об именовании в Python: snake_case (слова в нижнем регистре, разделенные символом подчеркивания) для переменных, функций, методов и модулей, а также специальные соглашения, существующие для классов, пакетов и констант.
Числа (int, float)
00:10:04Целые числа и числа с плавающей запятой в Python Python работает с целыми числами (whole numbers) и числами с плавающей точкой (decimal numbers). Вы можете складывать, умножать и делить их, а объединение int с float дает результат с плавающей точкой. Примеры результатов включают 15 при сложении целых чисел, 16,0 при использовании числа с плавающей точкой и 2,0 при делении. Деление на ноль недопустимо и приводит к ошибке.
Возведение в степень, целочисленное деление по модулю и приоритет Возведение в степень возводит число в степень, так что 2**3 равно 8. При целочисленном делении (//) возвращается целое частное, а при делении по модулю (%) - остаток, например, 9 // 4 = 2 и 9 % 4 = 1. В Python применяется приоритет операторов: умножение происходит перед сложением, поэтому 2 + 3 * 5 получается 17, а в круглых скобках это значение можно изменить на 25.
Целые числа произвольной точности, преобразование и округление Целые числа в Python становятся произвольно большими, ограничиваясь только объемом памяти, поэтому значения типа 10** 1000 понятны. Преобразование int в float с помощью функции float() приводит к результату, подобному 1.0. Преобразование float в int с помощью функции int() приводит к усечению дробной части, поэтому 1.5 становится 1. Чтобы округлить, а не усечь, используйте round(): 1.5 становится 2, а 1.49 - 1.
Определение подъезда и этажа по номеру квартиры Здание имеет пять подъездов по 20 квартир в каждом и по четыре квартиры на этаже, пронумерованных последовательно вверх, начиная с первого этажа. Вычислите подъезд путем целочисленного деления со смещением: (квартира - 1) // 20 + 1, что исправляет граничные случаи, такие как сопоставление квартиры 20 с подъездом 1. Чтобы получить этаж, удалите все входы по модулю и примените то же смещение: ((плоский - 1) % 20) // 4 + 1. Эти формулы дают такие результаты, как подъезд 5 и этаж 1 для квартиры 81 и подъезд 2 и этаж 1 для квартиры 24.
Булевый тип (bool)
00:22:47Логические значения и равенства в Python Тип boolean содержит ровно два значения, True и False, и служит флагом в таких переменных, как is_student или is_belgrade. Логические значения часто берутся из выражений: сравнение значений с == дает значение True, если оно равно, и значение False в противном случае. Такие результаты могут быть сохранены в переменных и распечатаны для наблюдения за состоянием программы.
Сравнения, комбинированные условия и логическое отрицание Неравенство использует !=, в то время как <, >, <=, и >= работают как в математике и возвращают логические результаты. Если два числа равны, то оба >= и <= значение равно True. Условия могут быть объединены с и, как при проверке x < 5 и x > -2; когда x становится равным 6, первое условие не выполняется и все выражение становится ложным. Оператор not преобразует логическое значение True в False и наоборот. В основе этих операций лежит базовая логика, которую стоит изучать наряду с программированием.
Достоверность с помощью функции bool() и программа на Python, гарантирующая работу Функция bool() преобразует другие типы по степени достоверности: любое ненулевое число становится истинным, ноль становится ложным, а непустые строки - истинными, в то время как пустые строки - ложными. Цель курса - дать как можно большему количеству людей попробовать Python и получить удовольствие от самостоятельного решения задач. Для более быстрого трудоустройства программа Skypro для разработчиков Python предлагает групповую и индивидуальную поддержку, структурированный учебный план и активную помощь в трудоустройстве, подкрепленную гарантированным контрактом трудоустройством. Обучение длится 10 месяцев с пятью портфолио проектов; благодаря центру карьеры и активному студенческому сообществу более 70% заканчивают обучение, и вы можете бесплатно сменить направление в течение первого месяца. Вы можете подать заявку на бесплатную консультацию с помощью QR-кода или ссылки, а промокод дает скидку в размере 20 000₽ на любой курс Skypro.
Условные операторы
00:31:11Операторы If, управляемые отступами, управляют выполнением Оператор if запускает условную конструкцию, в которой блок с отступом выполняется только тогда, когда условие принимает значение True. Отступ (табуляция или четыре пробела) определяет границы блока; любые строки на этом уровне отступа относятся к условию. Используйте elif и else для маршрутизации выполнения во взаимоисключающие ветви; когда несколько условий могут быть выполнены, выполняется только первая удовлетворяющая ветвь.
Сочетайте условия с и и используйте правдивость Чтобы проверить несколько требований одновременно, объедините их в одно условие с помощью оператора and, а не проверяйте вложенностью или разделением. Текстовые и числовые значения должны соответствовать действительности: непустые строки и ненулевые числа являются истинными, а пустые строки и ноль - ложными. Вы можете полагаться на это напрямую — сообщение if или if x, поскольку Python неявно применяет bool() в условиях.
Правило високосного года: 4, а не 100, если только не 400 Год считается високосным, если он делится на 4 и не делится на 100, если только он также не делится на 400. Реализуйте это с помощью проверок по модулю: y% 4 == 0 и y% 100 != 0, или y% 400 == 0. Это правило делает 2000 и 2004 годы високосными, в то время как 1800 и 2003 годы таковыми не являются, и их можно выразить более кратко, используя не инвертировать части условия.
Строки (str)
00:42:03Строковые литералы, многострочный текст и длина Строки следует заключать в одинарные или двойные кавычки, а для большого текста или многострочного текста использовать тройные кавычки. Соединяйте такие элементы, как имя и фамилия, с помощью знака +, при необходимости добавляя явный пробел. Функция len() возвращает количество символов, а пустая строка имеет длину 0.
Преобразование между строками и числами Используйте str(), чтобы преобразовать числовое значение в строку. Преобразуйте строку, имеющую числовой вид, в int('10'), но при передаче нечисловой строки в int() возникает ошибка. функция input() всегда возвращает строку, поэтому, когда требуется ввести число, преобразуйте ее с помощью функции int(). Чтобы подсчитать цифры в большом числе, например, 2**1000, преобразуйте его в строку и примените функцию len(); результат равен 302.
Поиск и преобразование текста Используйте оператор in для проверки наличия подстроки; поиск выполняется с учетом регистра. Измените регистр на верхний() или нижний(). strip() удаляет только начальные и конечные пробелы, оставляя внутренние пробелы нетронутыми. replace(старый, новый) заменяет части текста, а count(подстрока) возвращает количество раз, когда это повторяется.
F-Строки, выражения и правила цитирования Форматируйте текст с помощью f-строк, добавляя к литералу префикс f и заключая переменные в фигурные скобки. Также вставляйте выражения, например, показывайте произведение x * y. Если текст содержит одинарные кавычки, заключите всю строку в двойные кавычки, чтобы избежать ее разрыва. Для практики ознакомьтесь с методом format() и форматированием %; поиск на английском языке дает понятные статьи с фрагментами кода.
Установка софта
00:58:47Программирование на основе браузера завершается, поскольку рабочий процесс переходит к IDE - специализированной среде, созданной для того, чтобы сделать написание кода более удобным. Следующие шаги касаются установки языка программирования и IDE сначала на Windows, а затем на Mac, с указанием временных кодов для каждого раздела. Соответствующие ссылки указывают на нужные ресурсы для вашей операционной системы, чтобы вы могли сразу перейти к нужному разделу. Скопируйте примеры фрагментов из статьи и поэкспериментируйте с ними, чтобы увидеть, что получится.
Установка на Windows
00:59:25В Windows загрузите последнюю версию стабильного Python с сайта python.org, установите флажок Добавить Python в PATH, установите, затем выберите Отключить ограничение длины пути. Установите и запустите PyCharm Community Edition — бесплатную версию со всеми необходимыми функциями. Создайте C:\Python Проекты, загрузите архив репозитория курсов по предоставленным ссылкам и распакуйте его в эту папку. В PyCharm запустите новый проект, указав на эту папку, выберите "Создать новый Virtualenv", чтобы у каждого проекта была своя собственная среда для предотвращения путаницы пакетов и поддержки разных версий Python, затем нажмите "Создать".
Установка на macOS
01:01:57Загрузите последнюю версию Python с сайта python.org, запустите программу установки, при появлении запроса введите системный пароль, дождитесь завершения, затем закройте и удалите программу установки. Скачайте PyCharm Community Edition, установите его, переместив приложение в папку Applications, и запустите PyCharm. Загрузите репозиторий Python для начинающих с GitHub в виде ZIP-файла, распакуйте его и переместите извлеченную папку в папку проекта Python. В PyCharm создайте новый проект из этой папки (Создайте из существующих исходных текстов), выберите "Новая среда", при необходимости переключите интерпретатор с версии 3.9 по умолчанию на недавно установленный Python 3.12 и создайте проект.
Списки (list)
01:04:46Списки Python хранят упорядоченные последовательности Создайте список фруктов — яблоко, банан, вишня — для хранения упорядоченной последовательности и распечатайте его. Из функции list() получается пустой список, а функция len(fruits) возвращает значение 3. Список может содержать строки, целые числа, значения с плавающей точкой, логические значения или даже другие списки. Python допускает смешивание типов в одном списке, но лучше сохранить один тип данных.
Порядок, правдивость и членство определяют основное поведение Два списка сравниваются равными только тогда, когда каждый элемент и его позиция совпадают; [1,2,3] не равно [1,3,2]. bool([]) имеет значение False, в то время как любой непустой список имеет значение True, даже если он содержит 0. Используйте оператор in для проверки принадлежности: "Банан" найден, "Арбуз" - нет. Создайте списки из существующих переменных, преобразуйте строку в символы с помощью list(word) и объедините списки с помощью +.
Изменчивость позволяет вносить изменения на месте Списки изменяются на месте; функция append добавляет новый элемент (например, "Watermelon") и изменяет исходный список. Напротив, при замене текста в строке и присвоении его новой переменной исходная строка остается неизменной. функция pop удаляет последний элемент, возвращает его, если он захвачен, и сокращает список, даже если возвращаемое значение игнорируется. функция extend объединяет другой список с текущим.
Переупорядочивание, сортировка, разделение/объединение и числовые помощники reverse переворачивает список и упорядочивает элементы по возрастанию по умолчанию или по убыванию с помощью reverse=True. Разделите предложение на слова с помощью split(' '), затем перестройте его с помощью ' '.объедините(list_of_words). Встроенные функции, такие как max, min и sum, работают с числовыми списками для получения экстремумов и итоговых значений. Смешивание в строке нарушает арифметическую агрегацию, такую как sum, и приводит к ошибке.
Индексы и слайсы
01:19:59Индексация на основе Нуля Устраняет случайную Путаницу Программисты считают от нуля, чтобы избежать постоянных корректировок +1/-1 и путаницы, которую они создают. Когда этажи, подъезды и квартиры нумеруются от 0, поиск квартиры становится простой арифметикой без смещений. Например, в случае с квартирой 19 вместо “5-го этажа” при подсчете людей отображается "подъезд 0" и "этаж 4". Удаление этих лишних символов делает код короче и более удобочитаемым.
Основы индексации: доступ, отрицательные значения, ошибки и присвоение Используйте квадратные скобки для индексации последовательностей, таких как списки и строки: индекс 0 возвращает первый элемент. Отрицательные индексы доступны с конца с допустимым диапазоном от −len до len−1; индексы, выходящие за пределы диапазона (например, 4 или -5 в списке из четырех элементов), приводят к ошибке. Индексация также поддерживает присваивание, поэтому элемент может быть заменен на месте. Множественное присвоение позволяет менять местами элементы, например, заменять первый и третий элементы в одном операторе.
Основы нарезки: Полуоткрытые диапазоны, шаги и безопасные границы Срезы возвращают подпоследовательности, используя полуоткрытые диапазоны: начало включено, остановка исключена. При пропуске границ по умолчанию используются начало и конец, поэтому [:] или [0:len] дают полную последовательность, а [:5] выбирает первые пять элементов. При добавлении шага выбирается каждый n‑й элемент, например, [::2]; срезы допускают выход за пределы диапазона, возвращая пустой или сжатый результат, а не ошибку. Те же самые шаблоны срезов работают со строками, например, начиная с пятого символа и заканчивая каждым вторым символом.
Три способа изменить последовательность действий в обратном порядке Изменить последовательность можно тремя способами. Фрагмент [::-1] создает обратную копию. Метод list.reverse() изменяет последовательность на месте. Встроенный reversed(seq) возвращает итератор (list_reverseiterator), который может быть преобразован в list() для материализации результата.
Цикл for
01:30:56Перебирать списки и строки Элемент за элементом Цикл for обрабатывает коллекцию, привязывая каждый элемент к переменной цикла и запуская блок с отступом один раз для каждого элемента, таким образом, количество итераций равно количеству элементов. При наличии списка имен файлов цикл выводит каждое имя в терминал одно за другим. Та же схема работает и со строками, выводя символы, чтобы печатать "Hello world" посимвольно. Подсчет буквы "o" начинается с обнуления счетчика и увеличивается при совпадении, в результате чего получается два вхождения.
Сократите количество обновлений с помощью += и сохраняйте неглубокую вложенность Расширенное задание типа += заменяет подробные обновления (например, count = count + 1) на более короткую и понятную форму без изменения поведения. Аналогичные операторы существуют и для других арифметических действий и делают часто используемые шаблоны краткими и удобочитаемыми. Циклы могут быть вложенными: для каждого имени учащегося внутренний цикл обходит его символы, в то время как внешний цикл проходит по всем учащимся. При выполнении выполняется полный внутренний цикл для одного внешнего значения, прежде чем двигаться дальше, и более глубокий, чем на один уровень, уровень вложенности быстро ухудшает читаемость, поэтому вместо суммирования циклов выполните рефакторинг.
Прямой циклический поток с продолжением и прерыванием continue пропускает оставшуюся часть текущей итерации и переходит к следующему этапу цикла for, что помогает игнорировать нежелательные случаи. В списке чисел при пропуске четных значений с помощью continue выводятся только нечетные. break немедленно останавливает цикл; выполняется остановка, когда значение равно 10, и перед завершением выводятся только числа меньше десяти.
Диапазон использования для полуоткрытых последовательностей и обновлений на основе индексов range генерирует полуоткрытые последовательности: range(10) дает значения от 0 до 9, и вы можете установить start, stop и step, включая отрицательные шаги. Преобразование диапазона в список позволяет выявить элементы, и при использовании нисходящего диапазона, такого как range(10, 1, -1), нижняя граница исключается точно так же, как верхняя граница в восходящих диапазонах. Изменение списка требует обновления на основе индекса, поскольку изменение переменной цикла не изменяет исходные элементы. Выполните итерацию по индексам с помощью диапазона(len(list)) и обновите на месте (например, числа[i] += 1). Чтобы найти количество и позиции 'o' в строке, выполните цикл по индексу, увеличьте количество совпадений и соберите индексы, чтобы получить число 2 в позициях 4 и 8; в последнем упражнении предлагается вывести таблицу умножения построчно.
Функции
01:44:02Устраните повторения с помощью функций и правильных возвратов Функция - это многократно используемый блок кода, который предотвращает дублирование при выполнении одной и той же задачи, например, при вычислении среднего значения по нескольким спискам. Определите ее с помощью def и значимого имени, примите параметр последовательности и вычислите sum(числа)/len(lenvers). Используйте return для обратной передачи результата; без return Python по умолчанию не выдает ни одного результата. Вызывайте функцию для любого списка, который вам нужен, и сохраняйте читаемость кода, отделяя определения функций от остального кода двумя пустыми строками.
Подсчет гласных с четким повторением Сохраняйте набор гласных в виде константы верхнего регистра (например, ГЛАСНЫЕ) и помните, что Python чувствителен к регистру, поэтому "a" и "A" различаются. Выполните итерацию в поисках символа в строке, увеличьте счетчик, если символ в гласных, и верните значение count. Создайте функции-заполнители, которые намеренно ничего не делают с ключевым словом pass, и вызывайте функции без аргументов, используя пустые круглые скобки.
Предотвратите путаницу в аргументах с помощью подсказок по типу и параметров, содержащих только ключевые слова Многопараметрическими функциями, такими как format_date(день, месяц), легко злоупотреблять, меняя местами позиционные аргументы, что приводит к ошибкам. Добавьте аннотации к типу (day: int, month: str), чтобы инструменты предупреждали, когда предоставленные типы не соответствуют ожиданиям, и вызывали функции с именованными аргументами, чтобы порядок не имел значения. Примените явное присвоение имен, поставив одну звездочку (*) перед параметрами, чтобы они были доступны только для ключевых слов, следуя идее о том, что явное лучше неявного.
Уточняйте результаты с помощью типов возвращаемых данных и значений по умолчанию Укажите тип возвращаемого значения (например, -> str), чтобы сообщить, что выдает функция; даже если Python все еще работает, когда фактический тип значения отличается, подсказка поможет читателю. Укажите значения по умолчанию, такие как приветствие: str = 'Hello', в функции, подобной custom_greeting(имя: str, приветствие: str = 'Hello') -> str, и верните отформатированную строку, которая объединяет приветствие и имя. Вызовите его с переопределением значения по умолчанию или без него, в зависимости от желаемого сообщения.
Область видимости переменных
01:57:03Локальная область действия блокирует внешний доступ; переменные цикла принимают последнее значение Определите функцию с помощью локальной переменной; печать ее внутри работает, но при обращении к ней извне возникает ошибка “не определено”. Имя, созданное в функции, находится только в теле этой функции и не может быть использовано где-либо еще. В for-loops полагаться на переменную цикла вне ее предполагаемого контекста небезопасно, поскольку она в конечном итоге оказывается равной последнему элементу диапазона (для диапазона(3) это значение равно 2). Избегайте шаблонов, которые зависят от этого конечного значения цикла.
Предпочитайте константы уровня модуля; изменяемые глобальные переменные и затенение вызывают путаницу Присвоение имени внутри функции создает локальную переменную, которая не влияет на внешнюю переменную, поэтому внешнее значение может быть автоматически удалено. Эта двусмысленность размывает границы локальной области и начинается глобальная, что делает ошибки вероятными. Используйте константы уровня модуля для общих значений, таких как комфортная температура, используемая для вычисления ее отличия от температуры воздуха в помещении. Использование других глобальных переменных может привести к ошибкам, поэтому избегайте их.
Избегайте глобального переназначения; повышайте уровень вычислений с постоянного порогового значения Python может изменять global внутри функции с помощью ключевого слова global, но это называется абсолютным злом, и его следует избегать; лучше реструктурировать код. За пределами области действия функции сохраняйте только константы. Практическое упражнение: определите default_level_experience = 200, вычислите total_experience = current_experience + gain_experience и верните логическое значение, указывающее, достигнуто ли пороговое значение. В примере 150 и 60 дают значение True; в комментариях используется символ # либо встроенный, либо в начале строки.
Цикл while
02:06:29While vs for: итерация, управляемая условиями, или итерация с фиксированным числом итераций Циклы For повторяются заданное количество раз, часто совпадающее с количеством элементов в коллекции. Циклы While повторяются неопределенное количество раз и выполняются до тех пор, пока выполняется условие. Обычно они привязаны к счетчикам или другому состоянию, которое изменяется до тех пор, пока условие остановки не станет ложным.
Отсчет с помощью while и остановка по условию Инициализируйте счетчик нулем и запишите его в то время как счетчик <= 5. На каждой итерации выводите значение счетчика и увеличивайте его на единицу. После пятой итерации значение счетчика становится равным шести, результат сравнения оказывается ложным, и цикл останавливается.
Удаление элементов из списка до тех пор, пока он не станет пустым Практичный способ заключается в том, что while my_list: помещает() последний элемент в переменную и продолжает работу. Цикл выполняется до тех пор, пока остается хотя бы один элемент, а затем завершается, когда список становится пустым. После завершения сохраняется последнее загруженное значение и подтверждается, что список пуст.
Бесконечные циклы и управляемое пользователем завершение в то время как значение True создает бесконечный цикл, который будет выводиться бесконечно, пока программа не будет прервана. Добавьте подсказку внутри: прочитайте ввод в ответ, и если оно равно "quit", прервите, чтобы остановить выполнение. При запуске видно, что числа можно вводить повторно, а ввод "quit" завершает цикл.
Мартингейл объяснен и смоделирован с помощью подбрасывания монет Стратегия мартингейла начинается с минимальной ставки, фиксирует прибыль при выигрыше и сбрасывает ее до минимума, но удваивает ставку после каждого проигрыша. Несмотря на свою привлекательность, она не работает и часто используется для введения людей в заблуждение в азартных играх. Чтобы убрать ноль в рулетке, в симуляторе используются подбрасывания монет с константами "ОРЕЛ" и "РЕШКА" и функция flip_coin, основанная на random.choice.
Механика симулятора и провал одиночной игры play_martingale принимает стартовые средства, минимальную и максимальную ставки и возвращает количество шагов до тех пор, пока игрок не проиграет. В каждом раунде вычитается текущая ставка, монета подбрасывается, затем в случае выигрыша добавляется удвоенная ставка и ставка сбрасывается до минимума; в случае проигрыша ставка удваивается. Если удвоенная ставка превышает максимальную за столом, ставка сбрасывается до минимальной, а если ставка превышает оставшиеся средства, игрок ставит все. При стартовых средствах 100, минимальных 1 и максимальных 100 один раунд завершился через 63 шага после серии проигрышей по ставкам 1, 2, 4, 8, 16, 32, 64, а банкролл был исчерпан на 128.
Пакетное моделирование подтверждает неизбежные потери, несмотря на крупные денежные средства Пакетная функция запускает множество независимых игр с одинаковыми параметрами, суммирует количество шагов до проигрыша и возвращает среднее значение. Во время пакетной игры печать отключена, но моделирование все равно может происходить медленно, если средства велики, минимальная ставка мала или лимит за игровым столом ограничен. При 10 играх со стартовым капиталом 1000, минимальной суммой 1 и максимальной суммой 100, среднее количество шагов к проигрышу составило 186 000. Даже при очень больших фондах и высоких лимитах в розыгрышах в конечном итоге случаются затяжные проигрышные серии; в одном случае потребовалось около 15 миллионов шагов, прежде чем все завершилось неудачей, и все игроки по-прежнему проигрывали.
Кортежи (tuple)
02:27:24Кортежи - это неизменяемые последовательности, похожие на списки Кортеж - это неизменяемая последовательность, созданная с помощью круглых скобок и элементов, разделенных запятыми. Например, ('admin', 'editor', 'observer') имеет длину три, поддерживает итерацию и позволяет проверять принадлежность с помощью in. Доступ к элементам осуществляется по нулевому индексу.
Поиск и распаковка шаблонов для одноэлементных кортежей Для одноэлементного кортежа требуется запятая в конце; без нее круглые скобки отображают только базовый объект (например, строку), что может привести к непреднамеренной итерации символов. Кортежи поддерживают распаковку в переменные, и количество переменных должно быть равно количеству элементов; используйте переменную с подчеркиванием, чтобы игнорировать значение. Списки распаковываются таким же образом, а кортежи подходят для случаев, когда структура данных не должна изменяться, и часто используются с функциями.
Словари (dict)
02:31:13Моделируйте реальные данные с помощью уникальных пар ключ–значение Программирование отображает реальный мир в виде данных, и атрибуты человека — имя, возраст, город — естественным образом вписываются в словарь уникальных пар ключ–значение. Словарь хранит уникальные ключи, сопоставленные со значениями, и может быть объявлен с помощью фигурных скобок. Пример: _BOS_"имя": "Джон", "возраст": 30, "город": "Нью-Йорк"}; после создания могут быть назначены новые поля, такие как "работа": "инженер".
Безопасный поиск и простая итерация с помощью get, элементов, ключей, значений Доступ по ключу возвращает значение, но при запросе отсутствующего ключа возникает ошибка KeyError. dict.get('имя') возвращает значение безопасно; dict.get('страна') возвращает значение None или заданное по умолчанию, например 'USA'. Итерация по словарю приводит к получению ключей; используйте items() для пар (ключ, значение) с распаковкой кортежей, а также keys() или values() для явной итерации по ключам или значениям.
Равенство, не зависящее от порядка, и перезапись при слиянии Словари сравниваются одинаково, если они содержат одинаковые ключи и значения независимо от порядка объявления; любое различающееся значение или количество ключей делает их неравными. Чтобы объединить данные, вызовите update с другим словарем для объединения ключей. Когда ключи перекрываются (например, изменен "город"), значения из второго словаря перезаписывают первый, а оператор передачи данных dict1 | dict2 обеспечивает такое же поведение при перезаписи при слиянии.
args, **kwargs
02:39:58Масштабирование суммы с помощью *аргументов и распаковка последовательности Сумматор с двумя аргументами превращается в гибкий накопитель, объявляя параметр, помеченный звездочкой, для сбора любого количества позиционных входных данных. Эти значения поступают в виде кортежа и могут быть повторены для вычисления итогового значения. Последовательности, такие как списки и кортежи, могут быть распакованы с помощью *, что позволяет нескольким коллекциям выполнять один вызов. Повторные проверки с разными номерами подтверждают общий результат.
Именованные аргументы с помощью **kwargs и расширения словаря Именованные входные данные объединяются в параметре с двойной звездочкой, создавая словарь ключей и значений. Обработка выполняет это сопоставление с помощью items() для доступа к каждой паре. Любой существующий словарь может быть расширен в вызове с помощью ** для достижения того же эффекта, что и при записи имен в строку. Проверка типа показывает, что контейнер является обычным dict.
Смешивание типов параметров и возврат нескольких результатов Фиксированные позиционные параметры могут быть объединены с собранным кортежем с помощью *args и более поздним параметром со значением по умолчанию, каждый из которых предсказуемо привязывается при вызове. В печатном виде выводится фиксированная пара, затем собранный кортеж, затем конечное значение, подчеркивающее порядок и необходимость соблюдения осторожности. Несколько результатов могут быть возвращены в виде кортежа с подписью, обозначающей их как (dict, bool) при возврате обновленного отображения и флага изменения. Процедура обновления словаря сравнивает предлагаемые значения с текущими с помощью get, записывает только различия, устанавливает флаг при изменении и возвращает оба объекта. Обычно вызывающий объект распаковывает два результата в отдельные переменные.
json
02:51:26JSON: Текстовый формат для обмена данными между приложениями JSON - это текстовый формат обмена данными, широко используемый в мобильных и веб-приложениях. Он расшифровывается как объектная нотация JavaScript: впервые применялся внутри JavaScript, но теперь не зависит от языка. Для работы с JSON на другом языке импортируйте соответствующий модуль и обрабатывайте данные как структурированный текст.
Сериализация книги: двойные кавычки, числа и списки Объект Book с международным идентификатором преобразуется в строку JSON, превращая структуру в текст. В JSON для ключей и строковых значений требуются двойные кавычки, в отличие от Python, где одинарные и двойные кавычки взаимозаменяемы. Числа отображаются без кавычек, а списки, такие как жанры, кодируются в виде массивов. Затем строка JSON может быть преобразована обратно в собственную структуру данных, восстанавливая исходные значения.
import
02:55:41Модули - Это Файлы .py Со Своим Собственным Пространством Имен Модуль Python - это файл .py, который может содержать исполняемый код вместе с определениями функций или классов. Каждый модуль имеет свое собственное пространство имен; используйте встроенную функцию globals(), чтобы просмотреть словарь имен, который он содержит. Назначения и импорт сразу же отображаются там, перенося внешние библиотеки в локальную область действия, чтобы сохранить модульность и управляемость кода.
Изучайте и используйте модули с помощью dir() и random.choice Чтобы выбрать случайный элемент из списка, импортируйте модуль random и вызовите random.choice в списке. Используйте dir(случайный) для проверки модуля и поиска доступных функций, включая choice. Печать результата подтверждает правильность вызова и показывает, что random теперь находится в текущем пространстве имен.
Создавайте свои собственные модули, безопасно импортируйте и структурируйте пакеты Создайте свой собственный модуль (например, m_operations) с такими функциями, как add и substr, затем импортируйте и вызывайте их из вашего основного файла. Избегайте импорта модулей from *, чтобы предотвратить непредвиденные конфликты имен; вместо этого импортируйте явные имена или сам модуль и используйте псевдонимы, когда это необходимо для разрешения конфликтов. Выберите между абсолютным, относительным или выборочным импортом в зависимости от контекста и включите файл __init__.py, чтобы каталог распознавался как пакет, который можно импортировать.
Установка сторонних библиотек
03:03:33Используйте возможности Python, полагаясь на сторонние пакеты, выходящие за рамки стандартной библиотеки, и повторно используя решения, созданные другими разработчиками. В состав Python входит pip, программа установки пакетов, которая обрабатывает зависимости, не предоставляемые стандартной библиотекой. Обратите внимание на наличие файла __init__.py. Далее будут сделаны запросы.
Библиотека requests
03:04:05Устанавливайте запросы в правильном интерпретаторе PyCharm Установка начинается в терминале PyCharm с активированной среды Python проекта, которая отличается в Linux/Mac и Windows. Библиотека requests устанавливается с помощью pip install requests. Если терминальный метод не работает, в меню Настройки → Проект → Интерпретатор Python предоставляется альтернативный вариант: выберите правильный интерпретатор и установите запросы из списка пакетов. Быстрый импорт подтверждает установку.
Получение цены BTCUSDT через Binance API API служит интерфейсом между программами по протоколу HTTP, отражая то, как пользовательский интерфейс обслуживает людей. Конечная точка Binance подготовлена, и при вызове с помощью requests.get(url, params={'symbol': 'BTCUSDT'}) запрашивается цена биткоина в долларах США. Ответ поступает в виде байтов, затем функция response.json() преобразует его в dict для доступа к "цене". Значение является строкой и преобразуется в float для числового использования.
Соберите 30 односекундных выборок и вычислите минимальное/максимальное значение Система отслеживания цен работает с модулем time, повторяя цикл 30 раз с интервалом в одну секунду. Каждая итерация запрашивает BTCUSDT, анализирует response.json()["цена"], преобразует его в float и добавляет в список. Период ожидания в течение одной секунды поддерживает частоту выборки. В конце выполнения отображается история из 30 элементов, в которой указывается длина списка, а также максимальные и минимальные наблюдаемые цены.
Списочные включения
03:12:49Составляйте списки кратко и с пониманием Использование списков позволяет создавать списки в сжатом и удобочитаемом виде. Многострочный цикл, который добавляет квадраты чисел 0-9, преобразуется в [x**2 для x в диапазоне(10)]. Фильтрация также выполняется встроенно, создавая только четные квадраты с [x**2 для x в диапазоне(10), если x % 2 == 0]. Условное выражение внутри понимания может обозначать каждое число как "четное" или "нечетное" за один проход.
Предпочитайте простое, однострочное изложение Поначалу текст может показаться сложным для восприятия, но практика делает его более понятным. Используйте его при создании списков из других последовательностей, чтобы сократить код, сохраняя его читабельным. Пропустите двух- или трехуровневые вложенные версии; когда логика больше не помещается в одну строку, отдавайте предпочтение явным циклам для наглядности.
Понимание по словарю и транспонирование матрицы Понимание также позволяет создавать краткие словари, например {x: x**2 для x в диапазоне(10)}, сопоставляя числа с их квадратами. Матрица - это список строк, а при транспозиции строки и столбцы меняются местами. Многословное преобразование с помощью вложенного цикла может быть заменено на сжатое понимание списков, которое дает тот же результат. Курс дает хороший старт и помогает вам написать первую программу, но одного этого недостаточно, чтобы получить работу.
Множества (set)
03:23:02Наборы как коллекции уникальных элементов Набор - это набор уникальных элементов; дубликаты автоматически удаляются. Создайте наборы, заключив их в фигурные скобки, например {1, 2, 3, 4, 5} или вызвав set(), например set(range(5)). В отличие от dict, набор хранит только значения и может изменяться, поэтому вы можете добавлять элементы и удалять их по мере необходимости. При добавлении уже существующего значения набор остается неизменным.
Объединение, пересечение, разность и быстрая дедупликация Объедините два набора с помощью union, чтобы получить каждый уникальный элемент по одному разу. Найдите общие элементы с пересечением и элементы, присутствующие только в первом наборе, с отличием. Создайте наборы с пониманием и помните, что они неупорядочены, поэтому {1, 2, 3} равно {3, 2, 1}. Удалите дубликаты в списке, преобразовав его в set и обратно: list(набор(чисел)).
Функции sorted и filter
03:29:06Сортировка Изменяет порядок, фильтрация Выбирает При сортировке количество элементов остается неизменным, и они перестраиваются только по выбранному правилу, например, по возрастанию, убыванию или по длине слова. Фильтрация изменяет окончательный выбор, сохраняя только те элементы, которые удовлетворяют условию, например, при выборе четных чисел. Четкое различие между ними простое: сортировка изменяет порядок; фильтрация изменяет принадлежность.
Использование Python's sorted: default, reverse и key Применение сортировки приводит к изменению порядка в списке (по умолчанию в алфавитном порядке и от меньшего к большему), оставляя исходный список без изменений. Для указания порядка убывания введите reverse=True. Чтобы выполнить сортировку по пользовательскому правилу, такому как длина слова, передайте объект key function (без круглых скобок); в дальнейшем sorted вызывает его для каждого элемента и упорядочивает по возвращаемым значениям.
Пользовательские ключи, многопольный порядок и логическая фильтрация Для словарей, представляющих людей, ключ, который возвращает возраст человека, сортируется по возрасту; чтобы разорвать связи, введите return (возраст, имя) для соблюдения алфавитного порядка между равными возрастами. Функция filter принимает предикат, а затем данные, и предикат должен возвращать логическое значение, указывающее, следует ли включать каждый элемент. Параметр is_even(n), который проверяет n % 2 == 0, сохраняет четные числа; filter возвращает объект filter, поэтому для его отображения результат преобразуется в список. Тот же подход позволяет отфильтровывать людей, например, тех, чей возраст превышает 18 лет.
lambda функции
03:39:04Лаконичные одноразовые функции с лямбдой Python Для сортировки, фильтрации и других операций часто требуется небольшая ключевая функция, используемая только один раз; сохранение именованного def для нее загромождает кодовую базу. Lambda в Python определяет такую встроенную функцию: lambda element: len(элемент) возвращает ту же целочисленную длину, что и именованная функция sort_by_len. В отличие от def, у lambda нет имени; оно начинается с ключевого слова lambda, содержит список аргументов, двоеточие, а затем возвращаемое выражение. Присвоение переменной и вызов ее с помощью "banana" дают результат 6, демонстрирующий эквивалентность.
Сортировка и выбор по длине с помощью лямбда-ключей Список фруктов можно отсортировать по длине строки, передав функции сортировки key=lambda element: len(элемент). Чтобы вызов сработал, аргумент должен быть назван как key. Встроенные функции, такие как max и min, также принимают такие ключи; при просмотре списка max с помощью этого ключа получается самое длинное слово. Если "banana" и "cherry" имеют одинаковую длину, возвращается "banana", поскольку оно появляется раньше.
Обработка исключений
03:42:43Предотвращение деления на ноль при вычислении среднего значения Функция усреднения суммирует список чисел и делит на его длину, что работает, когда список не пуст. Если список пуст, длина равна нулю, и при делении возникает ошибка, которая останавливает выполнение. Помещая вычисление в try и перехватывая исключение деления на ноль, программа выводит сообщение "Список пуст" и продолжает работу. При непустом списке вычисляется среднее значение, и поток продолжается без входа в ветвь except.
Обработка сетевых сбоев с помощью запросов.исключений.ConnectionError Запрос к API Binance для определения цены BTC в долларах США не выполняется, когда Интернет отключен, что приводит к возникновению requests.exceptions.Ошибка подключения после нескольких попыток. Перевод вызова в try и перехват requests.exceptions.Функция ConnectionError выводит диагностическое сообщение и предотвращает сбой, поэтому выполнение продолжается. При добавлении параметра "как ошибка" объект-исключение фиксируется для проверки. При печати краткого уведомления вместе с записанным сообщением отображается информация о повторной попытке и недоступный URL-адрес.
Классы
03:48:02Освоение классов с помощью RPG-сражения Занятия кажутся нелогичными, поскольку предполагают высокий уровень абстракции, поэтому план состоит в том, чтобы изучить их, создав небольшую дуэль в стиле RPG. Путь включает в себя выявление типичных ошибок, поиск компромиссов в дизайне и их решение с помощью языковых возможностей. В конце концов, функциональная система борьбы прояснит, как занятия работают на практике.
Основы объектно-ориентированного программирования: класс против экземпляра Объектно-ориентированное программирование моделирует программу как набор объектов, каждый из которых является экземпляром класса. Класс - это схема, в то время как экземпляр - это конкретный дом, построенный по этой схеме; многие дома могут отличаться друг от друга, хотя и имеют один и тот же план. Например, str - это класс в стандартной библиотеке, а конкретная строка - это его экземпляр, причем сами классы являются экземплярами типа.
Синтаксис класса Python и методы Dunder Класс объявляется с помощью ключевого слова class, а в качестве минимального заполнителя может использоваться pass. При создании экземпляра класса он вызывается как функция для создания объекта. Более простые методы, такие как __init__, определяют, как объект ведет себя с языковыми конструкциями, а __init__ инициализирует атрибуты во время создания.
Создание Orc: self, атрибуты и вызовы методов Определите орка с помощью __init__(self, уровень), сохраните уровень и рассчитайте на его основе очки жизни и силу атаки. Реализуйте метод атаки, который выводит урон с помощью self.attack_power. Имя self - это экземпляр, с которым работает метод; вызов метода в классе без экземпляра приводит к ошибке "Отсутствует self". Атрибуты экземпляра можно проверить и изменить после создания.
Управление печатью с помощью __str__ Печать необработанного экземпляра приводит к бесполезному представлению по умолчанию. Реализуйте __str__, чтобы возвращать понятную для пользователя сводную информацию о состоянии, такую как уровень и точки доступа. При этом вместо непрозрачных идентификаторов отображается значимая информация.
DRY с наследованием и классовыми константами Копирование орка для создания эльфа дублирует логику и нарушает DRY. Вводим базовый класс персонажа, который инициализирует уровень и извлекает здоровье и атаку из атрибутов класса, предоставляемых подклассом. Подклассы, такие как Orc и Elf, определяют базовые значения health_points, base_attack_power и character_name, наследуя общие методы, такие как attack и __str__.
Переопределение методов для настройки поведения Подклассы могут переопределять методы для улучшения поведения без изменения базового класса. Переопределенная атака (или __str__) в Elf демонстрирует, что вызовы методов соответствуют реализации подкласса. Это позволяет каждому существу корректировать только то, что отличается, при повторном использовании общей основы.
От методов к рабочему боевому циклу Разверните "атака", чтобы выбрать цель и вычесть урон из очков здоровья цели, выводя промежуточные состояния для отладки. Добавьте параметр is_alive, который возвращает значение True при положительном значении очков здоровья. Реализуйте цикл боя, в котором каждое существо атакует по очереди, пока одно из них не умрет; примерная дуэль заканчивается тем, что орк остается жив, а у эльфа - ноль здоровья.
Инкапсуляция, полиморфизм и целенаправленное повреждение Скройте изменения внутреннего состояния, переместив вычисление точки попадания в target.get_damage и выполнив вызов атаки вместо того, чтобы касаться внутренних компонентов. Инкапсуляция отражает реальные интерфейсы, открывая небольшую простую поверхность и скрывая сложные внутренние компоненты. Наряду с наследованием и полиморфизмом с помощью методов dunder, это структурирует чистое, расширяемое поведение.
Защита с помощью @property и условных привилегий для орков Представьте защиту как вычисляемое свойство: защита равна умноженному на базовый уровень значению защиты. В параметре get_damage уменьшите наносимый урон на процент, основанный на защите, округлите до целых чисел и вычтите из очков здоровья; укажите защиту с помощью @property, чтобы она была доступна только для чтения. Установите базовую защиту для орков и эльфов и переопределите Orc.defense с помощью функции super(), чтобы утроить защиту, когда количество очков здоровья упадет ниже 50.
Процентное соотношение HP, финишер Elf и практика на мастер-классах Добавьте свойства max_health_points и health_points_percent для обобщения процентных проверок. Реализуйте функцию Elf's finisher: когда здоровье цели падает ниже 30 процентов, увеличивайте урон (в примере показано, что 15 становится 45). Проведите улучшенный бой — орк по—прежнему побеждает - и помните, что освоение классов требует постоянной практики и проектной работы.
Декораторы
04:23:28Декораторы как синтаксический сахар Python для переноса функций Декораторы в Python - это синтаксический сахар: функция, которая принимает другую функцию и корректирует ее поведение. Типичный шаблон определяет внутреннюю оболочку, которая запускает код до и после вызова обернутой функции. Возврат этой оболочки делает использование @decorator эквивалентным ручному присвоению функции ее обернутой версии, как показано на простом примере hello.
Пересылка аргументов и возврат результатов в оболочках Реальные функции принимают параметры, поэтому оболочка должна принимать *args и **kwargs и передавать их без изменений. С помощью say_hello(имя) декоратор по-прежнему выполняет действия до и после вызова, в то время как имя передается в исходную функцию. Когда обернутая функция возвращает значение, такое как сумма значений a и b, декоратор фиксирует этот результат и возвращает его вызывающей стороне.
Запрос визуального пересечения для получения почасовых данных о погоде Visual Crossing предлагает бесплатный погодный API; зарегистрируйтесь, чтобы получить ключ и избежать сохранения секретов в коде. Создайте URL-адрес в соответствии с документацией, указав город, дату и ключ, отправьте запрос и получите JSON. Ответ содержит массив дней для запрашиваемой даты и список часов, где каждый час содержит такие поля, как температура и уф-индекс.
Извлечение опасных ультрафиолетовых часов и перевод в градусы Цельсия В объекте "день" выберите дни[0]["часы"] для работы с почасовыми данными. Преобразуйте температуру по Фаренгейту в градусы Цельсия, используя стандартную формулу, и округлите по мере необходимости. Для каждого часа, если уф-индекс равен не менее 3, добавьте запись со временем, температурой по Цельсию и уф-индексом в список опасных часов и верните этот список обратно.
Повторное выполнение неудачных запросов через 5 и 30 секунд Оберните поиск погоды в декоратор повторных попыток, который перехватывает запросы.исключения.RequestException. В случае сбоя запишите сообщение в журнал, подождите 5 секунд, повторите попытку, затем подождите 30 секунд и повторите попытку. После последней попытки либо верните успешный результат, либо дайте ошибке проявиться; переключение интернет-соединения демонстрирует повторные попытки и восстановление.
Простейший telegram bot
04:40:14Зарегистрируйте бота в BotFather и настройте TeleBot Создайте нового бота в BotFather, выберите имя и логин пользователя и скопируйте выданный токен. Вставьте этот токен в код, чтобы бот мог пройти аутентификацию. Установите библиотеку pyTelegramBotAPI (TeleBot) через терминал и ознакомьтесь с ее документацией по использованию.
Инициализируйте TeleBot и ответьте на запросы /start и /help Импортируйте TeleBot, создайте его экземпляр с помощью токена и зарегистрируйте обработчик сообщений для команд start и help. В этом обработчике отправьте приветственный ответ, используя reply_to. Запустите долгосрочный цикл с помощью bot.infinity_polling, чтобы Telegram пересылал обновления в ваш скрипт. Подтвердите это, отправив / запустив и получив ответ.
Повторяет любое некомандное сообщение Добавьте обработчик сообщений с лямбдой, возвращающей значение True, чтобы перехватывать все сообщения, не относящиеся к командам. Используйте message.text для ответа с тем же содержимым и проверки атрибутов сообщения, если необходимо. Перезапустите скрипт и убедитесь, что произвольный ввод возвращается.
Добавьте крипто-клавиатуру и получайте цены с Binance
Определите словарь, сопоставляющий названия криптовалют с тикерами (например, BTCUSDT), создайте ReplyKeyboardMarkup и добавьте кнопку на клавиатуре для каждого имени. Отправьте клавиатуру, чтобы пользователь мог выбрать монету. Обработайте входящий текст, определив тикер, вызвав функцию get_price_by_ticker, которая использует запросы для запроса Binance, и ответив “Цена от
Дата и время
04:51:42Получение UTC и местного времени, строк ISO и компонентов При создании простого Telegram-бота, который вызывает другой сервис, обработайте время и даты с помощью модуля datetime в Python. Получите время UTC, вызвав datetime.теперь с аргументом timezone; в данный момент оно отличалось от московского на три часа. Если вы не указываете часовой пояс, вы получаете текущее местное время на компьютере. Используйте isoformat() для создания строки ISO с буквой "T" между датой и временем и считывания деталей с помощью таких атрибутов, как год, месяц, день, час и минута.
Даты, временные интервалы, удобочитаемое форматирование и синтаксический анализ Создайте datetime напрямую, передавая компоненты, или получите только дату с помощью функции date.today(), которая не содержит часов, минут или секунд. Извлеките дату из datetime с помощью .date() и вычислите ровно на 24 часа раньше, используя current_datetime - timedelta(дни=1). Для удобочитаемого вывода используйте strftime с кодами формата для форматирования строк, таких как "Воскресенье, 12 ноября 2023 года". Когда временная метка поступает в виде строки, преобразуйте ее в дату и время, указав строку вместе с соответствующими кодами формата.
Работа с файлами
04:57:52Ввод-вывод в формате JSON с помощью json.dump/json.загрузка и правильное закрытие файла Откройте файл JSON в режиме записи и запишите данные с помощью json.dump, передавая отступ, чтобы сделать вывод понятным для пользователя; без отступа он сворачивается в одну строку. После записи закройте файл, чтобы предотвратить утечку памяти и увеличение числа процессов обработки файлов, которые приводят к сбоям в работе системы. Снова откройте файл в режиме чтения и восстановите данные с помощью json.load. Снова закройте файл, чтобы завершить безопасный ввод-вывод в формате JSON.
Создание, чтение и добавление CSV-файлов с помощью csv.writer и DictReader/диктофона CSV хранит данные в виде строк, разделенных запятыми, и обычно начинается со строки заголовка, в которой указан каждый столбец. Запишите набор данных people в person.csv, открыв файл в режиме записи, создав csv.writer, записав строки и закрыв файл. Прочитайте его, открыв в режиме чтения и выполнив итерацию csv.DictReader, получая доступ к значениям по именам столбцов. Добавьте новые строки, снова открыв в режиме добавления ('a') и используя csv.DictWriter с теми же именами полей, затем закройте файл.
Менеджер контекста
05:05:15При открытии файла вручную и последующем вызове функции close() есть риск забыть о закрытии, что может привести к проблемам. Когда две операции всегда должны выполняться одновременно, например, открытие и закрытие, контекстный менеджер гарантирует выполнение обеих. При перезаписи кода обработки файлов для использования контекстного менеджера в Person.csv логика остается прежней при автоматическом закрытии файла. Это делает запуск кода простым и безопасным, не беспокоясь об очистке.
Изменяемые и неизменяемые структуры данных
05:06:38Идентификация объекта, переназначение и мутация на месте Присвоение одной переменной другой привязывает оба имени к одному и тому же объекту и ячейке памяти. Изменение неизменяемого значения, такого как целое число, создает новый объект с новым адресом, поэтому измененное имя перемещается, в то время как исходное остается неизменным. Изменение списка с помощью таких методов, как append, обновляет существующий объект на месте, поэтому каждая ссылка отслеживает изменение. Неизменяемые типы включают int, str, float, bool и None; изменяемые типы включают list, dict и set.
Идентичность против равенства: Используется для проверки личности "is" отвечает на вопрос, указывают ли два имени на один и тот же объект, в то время как "==" сравнивает значения. Два списка с одинаковым содержимым равны, но не идентичны; два имени, привязанные к одному списку, идентичны и равны между собой. При сравнении с логическими значениями или None предпочитайте 'is' (например, some_var равно True, some_var равно None), чтобы сделать намерение явным и избежать предупреждений о стиле.
Мелкое и глубокое копирование и вложенные изменяемые объекты Присвоение another_dict = my_dict сохраняет оба имени, указывающие на один и тот же объект, поэтому изменения в любом имени влияют на оригинал. Использование dict.copy() создает только неполную копию, которая по-прежнему использует вложенные изменяемые объекты, такие как списки. Изменение вложенного списка в копии приводит к неожиданному изменению оригинала; избегайте этого, используя deepcopy из стандартной библиотеки. Отдавайте предпочтение глубоким копиям, когда структуры могут содержать изменяемые элементы, чтобы избежать ошибок, которые трудно отследить.
Побочные эффекты функций для изменяемых аргументов Передача списка в функцию, которая изменяет его (например, очищает или перезаписывает), изменяет объект вызывающего объекта, поскольку функция получает ссылку. Если мутация является непреднамеренной, передайте копию, чтобы оригинал остался нетронутым. Если предполагается мутация, верните измененный объект и назначьте его, чтобы сделать намерение явным для читателей и будущих разработчиков. Это превращает скрытые побочные эффекты в явный поток данных.
Никогда Не Изменяйте Коллекции При Повторном Просмотре Добавление к списку во время итерации по нему приводит к неограниченному увеличению коллекции, что приводит к циклическому сбою. Удаление элементов на месте во время итерации приводит к пропуску элементов и приводит к некорректным результатам, например, к пропуску четного числа при фильтрации четных значений. Создайте новый список с пониманием и назначайте или расширяйте его после повторения, чтобы получить желаемый результат без побочных эффектов.
Изменяемые аргументы по умолчанию и операции на месте по сравнению с новыми операциями Использование изменяемого значения по умолчанию, такого как list=[], приводит к тому, что все вызовы используют один и тот же объект, поэтому более ранние вставки приводят к более поздним результатам; используйте значение по умолчанию None и инициализируйте внутри функции. Путаница между методами на месте и функциями, которые возвращают новые объекты, приводит к незначительным ошибкам: list.sort() мутирует и возвращает None, в то время как sorted(...) возвращает новый отсортированный список и оставляет исходный без изменений. Присваивайте переменную результату sorted, когда требуется отдельная отсортированная копия, и вызывайте .sort() только тогда, когда предполагается изменение порядка на месте.
Заключение
05:26:28Курс завершается напоминанием о том, что обучение редко продвигается по прямой: некоторые темы становятся понятными, в то время как другие остаются неясными, и это нормально. Даже опытные разработчики многократно повторяют материал — освоение двухчасовой асинхронной серии Python заняло пять полных циклов повторного просмотра. Прогресс в Python зависит от постоянной практики; когда что-то не получается, продолжайте практиковаться. Ищите на канале материалы о том, как стать программистом и расти профессионально, оставляйте отзывы в комментариях, подписывайтесь (особенно на канал в Telegram) и ставьте лайк.