Импорт функций из Python библиотек и создание собственных модулей
Основные подходы к работе с функциями библиотек
В Python функции, реализующие полезные алгоритмы, часто объединяются в библиотеки (модули). Для использования такой функции требуется импортировать модуль или отдельные его части. Рассмотрим различные способы импорта и примеры их применения.
Импорт всего модуля и вызов функций через точку
Самый распространённый способ - импортировать модуль целиком с помощью ключевого слова import. После этого каждая функция вызывается как имя_модуля.имя_функции(). Такой подход сохраняет нейминг и избегает конфликтов имён с локальными переменными.
import math
import os
# Используем функцию sqrt из модуля math
result = math.sqrt(25)
print(result) # 5.0
# Функция getcwd из модуля os
current_dir = os.getcwd()
print(current_dir)Python библиотеки функции (функции библиотек python)
Типичные ошибки
- Забыли импортировать модуль - возникает
NameError. - Импортировали модуль с опечаткой -
ModuleNotFoundError. - Использовали имя модуля, совпадающее с именем переменной, что приводит к переопределению.
Как импортировать только нужные функции, чтобы не загружать всё?
Для этого применяется конструкция from модуль import функция. Функция становится доступной напрямую, без префикса модуля.
from math import sqrt, pi
from datetime import datetime
print(sqrt(144)) # 12.0
print(pi) # 3.141592653589793
print(datetime.now()) # текущие дата и времяВозможные проблемы
- Если функция с таким именем уже определена в текущей области видимости, она будет перезаписана.
- Импорт нескольких функций из большого модуля может ухудшить читаемость, если список слишком длинный.
Как сократить имя модуля для удобства?
Используется присвоение псевдонима через import модуль as псевдоним. Это особенно полезно для модулей с длинными именами или для избегания конфликтов.
import numpy as np
import pandas as pd
# Создаём массив с помощью numpy
arr = np.array([1, 2, 3])
print(arr)
# DataFrame из pandas
df = pd.DataFrame({'A': [1, 2]})
print(df)Распространённые недочёты
- Неудачный псевдоним, который потом сложно вспомнить (например,
import math as m- слишком коротко). - Использование общепринятого псевдонима (например,
npдля numpy) - предпочтительно.
Что произойдёт при импорте всех функций из модуля звёздочкой (from module import *)?
Этот способ загружает все публичные имена модуля в текущее пространство имён. Применять его стоит с осторожностью, так как можно случайно переопределить встроенные функции или переменные.
from math import *
print(sin(0)) # 0.0
print(cos(0)) # 1.0
# Теперь sin и cos доступны без префиксаОпасности
- Конфликт имён - если в модуле есть функция
sin, а в вашем коде ранее определена переменнаяsin, она будет перезаписана. - Снижение читаемости - непонятно, откуда взята функция.
- Не рекомендуется для больших модулей (например,
from numpy import *).
Выбор способа импорта зависит от конкретной задачи и стиля кода. Для большинства случаев достаточно импорта всего модуля (первый вариант) или импорта конкретных функций (второй).
Расширенные примеры работы с библиотечными функциями
1. Модуль collections: Counter и defaultdict
from collections import Counter, defaultdict
# Подсчёт частоты элементов
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(words)
print(counter) # Counter({'apple': 3, 'banana': 2, 'orange': 1})
# Словарь со значением по умолчанию
d = defaultdict(int)
d['key1'] += 1
print(d) # defaultdict(<class 'int'>, {'key1': 1})Counter({'apple': 3, 'banana': 2, 'orange': 1})
defaultdict(, {'key1': 1}) 2. Модуль functools: декоратор lru_cache для мемоизации
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # 55
print(fibonacci.cache_info()) # CacheInfo(hits=?, misses=?, ...)55 CacheInfo(hits=8, misses=11, maxsize=128, currsize=11)
3. Модуль itertools: цепочки, перестановки, комбинации
from itertools import chain, permutations, combinations
# Цепочка итераторов
list1 = [1, 2]
list2 = ['a', 'b']
chained = list(chain(list1, list2))
print(chained) # [1, 2, 'a', 'b']
# Перестановки
perms = list(permutations([1, 2, 3], 2))
print(perms) # [(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)]
# Сочетания
combs = list(combinations('ABC', 2))
print(combs) # [('A','B'),('A','C'),('B','C')][1, 2, 'a', 'b']
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
[('A', 'B'), ('A', 'C'), ('B', 'C')]4. Создание собственного модуля и его импорт
# В файле mytools.py:
def greet(name):
return f"Привет, {name}!"
def add(a, b):
return a + b
# В другом файле в той же папке:
import mytools
print(mytools.greet('Анна')) # Привет, Анна!
print(mytools.add(5, 3)) # 8Привет, Анна! 8
5. Импорт функции из вложенного пакета
# Структура: project/package/subpackage/module.py
# В module.py определена функция func
# Импорт из подпакета:
from package.subpackage.module import func
# Или через относительный импорт (внутри пакета)
# from .subpackage.module import func(Код импорта; выполнение зависит от структуры проекта)
6. Проверка наличия функции в модуле с помощью getattr
import math
function_name = 'sqrt'
if hasattr(math, function_name):
func = getattr(math, function_name)
result = func(81)
print(result) # 9.0
else:
print("Функция не найдена")9.0