-
Модуль числа
-
Вычисление
-
abs
-
fabs
-
Свое решение
-
Модуль комплексного числа
Очень часто возникает необходимость вычисления модуля числа в Python. Рассмотрим, что такое модуль числа, какие есть способы его вычисления. Так же отдельно коснемся комплексных чисел.
Модуль числа
Часто в программировании требуется вычислить абсолютное значение числа. Иначе говоря, отбросить знак.
При вычислении модуля возможны 3 ситуации:
- Когда число больше 0. Если взять его по модулю — не изменится.
- Модуль нуля так же равен нулю.
- У отрицательного числа отбрасываем знак. То есть умножаем его на -1.
Но это все справедливо только для действительных чисел. Чему же тогда будет равен модуль комплексных?
Комплексное число состоит из действительной составляющей и мнимой. Геометрически это можно представить как 2 ортогональные оси: действительную и мнимую. Отмечаем на координатных осях требуемую точку. Модулем будет длина отрезка, проведенного из начала координат в эту точку.
Исходя из теоремы Пифагора получаем, что модуль комплексного числа это корень квадратный из суммы квадратов мнимой и действительной частей.
Вычисление
Вычислять модуль можно следующими способами:
- Используя стандартную функцию abs.
- С помощью функции fabs библиотеки math.
- При помощи самостоятельно написанной функции.
Все эти функции работают как в Python 2, так и в Python 3.
abs
Для вычисления в Python модуля числа используется функция abs. Результат функции того же типа, которого был аргумент.
a = -10 b = abs(a) print(b) print(type(b)) 10 <class 'int'>
fabs
Можно так же воспользоваться функцией fabs из библиотеки math. Библиотеку можно подключить с помощью from math import fabs
.
from math import fabs a = -10 b = fabs(a) print(b) print(type(b)) 10.0 <class 'float'>
Отличие abs от fabs заключается в том, что функция abs возвращает значение того же типа, что и аргумент. Функция же fabs вначале преобразует тип аргумента к вещественному числу.
Свое решение
Если по каким то причинам нет возможности или желания использовать стандартные функции, то можно написать свое решение.
Например, можно вычислить воспользоваться тернарным оператором.
a = -10 b = a if a > 0 else -a print(b) 10
На основе такого условия сделаем свою функцию.
def my_abs(a): return a if a > 0 else -a print(my_abs(-3)) 3
Модуль комплексного числа
Мы разобрались как происходит вычисление с действительными числами. Теперь посмотрим, как в языке программирования Python можно получить модуль комплексного.
Функцией fabs мы не сможем воспользоваться. Если попытаемся это сделать, то получим ошибку приведения комплексного числа к действительному (TypeError).
from math import fabs a = -10-2j b = fabs(a) print(b) Traceback (most recent call last): File "main.py", line 3, in <module> b = fabs(a) TypeError: can't convert complex to float
А вот с помощью abs преобразование удается.
a = -10-2j b = abs(a) print(b) 10.19803902718557
Или же напишем свою функцию:
from math import sqrt def my_abs_complex(c): return sqrt(c.real**2 + c.imag**2) a = -10-2j b = my_abs_complex(a) print(b) 10.198039027185569
Результаты получились одинаковыми. Но нам все равно пришлось подключить библиотеку math для вычисления квадратного корня.
Содержание:развернуть
- Что такое модуль числа
- Abs
- Fabs
- Основные свойства модулей
Запускаю китайскую реплику «ТАРДИС», и вот мы в пятом классе. На доске нарисована числовая ось, а на ней выделен отрезок. Его начало в точке 4, а конец — в 8. Учительница говорит, что длину отрезка можно найти путём вычитания координаты начала отрезка из координаты его конца. Вычитаем, получаем 4, и радуемся — мы нашли длину. Ура! 🎉
Перемещаемся на год вперёд, и там происходит странное: учительница выделяет мелом другой отрезок, но делает это в каком-то неправильном месте — левее точки с цифрой «0». Теперь перед нами старая задача, но с новыми числами и даже буквами: A, B, минус 4 и минус 8. Мы начинаем искать длину отрезка AB = [-4;-8]:
Переводим непонимающий взгляд с получившейся отрицательной длины на довольную улыбающуюся учительницу, а затем на доску. Там наверху, рядом с сегодняшней датой, написана тема урока: «Модуль числа».
Что такое модуль числа
Теперь по-взрослому.
Модуль числа называют абсолютной величиной.
Для вещественных чисел модуль определяется так:
Т.е. в любом случае, модуль — число большее или равное 0. Поэтому отрицательная длина в примере хитрой учительницы должна была быть взята по модулю:
Тогда дети бы увидели, что геометрический смысл модуля — есть расстояние. Это справедливо и для комплексных чисел, однако формальное определение для них отличается от вещественного:
, где z — комплексное число: z = x + iy.
В Python для нахождения модуля числа применяются две функции: fabs()
из подключаемой библиотеки math
и встроенная функция abs()
.
Abs
В то время как math.fabs()
может оперировать только вещественными аргументами, abs()
отлично справляется и с комплексными. Для начала покажем, что abs
в python работает строго в соответствии с математическим определением.
# для вещественных чисел
print(abs(-1))
print(abs(0))
print(abs(1))
> 1
> 0
> 1
Как видно, с вещественными числами всё в порядке. Перейдём к комплексным.
# для комплексных чисел
print(complex(-3, 4))
print(abs(complex(-3, 4)))
> (-3+4j)
> 5.0
Если вспомнить, что комплексное число выглядит так: z = x + iy, а его модуль вычисляется по формуле:
, то можно без труда посчитать, что sqrt(3**2 + 4**2)
действительно равно 5.0
.
Можно заметить, что abs()
возвращает значения разных типов. Это зависит от типа аргумента:
print(type(abs(1)))
> <class 'int'>
print(type(abs(1.0)))
> <class 'float'>
print(type(abs(complex(1.0, 1.0))))
<class 'float'>
В этом кроется ещё одно отличие abs()
от fabs()
. Функция из модуля math
всегда приводит аргумент к вещественному типу, а если это невозможно сделать — выбрасывает ошибку:
print(type(math.fabs(complex(2,3))))
> TypeError: can't convert complex to float
Fabs
Для начала работы с fabs()
необходимо импортировать модуль math
с помощью следующей инструкции:
import math
Мы уже выяснили, что fabs()
не работает с комплексными числами, поэтому проверим работу функции на вещественных:
print(math.fabs(-10))
print(math.fabs(0))
print(math.fabs(10))
> 10.0
> 0.0
> 10.0
Функция производит вычисления в соответствие с математическим определением, однако, в отличие от abs()
, всегда возвращает результат типа float
:
print(type(math.fabs(10)))
> <class 'float'>
Основные свойства модулей
# Квадрат модуля = квадрату числа
print(pow(4, 2) == pow(abs(4), 2))
> True
# |x| = |-x|
print(abs(-10) == abs(10))
> True
# Модуль произведения = произведению модулей: |ab|=|a||b|
print(math.fabs(11 * 3) == math.fabs(11) * math.fabs(3))
> True
# Аналогично для деления: |a/b|=|a|/|b|
print(math.fabs(48/8) == math.fabs(48) / math.fabs(8))
> True
# |a ** b| = |a| ** b
print(abs(2 ** 10) == abs(2) ** 10)
> True
И еще несколько важных неравенств:
- m <= |m|
- -|m| <= m
- |m| >= 0
- |m + n| <= |m| + |n|
- |m – n| <= |m| + |n|
- |m| — |n| <= |m + n|
- |m + n| >= ||m| — |n||
- |m – n| >= ||m| — |n||
Предыдущий урок: Итераторы Python
Что такое модуль?
Модуль — это файл, содержащий код python, который вы хотите включить в проект.
Документацию по модулям python на русском мы собрали в разделе Модули.
Создание модуля
Для того, чтобы создать модуль достаточно просто сохранить код в файл с расширением .py
:
Сохраним этот код в файл под названием mymodule.py
def greeting(name):
print("Привет, " + name)
Использование модуля
Теперь мы можем использовать только что созданный модуль, с помощью оператора import
:
Импортируем модуль под названием mymodule, и вызовем функцию приветствия:
import mymodule
mymodule.greeting("Андрей")
Вывод:
Привет, Андрей
Примечание: Во время использования функции из модуля, синтаксис: module_name.function_name
.
Переменные в модуле
Модуль может содержать функции, как уже описано, но также и переменные всех типов (массивы, словари, объекты и т. д.).
Сохраним этот код в файл mymodule.py
person1 = {
"name": "Виктор",
"age": 36,
"country": "Россия"
}
Импортируем модуль с названием mymodule, и получим доступ к словарю person1
:
import mymodule
a = mymodule.person1["age"]
print(a)
Вывод:
36
Имя модуля
Вы можете назвать файл модуля, как вам нравится, но важно, указать расширение файла .py
Переименование модуля
Вы можете создать псевдоним при импорте модуля, используя ключевое слово as
.
import mymodule as mx
a = mx.person1["age"]
print(a)
Вывод:
36
Встроенные модули
В Python есть несколько встроенных модулей, которые вы можете импортировать, когда захотите.
import platform
x = platform.system()
print(x)
Вывод:
Windows
Использование функции dir()
Существует встроенная функция для перечисления всех имен функций (или имен переменных) в модуле. Функция dir()
.
import platform
x = dir(platform)
print(x)
Вывод:
['DEV_NULL', '_UNIXCONFDIR', '_WIN32_CLIENT_RELEASES', '_WIN32_SERVER_RELEASES',
'__builtins__', '__cached__', '__copyright__', '__doc__', '__file__',
'__loader__', '__name__', '__package__', '__spec__', '__version__',
'_default_architecture', '_dist_try_harder', '_follow_symlinks',
'_ironpython26_sys_version_parser', '_ironpython_sys_version_parser',
'_java_getprop', '_libc_search', '_linux_distribution', '_lsb_release_version',
'_mac_ver_xml', '_node', '_norm_version', '_parse_release_file', '_platform',
'_platform_cache', '_pypy_sys_version_parser', '_release_filename',
'_release_version', '_supported_dists', '_sys_version', '_sys_version_cache',
'_sys_version_parser', '_syscmd_file', '_syscmd_uname', '_syscmd_ver',
'_uname_cache', '_ver_output', 'architecture', 'collections', 'dist',
'java_ver', 'libc_ver', 'linux_distribution', 'mac_ver', 'machine', 'node',
'os', 'platform', 'popen', 'processor', 'python_branch', 'python_build',
'python_compiler', 'python_implementation', 'python_revision', 'python_version',
'python_version_tuple', 're', 'release', 'subprocess', 'sys', 'system',
'system_alias', 'uname', 'uname_result', 'version', 'warnings', 'win32_ver']
Примечание: Функцию dir()
можно использовать на всех модулях, включая те, которые вы создаете сами.
Импорт из модуля
Вы можете импортировать модуль только частично, используя ключевое слово from
def greeting(name):
print("Привет, " + name)
person1 = {
"name": "Виктор",
"age": 36,
"country": "Россия"
}
Импортируем из модуля словарь person1
:
from mymodule import person1
print (person1["age"])
Вывод:
36
Примечание: При импорте с использованием ключевого слова from
не используйте имя модуля при обращении к элементам. Пример: person1["age"]
, а не mymodule.person1["age"]
Далее: Даты в Python
Модулем python может быть любой программный файл python, который содержит код, включая функции, класс или переменные python. Другими словами, мы можем сказать, что файл кода Python, сохраненный с расширением(.py), рассматривается как модуль. У нас может быть исполняемый код внутри модуля python.
Модули в Python отличаются маневренностью в логической организации кода. Чтобы использовать функциональность одного модуля в другом, мы должны импортировать конкретный модуль.
Создадим модуль с именем file.py, который содержит функцию func, которая содержит код для вывода некоторого сообщения на консоль.
Пример:
#displayMsg prints a message to the name being passed. def displayMsg(name) print("Hi "+name);
Необходимо включить этот модуль в наш основной модуль, чтобы вызвать метод displayMsg(), определенный в модуле с именем file.
Нам нужно загрузить модуль в код Python, чтобы использовать его функции. Python предоставляет два типа операторов:
- Оператор импорта
- Оператор from-import
Оператор импорта
Оператор импорта используется для импорта всех функций одного модуля в другой. Здесь мы должны заметить, что мы можем использовать функциональность любого исходного файла Python, импортировав этот файл в качестве модуля в другой исходный файл Python.
Мы можем импортировать несколько модулей с помощью одного оператора импорта, но модуль загружается один раз, независимо от того, сколько раз он был импортирован в наш файл.
Синтаксис для использования оператора импорта приведен ниже.
import module1,module2,........ module n
Следовательно, если нам нужно вызвать функцию displayMsg(), определенную в файле file.py, мы должны импортировать этот файл как модуль в наш модуль, как показано в примере ниже.
Пример:
import file; name = input("Enter the name?") file.displayMsg(name)
Выход:
Enter the name?John Hi John
Оператор from-import
Вместо того, чтобы импортировать весь модуль, в python имеется возможность импортировать только определенные атрибутов модуля. Это можно сделать с помощью from-import оператора. Синтаксис для использования оператора from-import приведен ниже.
from <module-name> import <name 1>, <name 2>..,<name n>
Рассмотрим следующий модуль, называемый calculation, который содержит три функции: суммирование, умножение и деление.
calculation.py:
#place the code in the calculation.py def summation(a,b): return a+b def multiplication(a,b): return a*b; def divide(a,b): return a/b;
Main.py:
from calculation import summation #it will import only the summation() from calculation.py a = int(input("Enter the first number")) b = int(input("Enter the second number")) print("Sum = ",summation(a,b)) #we do not need to specify the module name while accessing summation()
Выход:
Enter the first number10 Enter the second number20 Sum = 30
Оператор from … import всегда лучше использовать, если мы заранее знаем атрибуты, которые нужно импортировать из модуля. Это не позволяет нашему коду быть тяжелее. Мы также можем импортировать все атрибуты из модуля, используя *.
Рассмотрим следующий синтаксис.
from <module> import *
Переименование модуля
Python предоставляет нам возможность импорта некоторого модуля с определенным именем, чтобы мы могли использовать его имя для этого модуля в нашем исходном файле python.
Синтаксис для переименования модуля приведен ниже.
import <module-name> as <specific-name>
Пример:
#the module calculation of previous example is imported in this example as cal. import calculation as cal; a = int(input("Enter a?")); b = int(input("Enter b?")); print("Sum = ",cal.summation(a,b))
Выход:
Enter a?10 Enter b?20 Sum = 30
Использование функции dir()
Функция dir() возвращает отсортированный список имен, определенных в переданном модуле. Этот список содержит все подмодули, переменные и функции, определенные в этом модуле.
Рассмотрим следующий пример.
import json List = dir(json) print(List)
Выход:
['JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_default_decoder', '_default_encoder', 'decoder', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']
Функция reload()
Как мы уже говорили, модуль загружается один раз независимо от того, сколько раз он был импортирован в исходный файл python. Однако, если вы хотите перезагрузить уже импортированный модуль, чтобы повторно выполнить код верхнего уровня, python предоставляет нам функцию reload(). Синтаксис использования функции reload() приведен ниже.
reload(<module-name>)
Например, чтобы перезагрузить вычисление модуля, определенное в предыдущем примере, мы должны использовать следующую строку кода.
reload(calculation)
Объем переменных
В Python переменные связаны с двумя типами областей видимости. Все переменные, определенные в модуле, содержат глобальную область видимости до тех пор, пока она не определена в функции.
Все переменные, определенные внутри функции, содержат локальную область видимости, которая ограничена самой этой функцией. Мы не можем получить глобальный доступ к локальной переменной.
Если две переменные определены с одним и тем же именем с двумя разными областями действия, т. е. локальной и глобальной, то приоритет всегда будет отдаваться локальной переменной.
Рассмотрим следующий пример.
name = "john" def print_name(name): print("Hi",name) #prints the name that is local to this function only. name = input("Enter the name?") print_name(name)
Выход:
Hi David
Пакеты Python
Пакеты в python облегчают разработчикам среду разработки приложений, предоставляя иерархическую структуру каталогов, в которой пакет содержит подпакеты, модули и подмодули. Пакеты используются для эффективной категоризации кода уровня приложения.
Создадим пакет с именем «Сотрудники» в вашем домашнем каталоге пошагово.
1. Создайте каталог с именем Сотрудники / home.
2. Создайте исходный файл python с именем ITEmployees.py / home / Employees.
ITEmployees.py
def getITNames(): List = ["John", "David", "Nick", "Martin"] return List;
3. Аналогичным образом создайте еще один файл python с именем BPOEmployees.py и функцию getBPONames().
4. Теперь каталог «Сотрудники», который мы создали на первом шаге, содержит два модуля Python. Чтобы сделать этот каталог пакетом, нам нужно включить сюда еще один файл, то есть __init__.py, который содержит операторы импорта модулей, определенных в этом каталоге.
__init__.py
from ITEmployees import getITNames from BPOEmployees import getBPONames
5. Теперь каталог «Сотрудники» стал пакетом, содержащим два модуля Python. Здесь мы должны заметить, что мы должны создать __init__.py внутри каталога, чтобы преобразовать этот каталог в пакет.
6. Чтобы использовать модули, определенные внутри пакета Employees, мы должны импортировать их в наш исходный файл python. Давайте создадим простой исходный файл Python в нашем домашнем каталоге(/ home), который использует модули, определенные в этом пакете.
Test.py
import Employees print(Employees.getNames())
Выход:
['John', 'David', 'Nick', 'Martin']
Внутри пакетов могут быть подпакеты. Мы можем вкладывать пакеты до любого уровня в зависимости от требований приложения.
На следующем изображении показана структура каталогов системы управления библиотекой приложений, которая содержит три подпакета: Admin, Librarian и Student. Подпакеты содержат модули Python.
Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.
Введение
Модули в Python – это файлы с расширением “.py”, написанные коды на языке Python. На любой файл написанный в Python можно ссылаться как на модуль.
Несколько модулей доступны после установки языка Python. Некоторые модули приходится устанавливать вручную.
Установку модулей вручную мы рассматривали в нашем руководстве про Импорт модулей в Python 3.
С помощью этого руководство вы поймёте как:
- Написать модуль;
- Доступ к модулям из других директорий;
- Использование переменной среды;
- Модуль в переменной среде Python 3.
Подготовка к работе
У вас должен быть настроен дистрибутив под управлением Debian/Ubuntu/CentOS, настройка пользователя с правами sudo. Настроенная виртуальная среда языка Python. Рекомендуем заранее подготовиться перед преступлением к работе.
Написание и импортирование модулей
Первым делом стоит проверить версию Python с помощью:
python3 --version
На текущий момент актуальная версия 3.10.6. Если у вас старая версия, то обновите индекс пакетов и пакетов программного обеспечения с помощью:
sudo apt update && apt upgrade -y
Запустим виртуальную среду и с помощью текстового редактора Vim создадим новый файл с названием testingFile.py и добавим следующие строчки кода в самом начале указав шебанг. Шебанг – с помощью #! указываем путь к интерпретатору Python, подробнее рассмотрено в нашей инструкции.
#!/usr/bin/env python
# Определение функции
def test():
print(“This is test file”)
Если запустим с помощью:
python3 testingFile.py
То получим пустой результат. Необходимо создать второй файл и назовём test2.py и откроем с помощью vim и импортируем testingFile.py в файл test2.py и вызовем функцию test.
vim test2.py
#!/usr/bin/env python3
#Импорт файла
import testingFile
#Вызов функции из файла testingFile
testingFile.test()
Получим следующий результат, как на рисунке 1.
Мы импортируем модуль без использования “from testingFile import test”, нам необходимо вызывать функцию с помощью использованием названия модуля. Использование from … import можно рассмотреть в нашей инструкции.
Рассмотрим использование переменных в нашем модуле, добавим строчку в самом низу:
#!/usr/bin/env python3
# Определение функции
def test():
print("This is test file")
#Присвоение значения переменной
name = "serverspace"
Далее в файле test2.py в конце добавим строку изменив наш код в следующий вид:
#!/usr/bin/env python3
#Импорт файла
import testingFile
#Вызов функции из файла testingFile
testingFile.test()
#Вызов функции печати с использованием переменной
print(testingFile.name)
Результат приведён на рисунке 2.
Когда рассмотрели вызов функции печати и переменной, рассмотрим создание класса и добавим в класс несколько атрибутов использовав следующие команды.
#!/usr/bin/env python3
# Определение функции
def test():
print("This is test file")
#Присвоение значения переменной
name = "serverspace"
#Определение класса
class TestingClass:
def __init__ (self, name, age):
self.name = name
self.age = age
def tell_me_about_TestingClass(self):
print("this class is " + self.name + ".")
print(self.name + " is the testing's name")
Теперь с помощью файла test2.py вызовем функцию инициализации и информацию о классе:
#!/usr/bin/env python3
#Импорт модуля
import testingFile
#Вызов функции
testingFile.test()
#Вывод информации из другого модуля
print(testingFile.name)
#Вызов функций из класса
server = testingFile.TestingClass("testingserver", "30 y.o.")
server.tell_me_about_TestingClass()
Результат приведён на рисунке 3.
Для начала создаём переменную с названием “server”, вызываем класс из модуля testingFile.py, присваиваем значения для переменной name “testingserver” и значение “30 y.o.” для переменной age.
Важно иметь ввиду, что модуль является определением, но в то же время можно реализовывать код. Рассмотрим новый пример модуля в файле test3.py
#!/usr/bin/env python3
def TestHello():
print(“Testing Hello, World!”)
#Вызов функции в модуле
TestHello()
Импортируем модуль в файл test4.py и проверим вызов функции TestHello:
#!/usr/bin/env python3
import test3
Получим результат в соответствии с рисунком 4.
Причина простая, внутри файла test3.py, создаём функцию с названием TestHello и внутри него реализуем функцию печати текста. Затем вызываем созданную функцию и импортируем в файл test4.py. Таким образом с помощью запуска test4.py вызываем функцию печать текста из функции TestHello.
Доступ к модулям из других директорий
Иногда некоторые модули полезны не только для одного проекта, но и для других проектов. По этой причине не обязательно хранить модуль в одной директории проекта. Можно создать для общего использования и ссылаться на эту директорию использовав несколько методов.
Использование переменной среды
Если модуль находится вне проекта, используем модуль sys и с его помощи укажем путь к среде, где находится файл с нужным модулем. Например, находясь в домашней директории создав файл test5.py, мы не сможем импортировать файл test3.py, который находится в директории с виртуальной средой. Рассмотрим, как указывать путь к файлу test3.py:
import sys
sys.path.append(‘/root/testing/’)
import test3
И получим успешный результат, как показано на рисунке 5.
Успешный результат можем получить при указании правильного пути к файлу test3.
Модуль в переменной среде Python 3
Данный метод считается эффективным решением, модуль получает доступность для всей среды и системы. Проверим какой путь проверяет Python с помощью команд
python3
import sys
print(sys.path)
Получим в результате пути проверки интерпретатора Python, как показано на рисунке 6.
Выбираем нужный путь и скопируем файл test3.py в нужный путь.
cp testing/test3.py /usr/lib/python3.10
python3 test5.py
В файле test5.py удалим импортирование модуля sys. Запустим код:
cat test5.py # чтобы удостовериться, что строка с импортированием sys удалён либо закомментирован
python3 test5.py
Получим результат как на рисунке 7.
Копирование модуля в общий путь проверки интерпретатора Python оказалось наиболее эффективным. Причина в том, чтобы каждый раз не импортировать модуль sys в файлах кодов и указывать путь к нужному модулю, стоит скопировать нужный модуль в общий путь. Не стоит забывать о резервной копии нужных модулей, никто не исключает удаление нестандартных модулей после обновления пакетов Python.
Выводы
В данной инструкции мы рассмотрели такие возможности как:
- Создание модуля;
- Импортирование созданного модуля;
- Ссылаться на модуль с помощью импортирования модуля sys из находясь в другой директории;
- Добавление созданного модуля в общий путь интерпретатора Python;
- Получили информацию об общих путях при поиске модуля с помощью командного интерпретатора Python.