Python яндекс практикум обработка ошибок

Задача 1 Напишите функцию what_weather() (англ. «какая погода?»), которую затем будете использовать в коде Анфисы: Выполните HTTP-запрос, поместив вызов функции get() внутрь блока try. Значения URL и параметров получите из функций make_url() (в неё нужно передать нужный город как аргумент city) и make_parameters(). При «выбрасывании» исключения типа requests.ConnectionError (от англ. «ошибка соединения») — функция what_weather() должна возвращать сообщение об ошибке ''. Если код HTTP-ответа равен 200 (всё хорошо), […]

Задача 1

Напишите функцию what_weather() (англ. «какая погода?»), которую затем будете использовать в коде Анфисы:

  • Выполните HTTP-запрос, поместив вызов функции get() внутрь блока try.
  • Значения URL и параметров получите из функций make_url() (в неё нужно передать нужный город как аргумент city) и make_parameters().
  • При «выбрасывании» исключения типа requests.ConnectionError (от англ. «ошибка соединения») — функция what_weather() должна возвращать сообщение об ошибке '<сетевая ошибка>'.
  • Если код HTTP-ответа равен 200 (всё хорошо), верните из функции текст ответа. В противном случае функция должна вернуть строку '<ошибка на сервере погоды>'.

Код:

import requests

cities = [
    'Омск',
    'Калининград',
    'Челябинск',
    'Владивосток',
    'Красноярск',
    'Москва',
    'Екатеринбург'
]

def make_url(city):
    # в URL задаём город, в котором узнаем погоду
    return f'http://wttr.in/{city}'

def make_parameters():
    params = {
        'format': 2,  # погода одной строкой
        'M': ''  # скорость ветра в "м/с"
    }
    return params

def what_weather(city):
    # Напишите тело этой функции.
    # Не изменяйте остальной код!
    try:
        request = requests.get(make_url(city), params=make_parameters())
        #print(request.status_code)
        if request.status_code == 200: return request.text
        else: return '<ошибка на сервере погоды>'
    except requests.ConnectionError : return '<сетевая ошибка>'

print('Погода в городах:')
for city in cities:
    print(city, what_weather(city))

Результат:

Погода в городах:
Омск ? ?️-7°C ?️↖4.2 m/s

Калининград ⛅️ ?️+2°C ?️↖6.1 m/s

Челябинск ? ?️-3°C ?️↘6.1 m/s

Владивосток ☀️ ?️-3°C ?️↓7.2 m/s

Красноярск ⛅️ ?️-10°C ?️→8.3 m/s

Москва ☀️ ?️-2°C ?️↑4.2 m/s

Екатеринбург ? ?️-2°C ?️↘4.2 m/s

Задача 2

Это задание — финальное.

В нём вы сделаете Анфису мастером на все руки.

Анфиса будет знать всё про ваших друзей — где они, сколько у них времени, и какая у них погода.В список запросов queries в функции runner() добавлены новые запросы про погоду:

  • Коля, как погода?
  • Соня, как погода?
  • Антон, как погода?

Научите Анфису отвечать на вопросы такого вида.

Для этого:

  1. Добавьте в функцию process_friend() обработку ещё одного запроса 'как погода?'. Для получения ответа на этот вопрос используйте значение city — это город, в котором живёт друг.
  2. Затем вызовите функцию what_weather() — вы написали на прошлом уроке почти такую же. Она уже доступна в коде этого задания.
  3. Верните результат выполнения этой функции как результат process_friend().

Код:

import datetime as dt
import requests

DATABASE = {
    'Сергей': 'Омск',
    'Соня': 'Москва',
    'Алексей': 'Калининград',
    'Миша': 'Москва',
    'Дима': 'Челябинск',
    'Алина': 'Красноярск',
    'Егор': 'Пермь',
    'Коля': 'Красноярск',
    'Артём': 'Владивосток',
    'Петя': 'Михайловка'
}

UTC_OFFSET = {
    'Москва': 3,
    'Санкт-Петербург': 3,
    'Новосибирск': 7,
    'Екатеринбург': 5,
    'Нижний Новгород': 3,
    'Казань': 3,
    'Челябинск': 5,
    'Омск': 6,
    'Самара': 4,
    'Ростов-на-Дону': 3,
    'Уфа': 5,
    'Красноярск': 7,
    'Воронеж': 3,
    'Пермь': 5,
    'Волгоград': 4,
    'Краснодар': 3,
    'Калининград': 2,
    'Владивосток': 10
}


def format_count_friends(count_friends):
    if count_friends == 1:
        return '1 друг'
    elif 2 <= count_friends <= 4:
        return f'{count_friends} друга'
    else:
        return f'{count_friends} друзей'


def what_time(city):
    offset = UTC_OFFSET[city]
    city_time = dt.datetime.utcnow() + dt.timedelta(hours=offset)
    f_time = city_time.strftime("%H:%M")
    return f_time


def what_weather(city):
    url = f'http://wttr.in/{city}'
    weather_parameters = {
        'format': 2,
        'M': ''
    }
    try:
        response = requests.get(url, params=weather_parameters)
    except requests.ConnectionError:
        return '<сетевая ошибка>'
    if response.status_code == 200:
        return response.text.strip()
    else:
        return '<ошибка на сервере погоды>'


def process_anfisa(query):
    if query == 'сколько у меня друзей?':
        count_string = format_count_friends(len(DATABASE))
        return f'У тебя {count_string}'
    elif query == 'кто все мои друзья?':
        friends_string = ', '.join(DATABASE.keys())
        return f'Твои друзья: {friends_string}'
    elif query == 'где все мои друзья?':
        unique_cities = set(DATABASE.values())
        cities_string = ', '.join(unique_cities)
        return f'Твои друзья в городах: {cities_string}'
    else:
        return '<неизвестный запрос>'


def process_friend(name, query):
    if name in DATABASE:
        city = DATABASE[name]
        if query == 'ты где?':
            return f'{name} в городе {city}'
        elif query == 'который час?':
            if city not in UTC_OFFSET:
                return f'<не могу определить время в городе {city}>'
            time = what_time(city)
            return f'Там сейчас {time}'
        elif query == 'как погода?':
            return what_weather(city)
            
        else:
            return '<неизвестный запрос>'
    else:
        return f'У тебя нет друга по имени {name}'


def process_query(query):
    tokens = query.split(', ')
    name = tokens[0]
    if name == 'Анфиса':
        return process_anfisa(tokens[1])
    else:
        return process_friend(name, tokens[1])


def runner():
    queries = [
        'Анфиса, сколько у меня друзей?',
        'Анфиса, кто все мои друзья?',
        'Анфиса, где все мои друзья?',
        'Анфиса, кто виноват?',
        'Коля, ты где?',
        'Соня, что делать?',
        'Антон, ты где?',
        'Алексей, который час?',
        'Артём, который час?',
        'Антон, который час?',
        'Петя, который час?',
        'Коля, как погода?',
        'Соня, как погода?',
        'Антон, как погода?'
    ]
    for query in queries:
        print(query, '-', process_query(query))


runner()

Результат:

Анфиса, сколько у меня друзей? - У тебя 10 друзей
Анфиса, кто все мои друзья? - Твои друзья: Сергей, Соня, Алексей, Миша, Дима, Алина, Егор, Коля, Артём, Петя
Анфиса, где все мои друзья? - Твои друзья в городах: Омск, Калининград, Михайловка, Красноярск, Москва, Челябинск, Владивосток, Пермь
Анфиса, кто виноват? - <неизвестный запрос>
Коля, ты где? - Коля в городе Красноярск
Соня, что делать? - <неизвестный запрос>
Антон, ты где? - У тебя нет друга по имени Антон
Алексей, который час? - Там сейчас 15:50
Артём, который час? - Там сейчас 23:50
Антон, который час? - У тебя нет друга по имени Антон
Петя, который час? - <не могу определить время в городе Михайловка>
Коля, как погода? - ⛅️ ?️-10°C ?️→7.2 m/s
Соня, как погода? - ☀️ ?️-3°C ?️↑4.2 m/s
Антон, как погода? - У тебя нет друга по имени Антон

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

Напишем программу, которая будет считать обратные значения для целых чисел из заданного диапазона и выводить их в одну строку с разделителем «;». Один из вариантов кода для решения этой задачи выглядит так:

print(";".join(str(1 / x) for x in range(int(input()), int(input()) + 1)))

Программа получилась в одну строчку за счёт использования списочных выражений. Однако при вводе диапазона чисел, включающем в себя 0 (например, от -1 до 1), программа выдаст следующую ошибку:

ZeroDivisionError: division by zero

В программе произошла ошибка «деление на ноль». Такая ошибка, возникающая при выполнении программы и останавливающая её работу, называется исключением.

Попробуем в нашей программе избавиться от возникновения исключения деления на ноль. Пусть при попадании 0 в диапазон чисел, обработка не производится и выводится сообщение «Диапазон чисел содержит 0». Для этого нужно проверить до списочного выражения наличие нуля в диапазоне:

interval = range(int(input()), int(input()) + 1)
if 0 in interval:
    print("Диапазон чисел содержит 0.")
else:
    print(";".join(str(1 / x) for x in interval))

Теперь для диапазона, включающего в себя 0, например, от -2 до 2, исключения ZeroDivisionError не возникнет. Однако при вводе строки, которую невозможно преобразовать в целое число (например, «a»), будет вызвано другое исключение:

ValueError: invalid literal for int() with base 10: 'a'

Произошло исключение ValueError. Для борьбы с этой ошибкой нам придётся проверить, что строка состоит только из цифр. Сделать это нужно до преобразования в число. Тогда наша программа будет выглядеть так:

start = input()
end = input()
# Метод lstrip("-"), удаляющий символы "-" в начале строки, нужен для учёта
# отрицательных чисел, иначе isdigit() вернёт для них False
if not (start.lstrip("-").isdigit() and end.lstrip("-").isdigit()):
    print("Необходимо ввести два числа.")
else:
    interval = range(int(start), int(end) + 1)
    if 0 in interval:
        print("Диапазон чисел содержит 0.")
    else:
        print(";".join(str(1 / x) for x in interval))

Теперь наша программа работает без ошибок и при вводе строк, которые нельзя преобразовать в целое число.

Подход, который был нами применён для предотвращения ошибок, называется «Look Before You Leap» (LBYL), или «посмотри перед прыжком». В программе, реализующей такой подход, проверяются возможные условия возникновения ошибок до исполнения основного кода.

Подход LBYL имеет недостатки. Программу из примера стало сложнее читать из-за вложенного условного оператора. Проверка условия, что строка может быть преобразована в число, выглядит даже сложнее, чем списочное выражение. Вложенный условный оператор не решает поставленную задачу, а только лишь проверяет входные данные на корректность. Легко заметить, что решение основной задачи заняло меньше времени, чем составление условий проверки корректности входных данных.

Существует другой подход для работы с ошибками: «Easier to Ask Forgiveness than Permission» (EAFP) или «проще извиниться, чем спрашивать разрешение». В этом подходе сначала исполняется код, а в случае возникновения ошибок происходит их обработка. Подход EAFP реализован в Python в виде обработки исключений.

Исключения в Python являются классами ошибок. В Python есть много стандартных исключений. Они имеют определённую иерархию за счёт механизма наследования классов. В документации Python версии 3.10.8 приводится следующее дерево иерархии стандартных исключений:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- EncodingWarning
           +-- ResourceWarning

Для обработки исключения в Python используется следующий синтаксис:

try:
    <код , который может вызвать исключения при выполнении>
except <классисключения_1>:
    <код обработки исключения>
except <классисключения_2>:
    <код обработки исключения>
...
else:
    <код выполняется, если не вызвано исключение в блоке try>
finally:
    <код , который выполняется всегда>

Блок try содержит код, в котором нужно обработать исключения, если они возникнут. При возникновении исключения интерпретатор последовательно проверяет в каком из блоков except обрабатывается это исключение. Исключение обрабатывается в первом блоке except, обрабатывающем класс этого исключения или базовый класс возникшего исключения. Необходимо учитывать иерархию исключений для определения порядка их обработки в блоках except. Начинать обработку исключений следует с более узких классов исключений. Если начать с более широкого класса исключения, например, Exception, то всегда при возникновении исключения будет срабатывать первый блок except. Сравните два следующих примера. В первом порядок обработки исключений указан от производных классов к базовым, а во втором – наоборот.

try:
    print(1 / int(input()))
except ZeroDivisionError:
    print("Ошибка деления на ноль.")
except ValueError:
    print("Невозможно преобразовать строку в число.")
except Exception:
    print("Неизвестная ошибка.")

При вводе значений «0» и «a» получим ожидаемый соответствующий возникающим исключениям вывод:

Невозможно преобразовать строку в число.

и

Ошибка деления на ноль.

Второй пример:

try:
    print(1 / int(input()))
except Exception:
    print("Неизвестная ошибка.")
except ZeroDivisionError:
    print("Ошибка деления на ноль.")
except ValueError:
    print("Невозможно преобразовать строку в число.")

При вводе значений «0» и «a» получим в обоих случаях неинформативный вывод:

Неизвестная ошибка.

Необязательный блок else выполняет код в случае, если в блоке try не вызвано исключение. Добавим блок else в пример для вывода сообщения об успешном выполнении операции:

try:
    print(1 / int(input()))
except ZeroDivisionError:
    print("Ошибка деления на ноль.")
except ValueError:
    print("Невозможно преобразовать строку в число.")
except Exception:
    print("Неизвестная ошибка.")
else:
    print("Операция выполнена успешно.")

Теперь при вводе корректного значения, например, «5», вывод программы будет следующим:

2.0
Операция выполнена успешно.

Блок finally выполняется всегда, даже если возникло какое-то исключение, не учтённое в блоках except или код в этих блоках сам вызвал какое-либо исключение. Добавим в нашу программу вывод строки «Программа завершена» в конце программы даже при возникновении исключений:

try:
    print(1 / int(input()))
except ZeroDivisionError:
    print("Ошибка деления на ноль.")
except ValueError:
    print("Невозможно преобразовать строку в число.")
except Exception:
    print("Неизвестная ошибка.")
else:
    print("Операция выполнена успешно.")
finally:
    print("Программа завершена.")

Перепишем код, созданный с применением подхода LBYL, для первого примера из этой главы с использованием обработки исключений:

try:
    print(";".join(str(1 / x) for x in range(int(input()), int(input()) + 1)))
except ZeroDivisionError:
    print("Диапазон чисел содержит 0.")
except ValueError:
    print("Необходимо ввести два числа.")

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

Исключения можно принудительно вызывать с помощью оператора raise. Этот оператор имеет следующий синтаксис:

raise <класс исключения>(параметры)

В качестве параметра можно, например, передать строку с сообщением об ошибке.

В Python можно создавать свои собственные исключения. Синтаксис создания исключения такой же, как и у создания класса. При создании исключения его необходимо наследовать от какого-либо стандартного класса-исключения.

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

  • NumbersError – базовый класс исключения;
  • EvenError – исключение, которое вызывается при наличии хотя бы одного чётного числа;
  • NegativeError – исключение, которое вызывается при наличии хотя бы одного отрицательного числа.
class NumbersError(Exception):
    pass


class EvenError(NumbersError):
    pass


class NegativeError(NumbersError):
    pass


def no_even(numbers):
    if all(x % 2 != 0 for x in numbers):
        return True
    raise EvenError("В списке не должно быть чётных чисел")


def no_negative(numbers):
    if all(x >= 0 for x in numbers):
        return True
    raise NegativeError("В списке не должно быть отрицательных чисел")


def main():
    print("Введите числа в одну строку через пробел:")
    try:
        numbers = [int(x) for x in input().split()]
        if no_negative(numbers) and no_even(numbers):
            print(f"Сумма чисел равна: {sum(numbers)}.")
    except NumbersError as e:  # обращение к исключению как к объекту
        print(f"Произошла ошибка: {e}.")
    except Exception as e:
        print(f"Произошла непредвиденная ошибка: {e}.")

        
if __name__ == "__main__":
    main()

Обратите внимание: в программе основной код выделен в функцию main. А код вне функций содержит только условный оператор и вызов функции main при выполнении условия __name__ == "__main__". Это условие проверяет, запущен ли файл как самостоятельная программа или импортирован как модуль.

Любая программа, написанная на языке программирования Python может быть импортирована как модуль в другую программу. В идеологии Python импортировать модуль – значит полностью его выполнить. Если основной код модуля содержит вызовы функций, ввод или вывод данных без использования указанного условия __name__ == "__main__", то произойдёт полноценный запуск программы. А это не всегда удобно, если из модуля нужна только отдельная функция или какой-либо класс.

При изучении модуля itertools, мы говорили о том, как импортировать модуль в программу. Покажем ещё раз два способа импорта на примере собственного модуля.

Для импорта модуля из файла, например example_module.py, нужно указать его имя, если он находится в той же папке, что и импортирующая его программа:

import example_module

Если требуется отдельный компонент модуля, например функция или класс, то импорт можно осуществить так:

from example_module import some_function, ExampleClass

Обратите внимание: при втором способе импортированные объекты попадают в пространство имён новой программы. Это означает, что они будут объектами новой программы, и в программе не должно быть других объектов с такими же именами.

Сегодня говорим про обработку ошибок и отказоустойчивость программ. Это продолжение статьи про исключения, но применительно к нашему проекту под кодовым названием «Воруй, убивай, цепи Маркова». Мы учимся забирать текст с чужих сайтов и генерировать на основе этого текста собственные. 

В предыдущих версиях у нас были идеальные условия: заготовленный список веб-страниц одинакового формата, с одинаковой кодировкой и одинаковой разметкой заголовков. 

В реальном парсинге условия неидеальные: чаще всего нужно парсить не свой сайт, а чужой. И на этом чужом сайте может быть что угодно: не открываются адреса, нет заголовка на странице, разные кодировки на разных страницах. Для компьютера это непреодолимые трудности. 

Чтобы такого не происходило, нам нужно научить наш алгоритм обрабатывать нештатные ситуации — то есть исключения. 

Что делаем

Идея для сегодняшнего проекта — спарсить часть текста и заголовков с сайта «Коммерсанта» для учебных целей. Потом мы их отдадим нашему алгоритму на цепях Маркова и получим новые тексты в духе «Коммерсанта».

Мы выбрали «Коммерсант» из-за его удобной структуры URL-адреса. Вот как выглядят типичные адреса новостей оттуда:

https://www.kommersant.ru/doc/4815427

https://www.kommersant.ru/doc/4803922

Видно, что каждая новость или статья просто опубликована под каким-то своим номером и есть ощущение, что эти номера идут по порядку. Поэтому сделаем так:

  1. Выберем стартовый номер у новости.
  2. Будем отнимать от этого номера единичку, подставлять его в адрес и смотреть на результат.
  3. Если страница откроется, сохраним заголовок и текст новости, а если нет — пойдём дальше.
  4. Повторим это 500 раз и посмотрим, что получится.

Адаптируем старый проект под новую задачу

Чтобы не писать всё с нуля, мы возьмём наш парсер из прошлого проекта и выкинем оттуда громадный кусок с массивом URL-адресов.

# подключаем urlopen из модуля urllib
from urllib.request import urlopen

# подключаем библиотеку BeautifulSout
from bs4 import BeautifulSoup

# открываем текстовый файл, куда будем добавлять заголовки
file = open("zag.txt", "a")

# перебираем все адреса из списка
for x in url:
    # получаем исходный код очередной страницы из списка
    html_code = str(urlopen(x).read(),'utf-8')
    # отправляем исходный код страницы на обработку в библиотеку
    soup = BeautifulSoup(html_code, "html.parser")

    # находим название страницы с помощью метода find()
    s = soup.find('title').text

    # выводим его на экран
    print(s)

    # сохраняем заголовок в файле и переносим курсор на новую строку
    file.write(s + '. ')

# закрываем файл
file.close()

Теперь добавим в этот код нашу логику. Для этого мы пропишем общую часть URL-адреса, запомним стартовый номер новости, а потом в цикле будем вычитать из него единичку и смотреть, что получилось.

👉 Мы вычитаем единицы из стартового числа, чтобы получить доступ к предыдущим материалам, потому что у новых статей номер в адресе «Коммерсанта» всегда больше, чем у старых. Ещё мы теперь ищем заголовок самой новости, а не всей страницы, потому что в заголовке страницы много лишнего текста.

# подключаем urlopen из модуля urllib
from urllib.request import urlopen

# подключаем библиотеку BeautifulSout
from bs4 import BeautifulSoup

# общая часть URL-адреса
url = "https://www.kommersant.ru/doc/"
# стартовый номер, с которого начинаем парсинг
start_id = 4804129

# открываем  файл, куда будем добавлять заголовки
file_zag = open("komm_zag.txt", "a")
# открываем  файл, куда будем добавлять текст
file_text = open('komm_text.txt','a')

# перебираем предыдущие 500 адресов
for x in range(0,500):

    # формируем новый адрес из общей части и номера материала
    # на каждом шаге номер уменьшается на единицу, чтобы обратиться к более старым материалам
    work_url = url + str(start_id - x)

    # получаем исходный код очередной страницы из списка
    html_code = str(urlopen(work_url).read(),'utf-8')
    # отправляем исходный код страницы на обработку в библиотеку
    soup = BeautifulSoup(html_code, "html.parser")

    # находим заголовок материала с помощью метода find()
    s = soup.find('h1').text
    # выводим его на экран
    print(s)

    # сохраняем заголовок в файле и переносим курсор на новую строку
    file_zag.write(s + '. ')

    # находим все абзацы с текстом
    content = soup.find_all('p')
    # перебираем все найденные абзацы
    for item in content:
        # сохраняем каждый абзац в другой файл
        file_text.write(item.text + ' ')
        print(item.text)

# закрываем файл
file.close()

После запуска мы видим две проблемы. Первая: у нас собирается много лишних абзацев с текстом, который не относится к новости. Все эти «Читать далее», «Архив» и «просмотров» нам не нужны:

Простая работа с исключениями

Вторая проблема: оказывается, не на всех страницах наш парсер может найти заголовок <h1>. Например, такое случается, если по текущему адресу материал доступен только по подписке или там находится служебная страница:

Простая работа с исключениями

Находим только текст новости

Чтобы не собирать со страницы все абзацы, а брать только нужный текст, давайте посмотрим на структуру любой подобной страницы в инспекторе:

Простая работа с исключениями

В коде видно, что содержимое статьи помечается абзацем с классом «b-article__text» , значит, нам нужно забирать со страницы только абзацы с таким классом. Поменяем нашу команду на такое:

content = soup.find_all('p', class_ = "b-article__text")

Теперь мы найдём на странице только те абзацы, у которых будет нужный нам класс, а остальные проигнорируем.

Добавляем исключение для обработки заголовков

👉 В этом проекте мы варварски отнеслись к исключениям и не проверяли тип ошибки, зато быстро получили рабочий код. В следующий раз мы исправимся, а пока будем работать на скорость.

Мы уже рассказывали про то, что такое исключения и как они помогают программистам. Если коротко, то исключения позволяют обработать заранее известную ошибку так, чтобы программа не прекращала работу, а продолжала делать что-то своё.

Мы будем использовать самый простой вариант обработки исключений: когда исключение обрабатывается в общем виде, без уточнения ошибки. Вот как это будет работать:

  1. Мы добавляем обработчик исключений к команде нахождения заголовка.
  2. Если всё нашлось нормально и ошибки нет, то обработчик будет сидеть тихо и ничего не делать.
  3. Если после команды поиска заголовка случилась ошибка, то мы сразу прекращаем дальнейшие команды и переходим к следующему адресу.

Плюсы такого решения — простота и скорость внедрения. Нам не нужно задумываться о том, какая именно ошибка случилась: при любой ошибке мы бросаем этот адрес и переходим к следующему.

Минус у этого способа тоже есть: мы не знаем, что именно произошло, и реагируем на всё одинаково. В простом учебном проекте это можно сделать, а в настоящем коммерческом коде — нет. Там нужно чётко всегда знать, что за ошибка случилась, чтобы проект более гибко и правильно реагировал на происходящее.

# включаем обработчик исключений для команды поиска
    try:
        # находим название страницы с помощью метода find()
        s = soup.find('h1').text
    # если случилась любая ошибка
    except Exception as e:
        print("Заголовок не найден")
        # прерываем этот шаг цикла и переходим к следующему
        continue

Обрабатываем ситуацию, когда страница не найдена

После того как мы исправили два предыдущих замечания и снова запустили программу, компьютер выдал ошибку 404 — страница с таким адресом не найдена:

Простая работа с исключениями

Это значит, что мы отправили запрос на такую страницу, которой нет на сервере. Так бывает, когда проверяешь адреса простым перебором — часть вариантов окажется нерабочими. 

Чтобы эта ошибка не мешала работать программе, снова добавим исключение с обработкой любой ошибки. Как только на этой команде встретили ошибку, то делаем как и раньше — бросаем всё и начинаем цикл с нового адреса.

# включаем обработчик исключений для запроса содержимого страницы
    try:
        # получаем исходный код страницы в виде байт-строки
        html_code = urlopen(work_url).read()
    # если случилась любая ошибка
    except Exception as e:
        print('Страница не найдена')
        # прерываем этот шаг цикла и переходим к следующему
        continue

Так, шаг за шагом, мы отлавливаем все ошибки и получаем код, который сможет обработать хоть 50 000 страниц и не упасть во время работы. В этом и есть смысл исключений — сделать так, чтобы программа продолжала работать, когда что-то пошло не по плану. Главное — предусмотреть возможные нештатные ситуации.

# подключаем urlopen из модуля urllib
from urllib.request import urlopen

# подключаем библиотеку BeautifulSout
from bs4 import BeautifulSoup

# общая часть URL-адреса
url = "https://www.kommersant.ru/doc/"
# стартовый номер, с которого начинаем парсинг
start_id = 4804129

# открываем  файл, куда будем добавлять заголовки
file_zag = open("komm_zag.txt", "a")
# открываем  файл, куда будем добавлять текст
file_text = open('komm_text.txt','a')

# перебираем предыдущие 500 адресов
for x in range(0,500):

    # формируем новый адрес из общей части и номера материала
    # на каждом шаге номер уменьшается на единицу, чтобы обратиться к более старым материалам
    work_url = url + str(start_id - x)

    # включаем обработчик исключений для запроса содержимого страницы
    try:
        # получаем исходный код страницы в виде байт-строки
        html_code = urlopen(work_url).read()
    # если случилась любая ошибка
    except Exception as e:
        print('Страница не найдена')
        # прерываем этот шаг цикла и переходим к следующему
        continue

    # отправляем исходный код страницы на обработку в библиотеку
    soup = BeautifulSoup(html_code, "html.parser")

    # включаем обработчик исключений для команды поиска
    try:
        # находим название страницы с помощью метода find()
        s = soup.find('h1').text
    # если случилась любая ошибка
    except Exception as e:
        print("Заголовок не найден")
        # прерываем этот шаг цикла и переходим к следующему
        continue
    # выводим его на экран
    print(s)

    # сохраняем заголовок в файле и переносим курсор на новую строку
    file_zag.write(s + '. ')

    # находим все абзацы с текстом новости
    content = soup.find_all('p', class_ = "b-article__text")
    # перебираем все найденные абзацы
    for item in content:
        # сохраняем каждый абзац в другой файл
        file_text.write(item.text + ' ')
        print(item.text)

# закрываем файл
file.close()

Что дальше

У нас есть 500 заголовков и столько же новостей — можно собрать новости в стиле «Коммерсанта». Если не знаете, как это сделать, — почитайте нашу статью про генератор на цепях Маркова

#статьи

  • 7 фев 2023

  • 0

Разбираемся, что там под капотом популярных курсов по Python: максимально объективно душним про договоры, учебные модули и все мелкие нюансы.

Иллюстрация: Colowgee для Skillbox Media

Редакция «Код» Skillbox Media

Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.

Python сейчас везде. Это основной язык в data science и один из самых популярных языков веб-разработки. Новички выбирают его для старта в IT из-за простоты синтаксиса, готовых библиотек, возможностей фреймворков, обширных баз знаний для самостоятельного изучения и большого количества платных курсов, где полезные материалы и задачи уже отобраны.

В этой статье мы решили сравнить программы «Python-разработчик плюс» от «Яндекс Практикума» и «Профессия Python-разработчик» от Skillbox. Для этого мы изучили информацию из открытых источников — лендингов и промостраниц, описаний модулей, юридической документации. Собрали всё, что полезно знать о курсе будущему студенту.

  • Как проходит учёба: сравнили форматы обучения — групповое и индивидуальное, как дают обратную связь, сколько времени в неделю потребуется, сколько стоит обучение и можно ли попробовать бесплатно.
  • Содержание курсов: для кого написаны учебные программы и какие темы они включают, кто авторы, какие навыки на выходе, сколько проектов можно добавить в портфолио и как искать работу после обучения.
  • Организация: можно ли брать академ, как оплачивать обучение, как работает поддержка курса и можно ли вернуть деньги, если не понравилось.

Курс «Профессия Python-разработчик» в Skillbox существует 4 года. За это время мы меняли подходы, содержание курсов, обновляли темы и непрерывно анализировали, чего компании ждут от начинающего специалиста. В итоге собрали программу, которая помогает уверенно стартовать в карьере и применять новые знания в реальных проектах.

Python — хорошая отправная точка для тех, кто ищет своё направление в IT: кроме старта в веб-разработке, знание этого языка даёт возможность выбрать работу и из других сфер — освоить анализ данных, машинное обучение, DevOps, тестирование, аналитику или менеджмент.

Программы Skillbox и «Яндекс Практикума» допускают изучение языка Python с нуля, но также подойдут тем, кто уже что-то умеет:

  • осваивает Python самостоятельно или по учебникам, но при этом некому задать вопрос и обратиться за помощью;
  • планирует перейти в IT или пробует автоматизировать задачи в своей работе.

У Skillbox единый старт для тех, кто только начинает, и тех, кто уже самостоятельно практиковался. При желании можно отдельно купить сокращённую или расширенную версии программы обучения на Python-разработчика и некоторые курсы.

«Яндекс Практикум» даёт расширенную программу для тех, кто только начинает, и возможность выбора коротких программ обучения, если базовые знания языка уже есть: углублённый Python, бэкенд на Django, API, интерфейс взаимодействия программ.

Python не требует мощного железа и больших ресурсов, но у школ есть универсальные требования для всех студентов-разработчиков.

Skillbox «Яндекс Практикум»
Компьютер Любой компьютер под управлением Windows 7 или 10, Linux или macOS от 10.11 и выше.

Не менее 4 ГБ оперативной памяти, свободные 5 ГБ на жёстком диске

Компьютер или ноутбук с Windows или macOS.

Slack для общения

Среда разработки для выполнения домашних работ PyCharm VS Code
Микрофон и динамики для встреч с наставником и групповых звонков Обязательно Обязательно
Образование Для получения сертификата образование необязательно.

Для получения диплома ДПО нужно оконченное среднее образование

Для получения диплома ДПО нужно оконченное среднее образование

В этом разделе рассказываем о программах обучения профессии Python-разработчика и о том, что в них входит: разделы и темы, время на усвоение. Оценим глубину погружения и содержание программ исходя из того, что должен знать джуниор на старте карьеры в IT-компании.

Скришот: Skillbox

Курс «Профессия Python-разработчик» включает три основных блока — Python Basic, Django и Python Advanced и дополнительные курсы, которые можно проходить параллельно, — по веб-вёрстке, языку запросов SQL и системе контроля версий Git.

Курс построен так, чтобы новые знания усваивались: сложность занятий увеличивается постепенно.

Время: изучение всех блоков курса «Профессия Python-разработчик» от Skillbox займёт около 9,5 месяца, в зависимости от типа выбранной программы. Это курс по основам работы с Python (3,5 месяца), изучение фреймворка Django (2,5 месяца) и Python Advanced (3,5 месяца). Конечно, в зависимости от интенсивности обучения срок в 9,5 месяца может меняться.

Нет жёсткого расписания и дедлайнов, можно заниматься в удобное время и уделять учёбе 3–5 часов в неделю.

Авторы программы опытные преподаватели, руководители технических проектов, ведущие разработчики, инженеры и лидеры направлений из EPAM, «Сбера», МТС, AGIMA и других компаний.

Обновление материалов — в 2022 году, новые разделы курса доступны всем студентам, даже тем, кто купил программу до обновления.

Ограничение доступа. Согласно пункту 4.2.5 Договора оферты, доступ к обучающей платформе может быть приостановлен, если клиент нарушил Договор, не предоставил всю необходимую информацию или предоставил неполную информацию, необходимую для оказания услуг по Договору в соответствии с законодательством РФ.

Скриншот: «Яндекс Практикум»

Курс «Яндекс Практикума» делится на две программы: базовую — «Python-разработчик» (9 месяцев) и расширенную — «Python-разработчик плюс» (14 месяцев). Это программа, в которой есть индивидуальная работа — теория и практика, а ещё много онлайн-встреч, вебинаров, разборов заданий и других групповых активностей.

Темы расширенного курса включают углублённое изучение Python, бэкенд на Django, API, интерфейс взаимодействия программ, управление проектом на удалённом сервере, алгоритмы и структуры данных, альтернативные фреймворки и Python для бизнеса.

Время: курс «Python-разработчик плюс» разбит на спринты, где на каждый раздел отводится 1–1,5 месяца. По временным затратам обучение потребует примерно 15–20 часов в неделю.

Авторы: учебную программу «Яндекс Практикума» создаёт команда из преподавателей, методологов и действующих специалистов «Яндекса», Школы анализа данных и других сильных технологических компаний.

Обновление материалов: нет информации.

Ограничение доступа. Согласно Договору оферты, «Яндекс Практикум» оставляет за собой возможность закрыть доступ по своей инициативе, если ученик нарушил правила обучения. Например, использовал образовательный контент в других целях.

Бонусом к обучению в Skillbox идут курсы. Они дополняют навыки будущего программиста и позволяют сориентироваться в рабочих задачах и в общении на рабочие темы.

Параллельно с платным курсом по Python от Skillbox можно изучать:

  • базовый курс по вёрстке на HTML/CSS;
  • язык запросов SQL;
  • систему контроля версий Git;
  • английский для IT-специалистов.;
  • курс по универсальным знаниям программиста;
  • курс по карьере и развитию программиста.

Бесплатные курсы по профориентации в разных направлениях. Как пример:

  • «Введение в программирование»
  • «Введение в аналитику»

Дополнительные курсы «Яндекс Практикума» открыты для всех, при условии регистрации. Вот что может пригодиться будущему Python-разработчику:

  • Курс по профориентации в мире цифровых профессий
  • «Какую профессию в программировании выбрать»
  • «Как составить резюме»
  • «Основы математики для цифровых профессий»
  • Курс по Excel для специалистов цифровых профессий
  • Наставничество для тимлидов: как давать обратную связь, решать конфликты и мотивировать

Программы курсов выглядят громоздко, и разобраться в их структуре может быть сложно. Программы Skillbox и «Яндекс Практикума» предлагают студентам стартовать с основ — программирования и базовых навыков применения Python — и далее расходятся. Skillbox углубляется в изучение языка — многозадачность, базы данных, MVC-фреймворк, веб-разработку с помощью Flask и Django, веб-вёрстку, Git, а «Яндекс Практикум» уделяет больше внимания алгоритмам и структурам данных, основам DevOps, парсингу, управлению проектом на удалённом сервере.

Содержание программ мы собрали в таблицу и сопоставили разделы по двум критериям:

  • Полнота — какие темы включили авторы курса и насколько подробно их изложили.
  • Сложность — как авторы скомпоновали курс для разработчиков, сколько сложных тем, которые требуют регулярного повторения, или простых тем, которые легко осваивают новички. Чем больше полнота, тем выше сложность.

Содержание модулей

В таблице можно посмотреть, какие модули и разделы включает каждый курс по программированию на Python, насколько подробно раскрыты темы и какие знания, кроме технических, ещё предлагает школа.

Открыть таблицу

Оценка модулей

Вторая таблица поможет оценить программы с точки зрения важных для Python-разработчика технических знаний: по шкале от 1 до 10 мы оценили полноту и сложность материалов по основам языка, Git, базам данных, алгоритмам и другим разделам.

В сравнении учитывали состав программы и время, которое школа отводит на изучение каждого раздела. По нашей оценке получилось, что программа «Яндекс Практикума» больше в объёме материала и сложнее, у Skillbox — чуть меньше в объёме, но легче для усвоения.

Открыть таблицу

Skillbox «Яндекс Практикум»
Можно учиться с нуля
Подойдёт начинающим разработчикам
Полнота программы (чем больше, тем лучше) 7,93 из 10 8,43 из 10
Сложность программы (чем меньше, тем лучше) 4,5 из 10 5,36 из 10
Полный курс обучения 9,5 месяца 9–14 месяцев в зависимости от формата
Сколько часов в неделю 3–5 часов в неделю в обычном графике, 15–20 часов в ускоренном графике Не меньше 15–20 часов в неделю
Дата обновления материалов 2022 год Нет информации
Ограничение доступа к материалам Доступ к платформе может быть приостановлен, если студент нарушит условия Оферты или не предоставит все необходимые для оказания услуги данные В услуге может быть отказано, если студент нарушит любое из положений Оферты и Условий сервиса
Дополнительные курсы

Может показаться, что форматы обучения в онлайн-школах похожи: теория, практика, онлайн-созвоны и проверка работ. Но каждая школа строит процесс так, как считает наиболее эффективным, — учитывает количество и сложность тем, нагрузку, возможности поддержки начинающих разработчиков и преподавателей. Здесь смотрим, чем похожи и чем различаются форматы и как проходит учёба.

Курс по программированию Skillbox включает видеолекции, практические задания, стажировку в команде, диплом, проводятся дополнительные вебинары по материалам модулей, где можно пообщаться вживую с куратором и задать вопросы.

Самостоятельное обучение — асинхронное: есть предзаписанные видеолекции по 15 минут, структурированный и удобный формат теории и практика, которая готовит начинающих разработчиков к реальным задачам. В таком формате удобно выбирать время для занятий самостоятельно и не зависеть от онлайн-трансляций: читать теорию, поэтапно смотреть лекции и выполнять задания.

Каждый модуль завершается практикой. Результат проверяет преподаватель — оценивает подход к задаче и чистоту кода, оставляет комментарии и рекомендации, делится дополнительными материалами. Если задание сделано верно, студент переходит к следующему модулю и новому практическому заданию.

Курс в «Яндекс Практикуме» — это записи лекций, вебинары, теория и практика, диплом и дополнительные проекты. Обучение проходит в потоке — здесь больше созвонов, онлайн-контактов с наставниками и группой, чтобы быстрее интегрироваться в новую сферу.

Обучение разбито на двухнедельные спринты: одна неделя — теория и практика в тренажёре, вторая неделя — проектная работа и код-ревью. Раз в две недели школа проводит вебинары с разбором темы нового спринта, сессиями лайв-кодинга и ответами на вопросы. Чтобы пройти в следующий спринт, нужно сдать самостоятельный проект, а чтобы сдать проект, нужно пройти код-ревью без критичных ошибок.

Между тематическими блоками есть каникулы по одной неделе. Когда занятий нет, но доступ к материалам открыт.

При обучении работе с кодом важно закрепить навыки, вовремя отследить ошибки и отработать правильные решения. Среда для разработки, или IDE, — основной инструмент разработчика, в котором он пишет код и наблюдает результат. В Skillbox и «Яндекс Практикуме» подходы к работе в IDE похожи: на начальных модулях — упрощённая версия IDE или тренажёр, и далее — полноценные IDE для более сложных задач.

Инструменты Skillbox — это браузерная IDE Replit, которая заменяет тренажёр на старте, и далее обучение проходит на базе IDE от JetBrains. «Яндекс Практикум» использует свою версию тренажёра, встроенную в образовательную платформу, и IDE на разных этапах обучения.

У тренажёра и полноценной IDE разные задачи и возможности. Тренажёр помогает программистам-новичкам привыкнуть к работе с кодом. Как правило, окружение уже настроено и остаётся выполнять задания. Это более простой и понятный путь для обучения.

С полноценной IDE задача усложняется: Skillbox учит студентов настраивать окружение, пользоваться Git, создавать репозитории, ветки, делать мерж-реквесты и получать ревью кода в том виде, как если бы это была реальная задача, а не учебный проект. На время обучения студент получает бесплатно лицензионную среду разработки PyCharm Professional Edition. Так можно приобрести опыт, который является стандартом работы, впитать общепринятую культуру разработки, чтобы не переучиваться на рабочем месте.

Тренажёр IDE
Старт Лёгкий старт, всё уже настроено и готово к работе Сложнее на старте, нужно настроить и разобраться, как работает среда
Начало работы Доступ с разных устройств в любое время Для работы нужно настроить локальное окружение на компьютере
Универсальность В реальной работе придётся погружаться в более сложные инструменты Практичность и универсальность навыков для работы с кодом

Авторы курсов — ведущие разработчики, инженеры и лидеры направлений. Они составляют программы, записывают лекции, но не всегда участвуют в практической работе студентов. На каждом потоке онлайн-курса есть люди, которые помогают справиться с трудностями, проверяют работы, консультируют и проводят встречи.

На курсе Skillbox с этими задачами помогает куратор — практикующий Python‑разработчик и эксперт курса. Кураторов тщательно отбирают через интервью и тестовые задания. Как правило, это люди из крупных компаний — например, «Сбера», «Газпрома, «Тинькофф». А тимлидом может стать активный студент, который готов модерировать встречи и организовать группу.

Общение со студентами происходит на образовательной платформе и на вебинарах по материалам модулей, где можно пообщаться вживую и задать вопросы.

Также есть закрытый чат в Telegram, где можно общаться и обмениваться полезными материалами с другими пользователями платформы. А куратор ответит на вопросы по курсу и даст советы по выполнению заданий.

Поддержка работает 24/7.

На курсе «Яндекс Практикума» роли распределены по задачам:

  • код-ревьюер — разработчик, который проверяет работы, даёт рекомендации;
  • наставник — помогает дойти до цели, подвести итоги спринта и разобраться в изучаемом материале;
  • куратор — помогает с организационными вопросами и делает так, чтобы ученик не пропустил важную ссылку или созвон.

Обратную связь по содержанию и организации курса в «Яндекс Практикуме» можно получить от наставника, куратора, код-ревьюера или поддержки. Общение с преподавателями и студентами проходит в Slack. Поддержка отвечает 24/7.

Курс Skillbox можно купить в рассрочку и спланировать свой бюджет, разбив всю сумму на небольшие ежемесячные платежи. Первый платёж — через 3 месяца после начала обучения. Важно: кредит даёт банк — партнёр школы, и все финансовые вопросы, в том числе в случае возврата средств при отказе от учёбы, предстоит решать с банком (команда возвратов Skillbox помогает пройти этот путь).

Стоимость курса «Python-разработчик» в Skillbox зависит от тарифа, который выбирает студент. Стартовая цена — 5731 рубль в месяц. Есть более дорогие тарифы — это зависит от набора опций (количество материалов, объём помощи по трудоустройству).

Ещё, если студент ранее учился разработке в Skillbox, ему не придётся повторно платить за курсы, которые дублируются в программе обучения на Python-разработчика, — например, курс по вёрстке или системе контроля версий Git и другие.

Обучение Python в «Яндекс Практикуме» можно оплатить сразу, а можно вносить платежи помесячно. Единоразовый платёж позволяет сэкономить до 30 000 рублей. Стоимость различается в зависимости от программы курса (цена на 1 октября 2022 года):

  • для 9-месячной программы стоимость — 138 600 рублей единовременно или по 7537 рублей в месяц;
  • для 14-месячной, расширенной программы — 215 600 рублей единовременно или по 11 724 рубля в месяц.

Обучение в школе — это услуга, условия которой подробно описаны в договоре-оферте. Сценарии возврата денег за обучение в Skillbox и «Яндекс Практикуме» похожи. Школы возвращают деньги, если:

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

Примечания

Если курс Skillbox достался в подарок, деньги за него вернуть нельзя.
Если студент «Яндекс Практикума» был в академическом отпуске, это время считается учебным и в возврат не входит.

  • Студент окончил обучение, но спустя 6 месяцев не смог найти работу. Skillbox возвращает затраты на обучение при условии, что студент соблюдал все рекомендации и посещал все мероприятия по помощи в трудоустройстве: прошёл консультации, собрал резюме и портфолио разработчика по рекомендациям, откликался на вакансии и пробовал себя на интервью в разных компаниях.
  • Условия для возврата в «Яндекс Практикуме»: в течение 6 месяцев после окончания программы учащийся должен делать ежемесячно по 30 откликов на вакансии на job-ресурсах и тем, что предлагают партнёры школы. Возврат сделают, если не было ни одного предложения о работе.

Примечания

Доступно для 14-месячной программы «Разработчик Python плюс».

Во время учёбы в обеих школах есть возможность брать академический отпуск. Обычно это нужно, когда нагрузка слишком большая или трудно совмещать обучение с работой. За время академа можно подтянуть пробелы, завершить дела, решить, стоит ли учиться дальше.

В Skillbox есть возможность взять паузу в любой момент. Ограничений по количеству академов нет.

В «Яндекс Практикуме» можно брать академ длиной в один месяц два раза за всё время.

Чтобы разобраться, с чем предстоит иметь дело в ближайшие 12–14 месяцев, у некоторых курсов есть тест-драйвы — открытые разделы или специальные материалы, через которые можно познакомиться с платформой, стилистикой курса, оценить качество звука и видео и удобство восприятия.

У курса «Python-разработчик» в Skillbox есть бесплатный доступ на ограниченный срок — 3 модуля на 3 дня. Чтобы получить курс, нужно оставить заявку на него и попросить менеджера отдела продаж открыть его. Чтобы познакомиться с образовательной платформой и подходом ещё есть бесплатный вводный курс и материалы с базой знаний, которую собрала школа:

  • Бесплатный курс для совсем начинающих с несколькими уроками на Python
  • Статьи
  • Бесплатные видеоуроки и вебинары
  • Гайд Skillbox Media по открытым источникам для изучения языка

В курсе «Практикума» есть открытая для всех бесплатная часть — первые 8 тем на 20 часов теории и практики. Это вводный курс. Он поможет понять, подходит ли вам язык Python и бэкенд как направление разработки, сделать начальные шаги и написать первый код, а ещё рассказывает, как устроено обучение на платформе.

Чтобы открыть бесплатную часть курса по программированию, достаточно нажать кнопку «Начать учиться» и ввести данные своей почты. Разделы можно пройти самостоятельно или в формате челленджа — за две недели, с дедлайнами и с группой таких же начинающих разработчиков.

Темы бесплатных разделов: переменные и типы, циклы и ветвления, функции, сетевые запросы, словари и множества, строки и форматирование, библиотеки, протокол HTTP.

В эту таблицу мы вынесли сравнительные данные по максимально похожим программам от Skillbox и «Яндекс Практикума». Состав курсов практически идентичен, а тарифы могут различаться набором дополнительных опций.

Учёба Skillbox «Яндекс Практикум»
Самостоятельное обучение — время выбираете сами
Онлайн-встречи, вебинары, сессии лайв-кодинга
Ритм обучения Самостоятельное — в своём ритме, есть дополнительные групповые вебинары, чат участников Школа не говорит точно, в каком формате обучение: в программе есть самостоятельные задачи и есть групповые — созвоны, вебинары, сессии кодинга и чат участников
Задания с разбором решений
Обучение на тренажёре ✅ 

Replit

Обучение в IDE (среде разработки, то есть реальном инструменте, с которым работают профессиональные программисты)
Обратная связь по курсу Поддержка работает 24/7, но есть и гарантированное время ответа: 1–3 рабочих дня 24/7 — работа поддержки
Работа в команде
Дополнительные проекты в период обучения
Академический отпуск ✅ 

Без ограничений

✅ 

Только 2 раза по 30 дней

Деньги Skillbox «Яндекс Практикум»
Стоимость обучения 5731 рубль в месяц 11 724 рубля в месяц
Можно полностью оплатить обучение
Рассрочка
Возврат денег

Возврат по инициативе учащегося.

Возврат, если учащийся не нашёл работу после завершения обучения (есть условия)

Возврат по инициативе учащегося.

Возврат доступен только в расширенной программе, если учащийся не нашёл работу после завершения обучения (есть условия)

Налоговый вычет

Да, если курс куплен через программу «Цифровые профессии»

Да. Есть рекомендации, как это сделать, в разделе «Справка»

Тест-драйв курса

Можно запросить тестовый доступ: 3 модуля на 3 дня. Дополнительно есть открытый базовый курс Python и много бесплатных материалов, чтобы освоить основы языка

Первые 8 тем курса

По итогу обучения в Skillbox знания и навыки студента приближены к уровню джуниора. Он освоил все нужные инструменты и после обучения может работать программистом с реальными задачами в среде разработки, умеет работать в команде и понимает, что важно в работе, когда ты на проекте не один, при желании имеет опыт управления группой, умеет управлять потоком задач, придерживаться дедлайнов и знает, как найти своё место на рынке труда — откликаться, проходить интервью и онбординг.

Что умеет выпускник курса Skillbox как разработчик (технические навыки):

  • Создаёт простые и сложные модульные программы: от консольных скриптов до чат-ботов.
  • Работает с базами данных.
  • Использует промышленные средства разработки: Git, PyCharm, Postman.
  • Пишет автотесты.
  • Работает с популярными фреймворками — Django, Flask.
  • Пишет запросы к базам данных на Python с помощью SQLAlchemy, Django ORM.
  • Деплоит приложения на сервер.
  • Упаковывает проекты в Docker и применяет DevOps-практики.

Документ об образовании — сертификат Skillbox, который подтверждает, что курс пройден. Если курс куплен по программе «Цифровые профессии» — диплом ДПО.

«Яндекс Практикум» не обещает конкретный уровень по градации разработчиков. На выходе студент, окончивший курс разработки на Python, создаёт сервисы, знает, как разрабатывать внутреннюю логику проекта, работал в команде, умеет проходить интервью и отвечать на вопросы, понимает, как работают базовые процессы в командах разработки.

Чему научится выпускник курса «Яндекс Практикума» (технические навыки):

  • Грамотно писать код на Python, понимать, как работает язык, и применять встроенные инструменты и модули.
  • Использовать знания об алгоритмах и структурах данных.
  • Работать с веб-фреймворками Django, Flask и FastAPI.
  • Разбираться, как веб-проекты взаимодействуют друг с другом, запрашивая и передавая информацию.
  • Настраивать сервер в облаке, автоматизировать процессы тестирования и обновления кода.
  • Разворачивать свой проект в Docker-контейнерах на сервере.
  • Ускорять работу проектов.
  • Собирать информацию с сайтов, структурировать её и выводить в удобном формате.

Документ об образовании — свидетельство о дополнительном профессиональном образовании или диплом о профессиональной переподготовке, если у учащегося есть высшее, среднее специальное или профессиональное образование.

В процессе обучения в Skillbox студент выполнит около 100 практических работ и сможет добавить в портфолио 3 проекта:

  • телеграм-бот по заданию турагентства Too Easy Travel;
  • серверная часть для полноценного маркетплейса (имитация интернет-магазина);
  • социальная сеть, аналог Twitter.

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

Результаты обучения в «Яндекс Практикуме» различаются в зависимости от программы, которую выбрал студент.

На 9-месячном курсе «Python-разработчик» студенты делают 6 проектов, наааа 14-месячном курсе «Python-разработчик плюс» — 12. Это приложения для фитнес-трекера, платформа для блогов с регистрацией, постами, загрузкой картинок и комментариями, бот в Telegram, API для блогерской платформы, REST API для сервиса и другие.

Дополнительно «Яндекс Практикум» предлагает студентам волонтёрские проекты — реальные задачи для фондов, организаций и других заказчиков, которым нужна помощь. Ими тоже можно дополнить портфолио.

На дипломный проект отводится 3–4 недели. Это самостоятельная задача: нужно написать веб-приложение «Продуктовый помощник» — сайт с публикациями рецептов различных блюд.

Школы сопровождают студентов не только во время учёбы, но и на этапе поиска работы. Так копилка опыта начинающего специалиста пополняется знаниями о поиске работы: что писать в резюме, какие проекты показывать, как готовиться к интервью и отвечать на вопросы HR-менеджера.

Как разработчиков-новичков поддерживает на старте карьеры Skillbox:

  • открывают стажировки на курсе — первый реальный опыт студенты получают в процессе учёбы;
  • дают доступ к вакансиям компаний-партнёров, которые оставляют заявки на специалистов в Skillbox напрямую;
  • карьерный консультант помогает составить резюме и профиль на работных сайтах — объясняет, как подать информацию о себе, чтобы работодатель заинтересовался;
  • HR-специалист готовит студентов к собеседованию, учит договариваться о зарплате и условиях труда;
  • в программу обучения входит отдельный курс «Карьера и трудоустройство».

В некоторых тарифах есть карьерное сопровождение и погружение в профессию после прохождения курса.

Как начинающих разработчиков поддерживает на старте карьеры «Яндекс Практикум»:

  • есть бесплатный курс по трудоустройству — начинается за 2 месяца до конца обучения;
  • помогают составить резюме, портфолио и мотивационное письмо;
  • сопровождают в откликах на вакансии;
  • проводят индивидуальные карьерные консультации;
  • тренируют навыки на публичных собеседованиях и межфакультетских проектах;
  • поддерживают выпускника в течение 14 месяцев после завершения учёбы.
Итоги обучения Skillbox «Яндекс Практикум»
Уровень на выходе Джуниор Не оценивается
Количество проектов 3 6–12
Время на диплом От 3 недель до 3 месяцев 3–4 недели
Работа над дипломом Можно выбрать: самостоятельно или в команде под руководством опытного тимлида Самостоятельно
Документ Сертификат Skillbox (если курс куплен по программе «Цифровые профессии» — диплом ДПО) Диплом ДПО от «Яндекс Практикума»
Работа или стажировка после курса Skillbox «Яндекс Практикум»
Помогают попасть на стажировку
Помогают найти работу
Доступ к партнёрским вакансиям
Помощь с поиском и карьерное консультирование Skillbox «Яндекс Практикум»
Помощь с резюме и портфолио
Профиль на сайтах с вакансиями
Индивидуальный карьерный план
Подготовка к интервью

В этом материале мы подробно разобрали, что включает в себя учёба на курсах для тех, кто хочет стать Python-разработчиком, от Skillbox и «Яндекс Практикума». Сравнили форматы и учебные программы, чем различается учёба, сколько ресурсов она требует и что получает студент на финише.

Получение новой профессии — огромный труд и большие затраты, и мы понимаем, что на стадии выбора хочется учесть все условия и найти программу, которая подойдёт вам лучше всего. Для этого собрали чек-лист — о чём подумать перед тем, как принять решение о покупке курса.

  • Зафиксируйте для себя цели и возможности:
  • Цели. К чему вы хотите прийти к концу обучения, какие навыки получить.
  • Время. Сколько времени готовы уделять учёбе. Разберите свой график и реалистично оцените, сможете ли учиться в потоке, где группе нужна ваша активность на созвонах, в чате или сессиях лайв-кодинга, или будет комфортнее двигаться в своём ритме по обозначенным дедлайнам и включаться в обсуждения время от времени.
  • Внимание. Оцените нагрузку, если вы уже работаете: насколько вы продуктивны, есть ли силы и ресурс изучать новую предметную область, искать решения, много читать, смотреть и пробовать.
  • Деньги. Подумайте, какой бюджет на обучение для вас приемлем и какую сумму вы готовы платить ежемесячно, двигаясь к цели.
  • Оцените риски. Зафиксируйте все причины, по которым вам может потребоваться пауза в обучении или оплате. Изучите, что предлагает школа в этих случаях.
  • Попробуйте бесплатные материалы школы: как устроено обучение, в каком формате дают материал, понятно или возникают вопросы, с каких устройств удобно смотреть теорию или выполнять задачи (можно ли использовать мобильную версию) — примерьте это на ваш образ жизни.
  • Почитайте истории трудоустройства начинающих Python-разработчиков. Оцените, нужна ли вам помощь карьерного консультанта в подготовке к интервью и в анализе вакансий, в каком объёме или у вас уже есть опыт в поиске работы.
  • Решите, нужен ли вам диплом как документ. Если вы проходите переподготовку и от этого зависит ваша прибавка к зарплате или разряд, проконсультируйтесь с бухгалтерией или отделом кадров. Во всех остальных случаях диплом или сертификат — это формальное подтверждение того, что вы прошли курс. В реальности работодателя будет интересовать портфолио, фундаментальные знания, гибкость, софт-скиллы, умение работать в команде, планировать свою активность и профессиональный кругозор.

Учись бесплатно:
вебинары по программированию, маркетингу и дизайну.

Участвовать

Школа дронов для всех
Учим программировать беспилотники и управлять ими.

Узнать больше

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Decorators in Python is one of the most useful concepts supported by Python. It takes functions as arguments and also has a nested function. They extend the functionality of the nested function. 

    Example:

    Python3

    def decorator_example(func):

        print("Decorator called")

        def inner_function():

                print("inner function")

                func()

        return inner_function

    @decorator_example

    def out_function():

        print("outer function")

    out_function()

    Output:

    Decorator called
    inner function
    outer function

    Error handling using decorators

    The following example shows how a general error handling code without use of any decorator looks like:

    Python3

    def mean(a,b):

        try:

            print((a+b)/2)

        except TypeError:

            print("wrong data types. enter numeric")

    def square(sq):

        try:

            print(sq*sq)

        except TypeError:

            print("wrong data types. enter numeric")

    def divide(l,b):

        try:

            print(b/l)

        except TypeError:

                    print("wrong data types. enter numeric")

    mean(4,5)

    square(21)

    divide(8,4)

    divide("two","one")

    Output :

    4.5
    441
    0.5
    wrong data types. enter numeric

    Even though there is nothing logically wrong with the above code but it lacks clarity. To make the code more clean and efficient decorators are used for error handling. The following example depicts how the above code can be more presentable and understandable by use of decorators:

    Python3

    def Error_Handler(func):

        def Inner_Function(*args, **kwargs):

            try:

                func(*args, **kwargs)

            except TypeError:

                print(f"{func.__name__} wrong data types. enter numeric")

        return Inner_Function

    @Error_Handler

    def Mean(a,b):

            print((a+b)/2)

    @Error_Handler

    def Square(sq):

            print(sq*sq)

    @Error_Handler

    def Divide(l,b):

            print(b/l)

    Mean(4,5)

    Square(14)

    Divide(8,4)

    Square("three")

    Divide("two","one")

    Mean("six","five")

    Output :

    4.5 

    196 

    0.5 

    Square wrong data types. enter numeric 

    Divide wrong data types. enter numeric 

    Mean wrong data types. enter numeric 
     

    Понравилась статья? Поделить с друзьями:
  • Qrator http 431 поля заголовка запроса слишком велики как исправить
  • Qrator http 431 request header fields too large как исправить
  • Qr20de ошибка 0172
  • Qr code error correction level
  • Python стандартная ошибка регрессии