lexhouk / goit-algo-hw-05 Goto Github PK
View Code? Open in Web Editor NEWМодуль 5. Функціональне програмування та вбудовані модулі Python
Home Page: https://www.edu.goit.global/uk/learn/21196455/19951493/19951593/homework
Модуль 5. Функціональне програмування та вбудовані модулі Python
Home Page: https://www.edu.goit.global/uk/learn/21196455/19951493/19951593/homework
Доробіть консольного бота помічника з попереднього домашнього завдання та додайте обробку помилок за допомоги декораторів.
input_error
. Цей декоратор відповідає за повернення користувачеві повідомлень типу "Enter user name"
, "Give me name and phone please"
тощо.input_error
повинен обробляти винятки, що виникають у функціях - handler
і це винятки: KeyError
, ValueError
, IndexError
. Коли відбувається виняток декоратор повинен повертати відповідну відповідь користувачеві. Виконання програми при цьому не припиняється.В якості прикладу додамо декоратор input_error
для обробки помилки ValueError
def input_error(func):
def inner(*args, **kwargs):
try:
return func(*args, **kwargs)
except ValueError:
return "Give me name and phone please."
return inner
Та обгорнемо декоратором функцію add_contact
нашого бота, щоб ми почали обробляти помилку ValueError
.
@input_error
def add_contact(args, contacts):
name, phone = args
contacts[name] = phone
return "Contact added."
Вам треба додати обробники до інших команд (функцій), та додати в декоратор обробку обробку винятків інших типів з відповідними повідомленнями.
input_error
, який обробляє помилки введення користувача для всіх команд.KeyError
, ValueError
, IndexError
у функціях за допомогою декоратора input_error
.input_error
, який обробляє відповідні помилки і повертає відповідні повідомлення про помилку.При запуску скрипту діалог з ботом повинен бути схожим на цей.
Enter a command: add
Enter the argument for the command
Enter a command: add Bob
Enter the argument for the command
Enter a command: add Jime 0501234356
Contact added.
Enter a command: phone
Enter the argument for the command
Enter a command: all
Jime: 0501234356
Enter a command:
Необхідно створити функцію generator_numbers
, яка буде аналізувати текст, ідентифікувати всі дійсні числа, що вважаються частинами доходів, і повертати їх як генератор. Дійсні числа у тексті записані без помилок, чітко відокремлені пробілами з обох боків. Також потрібно реалізувати функцію sum_profit
, яка буде використовувати generator_numbers
для підсумовування цих чисел і обчислення загального прибутку.
generator_numbers(text: str)
повинна приймати рядок як аргумент і повертати генератор, що ітерує по всіх дійсних числах у тексті. Дійсні числа у тексті вважаються записаними без помилок і чітко відокремлені пробілами з обох боків.sum_profit(text: str, func: Callable)
має використовувати генератор generator_numbers
для обчислення загальної суми чисел у вхідному рядку та приймати його як аргумент при виклику.yield
у функції generator_numbers
для створення генератора.sum_profit
коректно обробляє дані від generator_numbers
і підсумовує всі числа.generator_numbers
.sum_profit
.text = "Загальний дохід працівника складається з декількох частин: 1000.01 як основний дохід, доповнений додатковими надходженнями 27.45 і 324.00 доларів."
total_income = sum_profit(text, generator_numbers)
print(f"Загальний дохід: {total_income}")
Очікуване виведення:
Загальний дохід: 1351.46
Замикання в програмуванні - це функція, яка зберігає посилання на змінні зі свого лексичного контексту, тобто з області, де вона була оголошена.
Реалізуйте функцію caching_fibonacci
, яка створює та використовує кеш для зберігання і повторного використання вже обчислених значень чисел Фібоначчі.
Ряд Фібоначчі - це послідовність чисел виду: 0, 1, 1, 2, 3, 5, 8, ...
, де кожне наступне число послідовності виходить додаванням двох попередніх членів ряду.
У загальному вигляді для обчислення n
-го члена ряду Фібоначчі потрібно вирахувати вираз: 𝐹(𝑛)=𝐹(𝑛−1)+𝐹(𝑛−2).
Це завдання можна вирішити рекурсивно, викликаючи функцію, що обчислює числа послідовності доти, доки виклик не сягне членів ряду менше n = 1
, де послідовність задана.
caching_fibonacci()
повинна повертати внутрішню функцію fibonacci(n)
.fibonacci(n)
обчислює n-те число Фібоначчі. Якщо число вже знаходиться у кеші, функція має повертати значення з кешу.В якості рекомендації ми надамо псевдо код завдання.
☝ Псевдокод - це спосіб запису алгоритму або програмного коду, який використовується для опису ідеї або процесу у вигляді, зрозумілому для людей. Він не призначений для безпосереднього виконання на комп'ютері, але допомагає розробникам чітко зрозуміти та спланувати, як буде працювати програма чи алгоритм. Головна його мета - передати ідею алгоритму чітко та просто.
Ось псевдокод для функції caching_fibonacci
, яка обчислює числа Фібоначчі з використанням кешування:
ФУНКЦІЯ caching_fibonacci
Створити порожній словник cache
ФУНКЦІЯ fibonacci(n)
Якщо n <= 0, повернути 0
Якщо n == 1, повернути 1
Якщо n у cache, повернути cache[n]
cache[n] = fibonacci(n - 1) + fibonacci(n - 2)
Повернути cache[n]
Повернути функцію fibonacci
КІНЕЦЬ ФУНКЦІЇ caching_fibonacci
Функція caching_fibonacci
створює внутрішню функцію fibonacci
і словник cache
для зберігання результатів обчислення чисел Фібоначчі. Кожен раз, коли викликається fibonacci(n)
, спочатку перевіряється, чи вже збережено значення для n
у cache
. Якщо значення є у кеші, воно повертається негайно, що значно зменшує кількість рекурсивних викликів. Якщо значення відсутнє у кеші, воно обчислюється рекурсивно і зберігається у cache
. Функція caching_fibonacci
повертає внутрішню функцію fibonacci
, яка тепер може бути використана для обчислення чисел Фібоначчі з використанням кешування.
fibonacci(n)
з урахуванням використання кешу.# Отримуємо функцію fibonacci
fib = caching_fibonacci()
# Використовуємо функцію fibonacci для обчислення чисел Фібоначчі
print(fib(10)) # Виведе 55
print(fib(15)) # Виведе 610
У цьому прикладі, коли ви викликаєте fib(10)
або fib(15)
, функція fibonacci
всередині caching_fibonacci
обчислює відповідні числа Фібоначчі, зберігаючи попередні результати у кеші. Це робить повторні виклики для тих самих значень n значно швидшими, оскільки вони просто повертають значення з кешу. Замикання дозволяє fibonacci(n)
"пам'ятати" стан cache
між різними викликами, що є ключовим для кешування результатів обчислень
Розробіть Python-скрипт для аналізу файлів логів. Скрипт повинен вміти читати лог-файл, переданий як аргумент командного рядка, і виводити статистику за рівнями логування наприклад, INFO
, ERROR
, DEBUG
. Також користувач може вказати рівень логування як другий аргумент командного рядка, щоб отримати всі записи цього рівня.
Файли логів – це файли, що містять записи про події, які відбулися в операційній системі, програмному забезпеченні або інших системах. Вони допомагають відстежувати та аналізувати поведінку системи, виявляти та діагностувати проблеми.
Для виконання завдання візьміть наступний приклад лог-файлу:
2024-01-22 08:30:01 INFO User logged in successfully.
2024-01-22 08:45:23 DEBUG Attempting to connect to the database.
2024-01-22 09:00:45 ERROR Database connection failed.
2024-01-22 09:15:10 INFO Data export completed.
2024-01-22 10:30:55 WARNING Disk usage above 80%.
2024-01-22 11:05:00 DEBUG Starting data backup process.
2024-01-22 11:30:15 ERROR Backup process failed.
2024-01-22 12:00:00 INFO User logged out.
2024-01-22 12:45:05 DEBUG Checking system health.
2024-01-22 13:30:30 INFO Scheduled maintenance.
error
виведе всі записи рівня ERROR
з файлу логів.INFO
, ERROR
, DEBUG
, WARNING
).parse_log_line(line: str) -> dict
для парсингу рядків логу.load_logs(file_path: str) -> list
для завантаження логів з файлу.filter_logs_by_level(logs: list, level: str) -> list
для фільтрації логів за рівнем.count_logs_by_level(logs: list) -> dict
для підрахунку записів за рівнем логування.display_log_counts(counts: dict)
, яка форматує та виводить результати. Вона приймає результати виконання функції count_logs_by_level
.INFO
, ERROR
, DEBUG
, WARNING
і структуру повідомлень.parse_log_line(line: str) -> dict
, яка приймає рядок з логу як вхідний параметр і повертає словник з розібраними компонентами: дата, час, рівень, повідомлення. Використовуйте методи рядків, такі як split()
, для розділення рядка на частини.load_logs(file_path: str) -> list
, що відкриває файл, читає кожен рядок і застосовує на нього функцію parse_log_line
, зберігаючи результати в список.filter_logs_by_level(logs: list, level: str) -> list
. Вона дозволить вам отримати всі записи логу для певного рівня логування.count_logs_by_level(logs: list) -> dict
, яка проходить по всім записам і підраховує кількість записів для кожного рівня логування.display_log_counts(counts: dict)
, яка форматує та виводить результати підрахунку в читабельній формі.try
/except
для обробки виняткових ситуацій.filter
, тощо.При запуску скрипту
$ python [main.py](<http://main.py/>) /path/to/logfile.log
Ми повинні очікувати наступне виведення
Рівень логування | Кількість
-----------------|----------
INFO | 4
DEBUG | 3
ERROR | 2
WARNING | 1
Якщо користувач хоче переглянути всі записи певного рівня логування, він може запустити скрипт з додатковим аргументом, наприклад:
$ python main.py path/to/logfile.log error
Це виведе загальну статистику за рівнями, а також детальну інформацію для всіх записів з рівнем ERROR
.
Рівень логування | Кількість
-----------------|----------
INFO | 4
DEBUG | 3
ERROR | 2
WARNING | 1
Деталі логів для рівня 'ERROR':
2024-01-22 09:00:45 - Database connection failed.
2024-01-22 11:30:15 - Backup process failed.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.