Python

Лучший способ укрепить знания и попрактиковаться в Python

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

5 задач на Python

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

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

1. Логирование через Python-декоратора

1. Реализуйте класс Calculator через следующие функции:

Sum(a,b), Multiply(a,b), Divide(a,b) и Subtract(a,b).

2. Импортируйте библиотеку логирования.

3. Декорируйте каждый метод класса Calculator пользовательским методом, который регистрирует значения a и b. Реализуйте пользовательский метод логгера.

4. Выполните calculator.Sum(a,b). Он должен выводить значения a и b. Например:

Входными значениями A и B являются ‘123’ и ‘234’, # если a =123 и b=234

Что проверяет эта задача?

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

2. Обход дерева (поиск по дереву) с помощью Python­­-рекурсии

1. Реализуйте класс: Node, который будет использоваться для представления дерева. Пример:

class Node(object):
    def __init__(self, name):
        self.name= name
        self.children = [] 
def add_child(self, obj):
        self.children.append(obj)

У каждого узла (Node) есть имя и потомки. Пример:

a = Node(‘A’)
a_goal = Node(‘Goal’)
a.add_child(a_goal)

2. Выведите все пути к дереву, которые приведут вас в узел под названием Goal.

3. Дерево может состоять из N уровней (1>N>100), а узел Goal может содержать потомков.

Например, для дерева ниже ваш код будет выводить следующие пути:

A->Goal

A->B->Goal

A->D->Goal

A->F->H->L->Goal

Все прочие пути не ведут в узел Goal.

Код пишите в формате, подходящем для модульного тестирования.

Что проверяет эта задача?

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

3. Сведение списка вложенных словарей к списку нескольких преобразованных словарей

1. Создайте объект со списком словарей.

2. Каждый элемент списка — это словарь, содержащий несколько ключей.

3. Каждый ключ словаря должен содержать значение. Оно может быть типа string или dictionary. Значение типа dictionary указывает на то, что это вложенный словарь.

4. Каждый словарь может содержать переменное количество ключей.

5. Пройдитесь по элементам и создайте единый словарь для хранения ключей на одном уровне. Например, если при прохождении цикла каждый элемент содержит словарь с двумя ключами (допустим, Name и Surname), а значения обоих ключей принадлежат к типу string, то просто верните коллекцию словарей (как при выполнении сведения).

6. Но если в словаре есть ключи Name, Surname и PlacesVisited, где PlacesVisited представляет собой список словарей, каждый элемент которого содержит два ключа (Name of place и Date when it was visited — место и дата посещения), то в качестве результата должны выводиться два списка. Первый список должен содержать коллекцию словарей с ключами Name и Surname. Во втором списке должны присутствовать ключи Name Of place, Date when it was visited и ParentId, где ParentId содержит ключ Name из первого словаря.

7. Возьмите значение ParentId в качестве значения первого ключа родительского словаря (например, для словаря выше в качестве ParentID выступает Name).

Для каждого вложенного словаря создайте новый словарь.

В итоге вложенный словарь должен быть представлен в виде нескольких сведенных словарей.

Пример:

sample_object = [
{'Name':'Farhad', 'Surname:'Malik', 'Blogs':{'BlogName:'Python1','Date1':'20180901'}},
{'Name':'Farhad2', 'Surname:'Malik2', 'Blogs':{'BlogName:'Python3','Date1':'20180101'}}
]
Результат:
dictionary_1 = [
{'Name':'Farhad', 'Surname:'Malik'}, 
{'Name':'Farhad2', 'Surname:'Malik2'}
]
dictionary_2 = [
{'ParentId':'Farhad', 'BlogName:'Python1','Date1':'20180901'},{'ParentId':'Farhad2','BlogName:'Python3','Date1':'20180101'}
]

Суть в том, чтобы элементы одного уровня оказались в одном словаре.

Что проверяет эта задача?

  • Ваше понимание словарей, массивов и множеств.
  • Процедуру проверки ключей и значений.
  • Способы передачи дополнительных параметров.
  • Тем же образом можно свести JSON-объект.

4. Многопроцессорность и обработка ошибок

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

Что проверяет эта задача?

  • Эта задача поможет вам понять, как выполнить код на нескольких процессах.
  • Вы поймете, как перехватывать исключения и правильно пользоваться логированием.

5. Модули и пакеты

  • Добавьте классы и реализованный выше код в пакет с несколькими модулями.
  • Разберитесь, как разместить и импортировать файлы.
  • Создайте основной класс, который будет всем руководить.
  • Напишите консольное приложение, которое выполнит модульное тестирование через командную строку и уведомит вас о прохождении/не прохождении теста.

Что проверяет эта задача?

  • Вы сможете детально разобраться в том, как работают модули и пакет.
  • У вас появится четкое понимание фундаментальных основ Python.

Заключение

В данной статье были представлены 5 задач на Python для углубления теоретических и практических знаний в языке.

Читайте также:


Перевод статьи Farhad Malik: 5 Python Exercises