Решение задачи на обработку массива
Скачать 56.92 Kb.
|
АВТОНОМНАЯ НЕКОММЕРЧЕСКАЯ ПРОФЕССИОНАЛЬНАЯ ОБРАЗОВАТЕЛЬНАЯ ОРГАНИЗАЦИЯ БАШКИРСКИЙ КООПЕРАТИВНЫЙ ТЕХНИКУМ Курсовая работа на тему: «Решение задачи на обработку массива |”Заполнение и вывод массива”» Выполнил: Кутлучурин С.В студен гр.СИС-1120 Научный руководитель: Залия Рамиловна Шагибалова Дата представления_____________ Дата защиты____________ Оценка___________ Уфа 2021 1.1Что такое массив в Python? 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 1.1Что такое массив в Python? Массив в Python – это набор элементов, которые хранятся в непрерывных ячейках памяти, это идея хранения нескольких элементов одного типа вместе, упрощает вычисление позиции каждого элемента, просто добавляя смещение к базовому значению. Это контейнер, который может содержать фиксированное количество элементов, и эти элементы должны быть одного типа. Комбинация массивов может сэкономить много времени за счет уменьшения общего размера кода. Используется для хранения нескольких значений в одной переменной. Например, у вас есть список элементов, которые хранятся в соответствующих переменных, например: автомобиль1 = “Ламборджини” автомобиль2 = “Бугатти” автомобиль3 = “Тойота” Если вы хотите перебрать автомобили и найти конкретный, вы можете использовать массив. Массив может обрабатываться в Python с помощью модуля с именем array. Это полезно, когда нам нужно манипулировать только определенными значениями данных. Ниже приведены термины для понимания концепции массива: Элемент – каждая составляющая, хранящаяся в массиве, называется элементом. Индекс – расположение элемента в массиве имеет числовой индекс, который используется для определения положения элемента. 1.2Представление массива Массив можно объявлять по-разному и на разных языках. Следует учитывать следующие важные моменты: Индекс начинается с 0. Мы можем получить доступ к каждому элементу через его индекс. Длина массива определяет емкость для хранения элементов. Операции с массивами Некоторые из основных операций, поддерживаемых массивом, следующие: Траверс – он печатает все элементы один за другим. Вставка – добавляет элемент по заданному индексу. Удаление – удаляет элемент по данному индексу. Поиск – поиск элемента по заданному индексу или по значению. Обновление – обновляет элемент по заданному индексу. Массив можно создать в Python, импортировав модуль массива в программу. from array import * arrayName = array(typecode, [initializers]) Доступ к элементам массива Мы можем получить доступ к элементам массива, используя соответствующие индексы этих элементов. import array as arr a = arr.array('i', [2, 4, 6, 8]) print("First element:", a[0]) print("Second element:", a[1]) print("Second last element:", a[-1]) Выход: First element: 2 Second element: 4 Second last element: 8 Объяснение: В приведенном выше примере мы импортировали массив, определили переменную с именем «a», которая содержит элементы массива, и распечатали элементы, обращаясь к элементам через индексы массива. Как изменить или добавить элементы Массивы изменяемы, и их элементы можно изменять аналогично спискам. import array as arr numbers = arr.array('i', [1, 2, 3, 5, 7, 10]) # changing first element numbers[0] = 0 print(numbers) # Output: array('i', [0, 2, 3, 5, 7, 10]) # changing 3rd to 5th element numbers[2:5] = arr.array('i', [4, 6, 8]) print(numbers) # Output: array('i', [0, 2, 4, 6, 8, 10]) Выход: array('i', [0, 2, 3, 5, 7, 10]) array('i' ,[0, 2, 4, 6, 8, 10]) Объяснение: В приведенном выше примере мы импортировали массив и определили переменную с именем «numbers», которая содержит значение массива. Если мы захотим изменить или добавить элементы в массив, мы можем сделать это, определив конкретный индекс массива, в котором хотим изменить или добавить элементы. 1.3Зачем использовать массивы в Python? Комбинация массивов экономит много времени. Массив может уменьшить общий размер кода. Как удалить элементы? Элементы могут быть удалены из массива с помощью оператора Python del. Если мы хотим удалить какое-либо значение из массива, сделаем это, используя индексы определенного элемента. import array as arr number = arr.array('i', [1, 2, 3, 3, 4]) del number[2] # removing third element print(number) # Output: array('i', [1, 2, 3, 4]) Выход: array('i', [10, 20, 40, 60]) Объяснение: В приведенном выше примере мы импортировали массив и определили переменную с именем «number», в которой хранятся значения массива. Здесь, используя оператор del, мы удаляем третий элемент [3] данного массива. 1.4Нахождение длины массива Длина массива определяется как количество элементов, присутствующих в массиве. Возвращает целочисленное значение, равное общему количеству элементов, присутствующих в этом массиве. Синтаксис len(array_name) Объединение массивов Мы можем легко объединить любые два массива, используя символ +. Пример a=arr.array('d',[1.1 , 2.1 ,3.1,2.6,7.8]) b=arr.array('d',[3.7,8.6]) c=arr.array('d') c=a+b print("Array c = ",c) Выход: Array c= array('d', [1.1, 2.1, 3.1, 2.6, 7.8, 3.7, 8.6]) Объяснение В приведенном выше примере мы определили переменные с именами «a, b, c», которые содержат значения массива. Пример import array as arr x = arr.array('i', [4, 7, 19, 22]) print("First element:", x[0]) print("Second element:", x[1]) print("Second last element:", x[-1]) Выход: First element: 4 Second element: 7 Second last element: 22 Объяснение: Мы импортировали массив и определили переменную с именем «x», которая содержит значение массива, а затем напечатали элементы, используя индексы. Магический метод в Python определяется как специальный метод, который добавляет классу «магию». Он начинается и заканчивается двойным подчеркиванием, например _init_ или _str_. Встроенные классы определяют множество магических методов. Функцию dir() можно использовать для просмотра количества магических методов, унаследованных классом. Имеют два префикса и суффикс подчеркивания в имени метода. __init__ Метод _init_ вызывается после создания экземпляра класса, но до его возврата вызывающей стороне. Он вызывается без какого-либо вызова, когда экземпляр класса создается как конструктор в других языках программирования, таких как C ++, Java, C #, PHP и т. д. Также известен как инициализация и вызываются после _new_. Здесь вы должны инициализировать переменные экземпляра. __str__ Эта функция вычисляет “неформальное” или хорошо печатаемое строковое представление объекта и должна возвращать строковый объект. __repr__ Этот метод вызывается встроенной функцией repr() для вычисления «официального» строкового представления объекта и возвращает машиночитаемое представление типа. Цель _repr_ – быть недвусмысленной. __len__ Эта функция должна возвращать длину объекта. __call__ Мы можем сделать объект вызываемым, добавив магический метод _call_. Если он присутствует в классе, то этот класс может быть вызван. Экземпляр вызывается как функция, передавая ему любые позиционные аргументы. __del__ Так же, как _init_, который является методом конструктора, _del_ похож на деструктор. Если вы открыли файл в _init _, _del_ может его закрыть. __bytes__ Он предлагает вычислить представление объекта в виде байтовой строки и должен возвращать строковый объект. __ge__ Этот метод вызывается при использовании оператора> = и возвращает True или False. __neg__ Функция вызывается для унарного оператора. __ipow__ Эта функция для экспонент с аргументами. например, a ** = b. __le__ Эта функция нужна при сравнении с использованием оператора <=. _nonzero_ Эта функция возвращает логическое значение объекта. Вызывается при вызове функции bool (self). Еще для изучения: Глубокое и поверхностное копирование объектов в Python Массивы в Python - основы работы 1.5Парсинг в Python – это метод извлечения большого количества данных с нескольких веб-сайтов. Термин «парсинг» относится к получению информации из другого источника (веб-страницы) и сохранению ее в локальном файле. Например: предположим, что вы работаете над проектом под названием «Веб-сайт сравнения телефонов», где вам требуются цены на мобильные телефоны, рейтинги и названия моделей для сравнения различных мобильных телефонов. Если вы собираете эти данные вручную, проверяя различные сайты, это займет много времени. В этом случае важную роль играет парсинг веб-страниц, когда, написав несколько строк кода, вы можете получить желаемые результаты. Web Scrapping извлекает данные с веб-сайтов в неструктурированном формате. Это помогает собрать эти неструктурированные данные и преобразовать их в структурированную форму. Законен ли веб-скрапинг? Здесь возникает вопрос, является ли веб-скрапинг законным или нет. Ответ в том, что некоторые сайты разрешают это при легальном использовании. Веб-парсинг – это просто инструмент, который вы можете использовать правильно или неправильно. Непубличные данные доступны не всем; если вы попытаетесь извлечь такие данные, это будет нарушением закона. Есть несколько инструментов для парсинга данных с веб-сайтов, например: Scrapping-bot Scrapper API Octoparse Import.io Webhose.io Dexi.io Outwit Diffbot Content Grabber Mozenda Web Scrapper Chrome Extension Почему и зачем использовать веб-парсинг? Необработанные данные можно использовать в различных областях. Давайте посмотрим на использование веб-скрапинга: Динамический мониторинг цен Широко используется для сбора данных с нескольких интернет-магазинов, сравнения цен на товары и принятия выгодных ценовых решений. Мониторинг цен с использованием данных, переданных через Интернет, дает компаниям возможность узнать о состоянии рынка и способствует динамическому ценообразованию. Это гарантирует компаниям, что они всегда превосходят других. Исследования рынка Web Scrapping идеально подходит для анализа рыночных тенденций. Это понимание конкретного рынка. Крупной организации требуется большой объем данных, и сбор данных обеспечивает данные с гарантированным уровнем надежности и точности. Сбор электронной почты Многие компании используют личные данные электронной почты для электронного маркетинга. Они могут ориентироваться на конкретную аудиторию для своего маркетинга. Новости и мониторинг контента Один новостной цикл может создать выдающийся эффект или создать реальную угрозу для вашего бизнеса. Если ваша компания зависит от анализа новостей организации, он часто появляется в новостях. Таким образом, парсинг веб-страниц обеспечивает оптимальное решение для мониторинга и анализа наиболее важных историй. Новостные статьи и платформа социальных сетей могут напрямую влиять на фондовый рынок. Тренды в социальных сетях Web Scrapping играет важную роль в извлечении данных с веб-сайтов социальных сетей, таких как Twitter, Facebook и Instagram, для поиска актуальных тем. Исследования и разработки Большой набор данных, таких как общая информация, статистика и температура, удаляется с веб-сайтов, который анализируется и используется для проведения опросов или исследований и разработок. Зачем использовать именно Python? Есть и другие популярные языки программирования, но почему мы предпочитаем Python другим языкам программирования для парсинга веб-страниц? Ниже мы описываем список функций Python, которые делают его наиболее полезным языком программирования для сбора данных с веб-страниц. 1.7Динамичность В Python нам не нужно определять типы данных для переменных; мы можем напрямую использовать переменную там, где это требуется. Это экономит время и ускоряет выполнение задачи. Python определяет свои классы для определения типа данных переменной. Обширная коллекция библиотек Python поставляется с обширным набором библиотек, таких как NumPy, Matplotlib, Pandas, Scipy и т. д., которые обеспечивают гибкость для работы с различными целями. Он подходит почти для каждой развивающейся области, а также для извлечения данных и выполнения манипуляций. Меньше кода Целью парсинга веб-страниц является экономия времени. Но что, если вы потратите больше времени на написание кода? Вот почему мы используем Python, поскольку он может выполнять задачу в нескольких строках кода. Сообщество с открытым исходным кодом Python имеет открытый исходный код, что означает, что он доступен всем бесплатно. У него одно из крупнейших сообществ в мире, где вы можете обратиться за помощью, если застряли где-нибудь в коде Python. Основы веб-парсинга Веб-скраппинг состоит из двух частей: веб-сканера и веб-скребка. Проще говоря, веб-сканер – это лошадь, а скребок – колесница. Сканер ведет парсера и извлекает запрошенные данные. Давайте разберемся с этими двумя компонентами веб-парсинга: Сканер Поискового робота обычно называют «пауком». Это технология искусственного интеллекта, которая просматривает Интернет, индексирует и ищет контент по заданным ссылкам. Он ищет соответствующую информацию, запрошенную программистом. Веб-скрапер – это специальный инструмент, предназначенный для быстрого и эффективного извлечения данных с нескольких веб-сайтов. Веб-скраперы сильно различаются по дизайну и сложности в зависимости от проекта. Как работает Web Scrapping? Давайте разберем по шагам, как работает парсинг веб-страниц. Шаг 1. Найдите URL, который вам нужен. Во-первых, вы должны понимать требования к данным в соответствии с вашим проектом. Веб-страница или веб-сайт содержит большой объем информации. Вот почему отбрасывайте только актуальную информацию. Проще говоря, разработчик должен быть знаком с требованиями к данным. Шаг – 2: Проверка страницы Данные извлекаются в необработанном формате HTML, который необходимо тщательно анализировать и отсеивать мешающие необработанные данные. В некоторых случаях данные могут быть простыми, такими как имя и адрес, или такими же сложными, как многомерные данные о погоде и данные фондового рынка. Шаг – 3: Напишите код Напишите код для извлечения информации, предоставления соответствующей информации и запуска кода. Шаг – 4: Сохраните данные в файле Сохраните эту информацию в необходимом формате файла csv, xml, JSON. Начало работы с Web Scrapping Давайте разберемся с необходимой библиотекой для Python. Библиотека, используемая для разметки веб-страниц. Selenium-Selenium – это библиотека автоматического тестирования с открытым исходным кодом. Она используется для проверки активности браузера. Чтобы установить эту библиотеку, введите в терминале следующую команду. pip install selenium Примечание. Рекомендуется использовать IDE PyCharm. Pandas – библиотека для обработки и анализа данных. Используется для извлечения данных и сохранения их в желаемом формате. BeautifulSoup BeautifulSoup – это библиотека Python, которая используется для извлечения данных из файлов HTML и XML. Она в основном предназначена для парсинга веб-страниц. Работает с анализатором, обеспечивая естественный способ навигации, поиска и изменения дерева синтаксического анализа. Последняя версия BeautifulSoup – 4.8.1. Давайте подробно разберемся с библиотекой BeautifulSoup. Установка BeautifulSoup Вы можете установить BeautifulSoup, введя следующую команду: pip install bs4 Установка парсера BeautifulSoup поддерживает парсер HTML и несколько сторонних парсеров Python. Вы можете установить любой из них в зависимости от ваших предпочтений. Список парсеров BeautifulSoup: Парсер Типичное использование Python’s html.parser BeautifulSoup (разметка, “html.parser”) lxml’s HTML parser BeautifulSoup (разметка, «lxml») lxml’s XML parser BeautifulSoup (разметка, «lxml-xml») Html5lib BeautifulSoup (разметка, “html5lib”) Мы рекомендуем вам установить парсер html5lib, потому что он больше подходит для более новой версии Python, либо вы можете установить парсер lxml. Введите в терминале следующую команду: pip install html5lib BeautifulSoup используется для преобразования сложного HTML-документа в сложное дерево объектов Python. Но есть несколько основных типов объектов, которые чаще всего используются: Ярлык Объект Tag соответствует исходному документу XML или HTML. soup = bs4.BeautifulSoup("Extremely bold) tag = soup.b type(tag) Выход: Тег содержит множество атрибутов и методов, но наиболее важными особенностями тега являются имя и атрибут. Имя У каждого тега есть имя, доступное как .name: tag.name Атрибуты Тег может иметь любое количество атрибутов. Тег имеет атрибут “id”, значение которого – “boldest”. Мы можем получить доступ к атрибутам тега, рассматривая тег как словарь. tag[id] Мы можем добавлять, удалять и изменять атрибуты тега. Это можно сделать, используя тег как словарь. # add the element tag['id'] = 'verybold' tag['another-attribute'] = 1 tag # delete the tag del tag['id'] Многозначные атрибуты В HTML5 есть некоторые атрибуты, которые могут иметь несколько значений. Класс (состоит более чем из одного css) – это наиболее распространенный многозначный атрибут. Другие атрибуты: rel, rev, accept-charset, headers и accesskey. class_is_multi= { '*' : 'class'} xml_soup = BeautifulSoup(' ', 'xml', multi_valued_attributes=class_is_multi) xml_soup.p['class'] # [u'body', u'strikeout'] 1.8Навигационная строка Строка в BeautifulSoup ссылается на текст внутри тега. BeautifulSoup использует класс NavigableString для хранения этих фрагментов текста. tag.string # u'Extremely bold' type(tag.string) # Неизменяемая строка означает, что ее нельзя редактировать. Но ее можно заменить другой строкой с помощью replace_with(). tag.string.replace_with("No longer bold") tag В некоторых случаях, если вы хотите использовать NavigableString вне BeautifulSoup, unicode() помогает ему превратиться в обычную строку Python Unicode. BeautifulSoup объект Объект BeautifulSoup представляет весь проанализированный документ в целом. Во многих случаях мы можем использовать его как объект Tag. Это означает, что он поддерживает большинство методов, описанных для навигации по дереву и поиска в дереве. doc=BeautifulSoup(" doc.find(text="INSERT FOOTER HERE").replace_with(footer) print(doc) Выход: ?xml version="1.0" encoding="utf-8"?> # Пример парсера Давайте разберем пример, чтобы понять, что такое парсер на практике, извлекая данные с веб-страницы и проверяя всю страницу. Для начала откройте свою любимую страницу в Википедии и проверьте всю страницу, перед извлечением данных с веб-страницы вы должны убедиться в своих требованиях. Рассмотрим следующий код: #importing the BeautifulSoup Library importbs4 import requests #Creating the requests res = requests.get("https://en.wikipedia.org/wiki/Machine_learning") print("The object type:",type(res)) # Convert the request object to the Beautiful Soup Object soup = bs4.BeautifulSoup(res.text,'html5lib') print("The object type:",type(soup) Выход: The object type Convert the object into: В следующих строках кода мы извлекаем все заголовки веб-страницы по имени класса. Здесь знания внешнего интерфейса играют важную роль при проверке веб-страницы. soup.select('.mw-headline') for i in soup.select('.mw-headline'): print(i.text,end = ',') Выход: Overview,Machine learning tasks,History and relationships to other fields,Relation to data mining,Relation to optimization,Relation to statistics, Theory,Approaches,Types of learning algorithms,Supervised learning,Unsupervised learning,Reinforcement learning,Self-learning,Feature learning,Sparse dictionary learning,Anomaly detection,Association rules,Models,Artificial neural networks,Decision trees,Support vector machines,Regression analysis,Bayesian networks,Genetic algorithms,Training models,Federated learning,Applications,Limitations,Bias,Model assessments,Ethics,Software,Free and open-source software,Proprietary software with free and open-source editions,Proprietary software,Journals,Conferences,See also,References,Further reading,External links, В приведенном выше коде мы импортировали bs4 и запросили библиотеку. В третьей строке мы создали объект res для отправки запроса на веб-страницу. Как видите, мы извлекли весь заголовок с веб-страницы. Веб-страница Wikipedia Learning Давайте разберемся с другим примером: мы сделаем GET-запрос к URL-адресу и создадим объект дерева синтаксического анализа (soup) с использованием BeautifulSoup и встроенного в Python парсера “html5lib”. Здесь мы удалим веб-страницу по указанной ссылке (https://www.javatpoint.com/). Рассмотрим следующий код: following code: # importing the libraries from bs4 import BeautifulSoup import requests url="https://www.javatpoint.com/" # Make a GET request to fetch the raw HTML content html_content = requests.get(url).text # Parse the html content soup = BeautifulSoup(html_content, "html5lib") print(soup.prettify()) # print the parsed data of html Приведенный выше код отобразит весь html-код домашней страницы javatpoint. Используя объект BeautifulSoup, то есть soup, мы можем собрать необходимую таблицу данных. Напечатаем интересующую нас информацию с помощью объекта soup: Напечатаем заголовок веб-страницы. print(soup.title) Выход даст следующий результат: В приведенных выше выходных данных тег HTML включен в заголовок. Если вам нужен текст без тега, вы можете использовать следующий код: print(soup.title.text) Выход: это даст следующий результат: Tutorials List - Javatpoint Мы можем получить всю ссылку на странице вместе с ее атрибутами, такими как href, title и ее внутренний текст. Рассмотрим следующий код: for link in soup.find_all("a"): print("Inner Text is: {}".format(link.text)) print("Title is: {}".format(link.get("title"))) print("href is: {}".format(link.get("href"))) Вывод: он напечатает все ссылки вместе со своими атрибутами. Здесь мы отображаем некоторые из них: href is: https://www.facebook.com/javatpoint Inner Text is: The title is: None href is: https://twitter.com/pagejavatpoint Inner Text is: The title is: None href is: https://www.youtube.com/channel/UCUnYvQVCrJoFWZhKK3O2xLg Inner Text is: The title is: None href is: https://javatpoint.blogspot.com Inner Text is: Learn Java Title is: None href is: https://www.javatpoint.com/java-tutorial Inner Text is: Learn Data Structures Title is: None href is: https://www.javatpoint.com/data-structure-tutorial Inner Text is: Learn C Programming Title is: None href is: https://www.javatpoint.com/c-programming-language-tutorial Inner Text is: Learn C++ Tutorial 1.9Программа: извлечение данных с веб-сайта Flipkart В этом примере мы удалим цены, рейтинги и название модели мобильных телефонов из Flipkart, одного из популярных веб-сайтов электронной коммерции. Ниже приведены предварительные условия для выполнения этой задачи: Python 2.x или Python 3.x с установленными библиотеками Selenium, BeautifulSoup, Pandas. Google – браузер Chrome. Веб-парсеры, такие как html.parser, xlml и т. д. Шаг – 1: найдите нужный URL. Первым шагом является поиск URL-адреса, который вы хотите удалить. Здесь мы извлекаем детали мобильного телефона из Flipkart. URL-адрес этой страницы: https://www.flipkart.com/search?q=iphones&otracker=search&otracker1=search&marketplace=FLIPKART&as-show=on&as=off. Шаг 2: проверка страницы. Необходимо внимательно изучить страницу, поскольку данные обычно содержатся в тегах. Итак, нам нужно провести осмотр, чтобы выбрать нужный тег. Чтобы проверить страницу, щелкните элемент правой кнопкой мыши и выберите «Проверить». Шаг – 3: найдите данные для извлечения. Извлеките цену, имя и рейтинг, которые содержатся в теге «div» соответственно. Шаг – 4: напишите код. from bs4 import BeautifulSoupas soup from urllib.request import urlopen as uReq # Request from the webpage myurl = "https://www.flipkart.com/search?q=iphones&otracker=search&otracker1=search&marketplace=FLIPKART&as-show=on&as=off" uClient = uReq(myurl) page_html = uClient.read() uClient.close() page_soup = soup(page_html, features="html.parser") # print(soup.prettify(containers[0])) # This variable held all html of webpage containers = page_soup.find_all("div",{"class": "_3O0U0u"}) # container = containers[0] # # print(soup.prettify(container)) # # price = container.find_all("div",{"class": "col col-5-12 _2o7WAb"}) # print(price[0].text) # # ratings = container.find_all("div",{"class": "niH0FQ"}) # print(ratings[0].text) # # # # # print(len(containers)) # print(container.div.img["alt"]) # Creating CSV File that will store all data filename = "product1.csv" f = open(filename,"w") headers = "Product_Name,Pricing,Ratings\n" f.write(headers) for container in containers: product_name = container.div.img["alt"] price_container = container.find_all("div", {"class": "col col-5-12 _2o7WAb"}) price = price_container[0].text.strip() rating_container = container.find_all("div",{"class":"niH0FQ"}) ratings = rating_container[0].text # print("product_name:"+product_name) # print("price:"+price) # print("ratings:"+ str(ratings)) edit_price = ''.join(price.split(',')) sym_rupee = edit_price.split("?") add_rs_price = "Rs"+sym_rupee[1] split_price = add_rs_price.split("E") final_price = split_price[0] split_rating = str(ratings).split(" ") final_rating = split_rating[0] print(product_name.replace(",", "|")+","+final_price+","+final_rating+"\n") f.write(product_name.replace(",", "|")+","+final_price+","+final_rating+"\n") f.close() Выход: Мы удалили детали iPhone и сохранили их в файле CSV, как вы можете видеть на выходе. В приведенном выше коде мы добавили комментарий к нескольким строкам кода для тестирования. Вы можете удалить эти комментарии и посмотреть результат. Еще для изучения: Объединение двух словарей в Python - 11 способов Как установить Tkinter в Python для Windows Перестановка и комбинация в Python - примеры Системный модуль Python ОСТАВИТЬ КОММЕНТАРИЙ ПРИМЕРЫМодульное тестирование в Python – модуль sys В этом руководстве мы рассмотрим модульное тестирование в Python. Это сама по себе емкая тема, но мы рассмотрим несколько важных концепций. |