Импорт функций из Python библиотек и создание собственных модулей

Раздел: 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

Функции библиотек Python - comments

En
Python библиотеки функции (python)