Эффективная обработка вводимых данных является ключевым фактором для создания удобной для пользователя программы. Управление вводом данных может существенно повлиять на удобство работы пользователя и общий успех программы.
Python предоставляет широкий спектр инструментов для эффективного управления вводом, от встроенной функции input() до более продвинутых модулей, таких как argparse, и регулярных выражений. Однако в этой статье мы сосредоточимся на основах работы с пользовательским вводом в Python. Мы познакомимся с функцией input() и рассмотрим лучшие практики ее эффективного использования. К концу этой статьи вы будете лучше понимать, как работать со вводом данных в ваших программах на Python. Итак, давайте начнем! Читать →
Пузырьковая сортировка – один из самых интуитивно понятных алгоритмов сортировки и идеальная отправная точка для всех, кто интересуется миром алгоритмов. Несмотря на свою простоту, пузырьковая сортировка дает наглядный пример фундаментальных концепций сортировки. В этой статье мы рассмотрим механику пузырьковой сортировки на примере реализации этого алгоритма на языке Python.
Что такое пузырьковая сортировка?
Пузырьковая сортировка – это алгоритм, основанный на сравнении, который сортирует список путем многократного прохода по списку, сравнения соседних элементов и их замены, если они расположены в неправильном порядке. Проход по списку повторяется до тех пор, пока список не будет отсортирован.
Название “пузырьковая сортировка” происходит от того, что мелкие элементы “всплывают” в верхнюю часть списка (начало массива), а крупные “опускаются” в нижнюю часть (конец массива).
Вот пошаговое объяснение того, как это работает:
Начните с первых двух элементов и сравните их.
Если первый элемент больше второго, то они меняются местами.
Перейдите к следующей паре элементов и повторите процесс.
Продолжайте менять местами элементы до тех пор, пока самый большой элемент не окажется в нужном месте в конце списка.
Уменьшите диапазон элементов на единицу (так как самый большой теперь отсортирован) и повторите процесс для оставшихся элементов.
Реализация пузырьковой сортировки на Python
Рассмотрим код на языке Python, выполняющий пузырьковую сортировку:
def bubblesort(arr):
n = len(arr)
# Traverse through all array elements
for i in range(n):
# Last i elements are already in place, so the inner loop can skip them
for j in range(n - i - 1):
# Traverse the array from 0 to n-i-1 and swap if the element found is greater than the next element
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
Как работает этот код?
Определим функцию bubblesort, которая принимает массив arr в качестве аргумента.
Сохраняем длину массива в переменной n, потому что нам нужно знать, когда остановить процесс сортировки.
Мы используем вложенный цикл, где внешний цикл представляет собой количество проходов, необходимых для сортировки массива, а внутренний проходит по сравниваемым элементам.
Во внутреннем цикле мы выполняем сравнение: if arr[j] > arr[j+1]:. Таким образом мы проверяем, больше ли текущий элемент, чем следующий элемент.
Если текущий элемент больше, то мы меняем местами два элемента, используя распаковку кортежа: arr[j], arr[j+1] = arr[j+1], arr[j].
После каждого прохода наибольший элемент текущего подсписка “всплывает” на свое место, и на следующей итерации его можно не учитывать, чего мы и добиваемся, уменьшая диапазон внутреннего цикла.
Процесс продолжается до тех пор, пока массив не будет отсортирован.
Возвращаем отсортированный массив.
Заключение
Пузырьковая сортировка, хотя и не является самым эффективным алгоритмом для больших наборов данных из-за своей сложности O(n²), является отличным образовательным инструментом для понимания фундаментальных концепций сортировки. Благодаря своей простоте он идеально подходит для небольших списков и для учебных целей.
В нашей реализации на языке Python мы увидели, как можно использовать вложенные циклы для применения логики алгоритма и как простые замены могут привести к полностью отсортированному списку. Я надеюсь, что этот обзор пузырьковой сортировки поможет вам понять не только принцип ее работы, но и принципы, лежащие в основе многих других алгоритмов сортировки.
Привет, друзья! В сегодняшней статье мы рассмотрим 4 способа превращения кода в золото. То есть вкратце разберем, как заработать на знании Python.
1. Создание контента
Первый метод – это создание контента. Вы можете завести блог на Medium, WordPress или любой другой платформе. Это может стать вашим побочным или даже постоянным заработком. Просто предоставляйте качественный контент, и деньги придут.
Если не любите писать, можете создать канал на YouTube. Но помните, что контент – это король, а качественный контент привлекает больше людей.
2. Веб-разработка
Заработать на веб-разработке на Python – это самый быстрый способ получения дохода с помощью этого языка, так как спрос на услуги веб-разработчиков стабильно высокий. Вы можете создавать сайты и продавать их компаниям или частным лицам или предоставлять услуги по веб-разработке на таких фриланс-платформах, как Upwork, Fiverr и т.д.
3. Веб-скрапинг
На языке Python очень легко выполнять веб-скрапинг и это самый простой способ начать зарабатывать на нем как фрилансер. Вы можете изучить такие библиотеки, как beautifulsoup и requests, и начать зарабатывать деньги в Интернете.
Веб-скрапинг на Python выглядит следующим образом:
Да, вы можете стать аналитиком данных на Python, если вы хорошо владеете этим языком и любите работать с данными. Вы можете анализировать данные на Python для предприятий и частных лиц, помогая им принимать решения на основе данных. А можете и работать как фрилансер – в области анализа данных есть много возможностей.
В языке Python “self” обозначает сам объект класса. С его помощью можно получить доступ к атрибутам и методам класса.
Например, класс Fruit при создании присваивает себе пользовательские имя и цвет (name и color). Затем к ним можно будет получить доступ с помощью метода info():
class Fruit:
def __init__(self, name, color):
self.name = name
self.color = color
def info(self):
print(self.color, self.name)
banana = Fruit("Banana", "Yellow")
banana.info()
# Вывод:
# Yellow Banana
Чтобы понять, как это работает, давайте подробнее разберемся с “self” в Python. Это руководство предназначено для тех, кто уже знаком с классами, но кому понятие “self” кажется несколько туманным.
Ключевое слово “self” в Python
В Python класс – это схема для создания объектов.
Каждый объект Python является представителем некоторого класса. В Python объект также называется экземпляром класса. Если вы хотите создать объект в Python, у вас должен быть класс, на основе которого вы можете его создать.
Типичный класс Python состоит из методов, которые выполняют действия на основе атрибутов, присвоенных объекту.
Например, класс Weight может хранить килограммы и иметь возможность конвертировать их в фунты.
В классе Python параметр self ссылается на сам экземпляр класса. Это полезно, поскольку в противном случае не было бы возможности получить доступ к атрибутам и методам класса.
Пример: класс Fruit
Чтобы лучше понять роль “self” в классе, давайте рассмотрим простой класс Fruit. Он позволяет создавать объекты Fruit с пользовательскими именем и цветом (name и color):
class Fruit:
def __init__(self, name, color):
self.name = name
self.color = color
def info(self):
print(self.color, self.name)
Теперь вы можете создавать объекты Fruit. Делается это так:
banana = Fruit("Banana", "Yellow")
apple = Fruit("Apple", "Red")
И вы можете вывести информацию, связанную с ними:
banana.info()
apple.info()
Вывод:
Yellow Banana
Red Apple
Как работает “self” в этом примере?
Рассмотрим, как работает класс Fruit.
При создании нового объекта Fruit под капотом вызывается метод __init__. Он отвечает за создание объектов. Этот метод принимает три аргумента:
self
name
color
При создании объекта Fruit метод __init__ вызывается с пользовательскими именем и цветом. Обратите внимание, что вам не нужно передавать self в качестве аргумента. Python делает это автоматически.
Таким образом, при вызове banana = Fruit("Banana", "Red"):
Метод __init__ начинает инициализацию объекта Banana с заданными аргументами name и color.
Он создает новые атрибуты self.name и self.color и сохраняет в них введенные данные name и color.
После этого можно получить доступ к атрибутам Banananame и color в любом месте объекта через self.name и self.color.
Посмотрим также, что произойдет при вызове banana.info().
Когда вы вызываете banana.info(), Python автоматически передает self в вызов метода в качестве аргумента. После этого метод info() может использовать self для доступа к атрибутам объекта name и color. Без self он не смог бы этого сделать.
В Python “self” может содержать что угодно
Ранее вы видели, как параметр self может использоваться для хранения атрибутов объектов.
Точнее, вы увидели типичный подход, когда вы передаете __init__ аргументы метода и присваиваете их self с помощью того же имени:
def __init__(self, name, color):
self.name = name
self.color = color
В связи с этим может возникнуть вопрос: “Должны ли имена аргументов совпадать с теми, что присваиваются self?”. Ответ – нет.
Подобно тому, как в Python можно создать любую переменную в любом месте, через self вы можете присвоить объекту любые атрибуты.
Это означает, что вы можете хранить в self любые значения с любыми именами. Их даже не обязательно передавать в качестве аргументов в метод __init__.
Пример: класс Point
Например, создадим класс Point, представляющий точку в трехмерном пространстве. Давайте инициализируем объекты Point в начале координат, не запрашивая координаты в качестве аргументов при инициализации.
Для этого необходимо присвоить x, y и z значения 0 для self в методе __init__:
Теперь можно создавать объекты Point, привязанные к началу координат:
p = Point()
print(p.x, p.y, p.z)
# Вывод:
# 0 0 0
Этим мы хотим продемонстрировать, как можно свободно добавлять любые атрибуты к свойству объекта self.
Может ли метод не иметь аргумента “self”?
В Python метод нуждается в аргументе self. В противном случае он не знает, к какому классу принадлежит, и не может выполнять над ним действия.
Чтобы посмотреть, что произойдет, если метод не будет принимать аргумент self , давайте пропустим его в методе info() :
class Fruit:
def __init__(self, name, color):
self.name = name
self.color = color
def info():
print(self.color, self.name)
banana = Fruit("Banana", "Yellow")
banana.info()
Вывод:
Traceback (most recent call last):
File "main.py", line 10, in <module>
banana.info()
TypeError: info() takes 0 positional arguments but 1 was given
Последняя строка говорит о том, что метод info() не принимает аргументов, а мы передали один. Но, судя по приведенному выше коду, мы не передавали никаких аргументов. Так почему же интерпретатор думает, что мы это сделали?
Даже если вы не передаете методу info() никаких аргументов, Python автоматически пытается внедрить self в вызов. Это происходит потому, что Python знает, что для корректной работы все методы класса должны иметь ссылку на сам класс. Но в нашей реализации info() нет аргумента self. Поэтому передача в нее аргумента self за кулисами не удастся.
Это показывает, что в методах необходимо использовать аргумент self.
Доказательство того, что “self” относится к самому объекту
Для наглядности докажем, что self действительно относится к самому объекту.
Для этого проверим расположение в памяти self и объекта Fruit.
В языке Python адрес объекта в памяти можно проверить с помощью функции id(). Класс Fruit упрощен для облегчения восприятия.
class Fruit:
def __init__(self):
print("Self address =", id(self))
fruit = Fruit()
print("Object address =", id(fruit))
Как видно, адреса памяти одинаковы. Это говорит о том, что self внутри класса Fruit указывает на тот же адрес, что и объект fruit, который вы только что создали. Другими словами, параметр self действительно ссылается на сам объект.
Ключевое слово “self” не является зарезервированным в Python
Обратите внимание, что self не является зарезервированным ключевым словом в Python. Вместо него можно использовать любое имя, лишь бы оно было.
Например, изменим реализацию класса Fruit из предыдущих разделов. На этот раз вместо имени self будем использовать this:
class Fruit:
def __init__(this, name, color):
this.name = name
this.color = color
def info(this):
print(this.color, this.name)
banana = Fruit("Banana", "Yellow")
apple = Fruit("Apple", "Red")
Этот код работает точно так же, как и тот, в котором используется self.
Но поскольку Python-разработчики чаще всего используют self, не рекомендуется использовать другие слова. При работе с классами в Python вы вряд ли столкнетесь с чем-то еще, кроме self.
Заключение
Сегодня вы узнали, что “self” делает в классе Python.
Напомним, что self в Python обозначает сам объект. Благодаря ему класс знает, как получить доступ к своим собственным атрибутам и методам.
При создании объекта вызывается метод __init__. В этом методе обычно присваиваются атрибуты экземпляру класса через self.
Обратите внимание, что “self” не является зарезервированным ключевым словом. Вместо него можно использовать любое другое слово, если передавать его в качестве первого аргумента для каждого метода класса. Однако “self” настолько часто используется, что не следует использовать что-либо другое, даже если это возможно.
Спасибо, что прочитали. Надеюсь, вы нашли то, что искали. Удачного кодинга!
Частой ошибкой, которую вы можете получить при установке модулей Python, является ошибка ‘No such file or directory‘. Эти слова могут ввести в заблуждение, потому что обычно все файлы и каталоги из пакета, который вы пытаетесь установить находятся на своих местах. На самом деле, ошибка возникает из-за того, что Python пытается вызвать системный компилятор во время установки модуля, в то время как пути к нему закодированы в самом Python и он не находит нужные ему файлы. В этой статье будет приведен пример контекста получения ошибки и шаги по ее устранению на разных платформах.
Ошибки отсутствия компилятора
Пакеты Python обычно устанавливаются с помощью менеджера пакетов pip командой pip install. pip выведет список зависимостей, дополнительно требуемых выбранным вами пакетом, и длинный список результатов процесса установки. Иногда программа установки завершается с ошибкой, содержащей в конце вывода текст, подобный следующему:
Output
x86_64-linux-gnu-gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.10 -I/usr/local/lib/python3.10/dist-packages/numpy/core/include -I/usr/include/python3.10 -c radiomics/src/_cmatrices.c -o build/temp.linux-x86_64-3.10/radiomics/src/_cmatrices.o
error: command 'x86_64-linux-gnu-gcc' failed: No such file or directory
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: legacy-install-failure
× Encountered error while trying to install package.
╰─> pyradiomics
note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.
Конкретно эта ошибка возникла в результате попытки установить pd-dwi с помощью pip install pd-dwi. Это библиотека Python, используемая в исследованиях химиотерапии.
Некоторые библиотеки Python, особенно те, которые используются для научных вычислений, после установки требуют компиляции дополнительного кода локально на вашей машине. Python – это интерпретируемый язык высокого уровня, который может работать только с интерпретатором Python. Языки низкого уровня, такие как C или Rust, которые иногда включаются в библиотеки Python для высокопроизводительной обработки, должны быть скомпилированы и оптимизированы, прежде чем стать исполняемыми. Если в вашей системе нет компилятора, установка завершится неудачно.
На большинстве современных платформ, когда вы устанавливаете менеджер пакетов Python, pip, он также устанавливает среду компилятора и соответствующие пакеты. Однако есть несколько причин, по которым этого может не произойти. Например, возможно, что компилятор был случайно удален или вообще не был установлен. И в отличие от Linux, на Mac или Windows пакеты Python обычно не устанавливаются системным менеджером пакетов, что может стать причиной возникновения проблем.
Следующие шаги этого руководства содержат инструкции по установке и проверке совместимого с Python компилятора на Ubuntu/Debian Linux, Red Hat/Rocky Linux, Windows и macOS.
Пакеты компиляторов для Ubuntu и Debian
На Ubuntu вы можете установить пакет build-essential, который предоставит все пакеты, необходимые для современной, хорошо поддерживаемой среды компилятора. build-essential – это так называемый мета-пакет. Он не относится к какому-то одному пакету, а скорее привлекает ряд общих инструментов компилятора в качестве зависимостей.
Вы также можете установить libpython3-dev. Это пакет экосистемы Ubuntu/Debian, который по сути “подключает” компилятор к Python и предоставляет всю необходимую конфигурацию бэкенда для автоматического вызова компилятора из Python или из pip. Обычно он устанавливается автоматически вместе с pip, но если вы устанавливаете pip без использования менеджера пакетов, он может отсутствовать.
Установите пакеты с помощью apt:
$ sudo apt install build-essential libpython3-dev
Это также приведет к установке ряда зависимостей. После этого вы можете убедиться в наличии компилятора, проверив существование команды make в вашей системе. Для этого используйте команду which:
$ which make
Output
/usr/bin/make
make – это команда, которую gcc, самый популярный компилятор с открытым исходным кодом, использует для разбора Makefile, то есть инструкции по компиляции, которые предоставляются в каждом пакете. Теперь, если make существует, попробуйте снова установить ваш модуль Python с помощью pip.
Пакеты компиляторов для Red Hat и Rocky Linux
В Red Hat и Rocky Linux вы можете использовать функцию groups менеджера пакетов dnf для установки пакетов, которые включают хорошо поддерживаемую среду компилятора. Группа пакетов, которую вы установите, называется “Development Tools”.
Для установки группы пакетов используйте две команды dnf:
$ sudo dnf groups mark install "Development Tools"
$ sudo dnf groupinstall "Development Tools"
Это также приведет к установке ряда зависимостей. Далее вы можете установить python3-devel, пакет экосистемы Red Hat, который по сути “подключает” компилятор к Python. python3-devel предоставляет всю необходимую конфигурацию бэкенда для автоматического вызова компилятора из Python или из pip:
$ sudo dnf install python3-devel
После этого вы можете убедиться, что компилятор доступен, проверив наличие команды make в вашей системе. Для этого используйте команду which:
$ which make
Output
/usr/bin/make
Если теперь make существует, попробуйте снова установить ваш модуль Python с помощью pip.
Среды компиляторов Windows
Проблемы с компилятором в Windows могут быть сложнее, поскольку существует множество различных способов установки Python, и каждый из них предполагает наличие различных компиляторов:
Если вы используете Python с WSL2, это то же самое, что запустить Python под Linux, поэтому вы можете следовать инструкциям по устранению неполадок для вашего дистрибутива (Ubuntu по умолчанию).
Если вы используете Python с Anaconda, то она предоставит свои собственные пакеты компилятора в среде conda, что обычно позволяет избежать подобных ошибок.
Если вы используете Python в Windows, есть несколько других решений. По умолчанию Python на Windows пытается использовать Microsoft Visual Studio Build Tools. Это очень большая установка, добавляющая множество пакетов экосистемы Windows, которые могут быть вам незнакомы, если вы в основном работаете в облаке, но они должны работать автоматически после установки, как make в Linux.
Если у вас уже есть рабочая версия gcc с открытым исходным кодом и инструменты сборки make, установленные в вашей среде Windows с помощью MinGW или Chocolatey, вы можете указать Python использовать этот компилятор, создав файл в Lib/distutils/distutils.cfg относительно пути установки Python и добавив следующее содержимое:
Если у вас возникли проблемы с установкой компилятора в Windows, вы можете попробовать установить предварительно скомпилированный пакет wheel для устанавливаемой библиотеки, хотя это менее удобно, чем установка из pip. Кроме того, они обычно доступны только на разовой основе.
Среды компиляторов macOS
macOS включает инструментарий компилятора в пакете разработки Apple, XCode. Как и Visual Studio в Windows, XCode представляет собой полноценную среду разработки со своим собственным интерфейсом, но для компиляции пакетов Python вам не потребуется использовать сам XCode. Вместо этого вам нужно только убедиться, что пакеты XCode установлены. Это можно сделать, выполнив команду xcode-select -install:
$ xcode-select –install
Вам будет предложено начать установку, а затем принять лицензию на программное обеспечение. После этого инструменты будут загружены и установлены автоматически.
Заключение
Экосистема Python очень мощная, она приветлива как для начинающих, так и для опытных разработчиков, но столкновение с пробелами в ее инструментарии может сбить с толку. В этом руководстве вы узнали, как исправить ошибки, которые могут возникнуть в результате отсутствия пакетов компилятора, а также когда Python необходимо скомпилировать низкоуровневый код во время установки модуля.