Функции и модули в Python

PythonBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы познакомитесь с двумя фундаментальными концепциями программирования на Python: функциями и модулями. Функции позволяют структурировать код в виде переиспользуемых блоков, что делает программы модульными и более понятными. Модули дают возможность группировать связанные функции и переменные в отдельные файлы, упрощая повторное использование кода и поддержку проектов. Освоив эти инструменты, вы сможете писать более эффективный и организованный код.

Определение и использование функций

На этом этапе вы научитесь определять и вызывать функции в Python.

Запустите интерпретатор Python, введя следующую команду в терминале:

python

Вы увидите приглашение к вводу (>>>), которое означает, что вы находитесь в интерактивной оболочке Python.

Python Interpreter

Начнем с определения простой функции, которая приветствует пользователя. Введите в интерпретаторе следующий код:

def greet(name):
    return f"Hello, {name}!"

result = greet("Alice")
print(result)

Вы должны увидеть следующий результат:

Hello, Alice!

Функции определяются с помощью ключевого слова def, за которым следует имя функции и параметры в скобках. Тело функции выделяется отступом.
Эта функция принимает параметр name и возвращает строку приветствия. Затем мы вызываем функцию с аргументом "Alice" и выводим результат.
Оператор return используется для возврата значения из функции. Если return отсутствует, функция возвращает None.
Функции позволяют инкапсулировать логику для многократного использования и выполнения конкретных задач. Это основной строительный блок программ на Python.

Теперь создадим функцию для выполнения расчетов:

def calculate_area(length, width):
    return length * width

area = calculate_area(5, 3)
print(f"The area is: {area}")

Вы увидите следующий результат:

The area is: 15

Эта функция вычисляет площадь прямоугольника по заданным длине и ширине.

Функции также могут иметь значения параметров по умолчанию:

def power(base, exponent=2):
    return base ** exponent

print(power(3))
print(power(3, 3))

Вы увидите следующий результат:

9
27

В данном случае, если значение степени не указано, функция использует 2 в качестве значения по умолчанию.

Функции могут возвращать несколько значений, используя кортежи:

def min_max(numbers):
    return min(numbers), max(numbers)

minimum, maximum = min_max([1, 5, 3, 9, 2])
print(f"Minimum: {minimum}, Maximum: {maximum}")

Вы увидите следующий результат:

Minimum: 1, Maximum: 9

Эта функция возвращает одновременно минимальное и максимальное значения из списка чисел.

Помните, что в Python отступы имеют критическое значение. Тело функции всегда должно быть смещено вправо на одинаковое количество пробелов.

Понимание области видимости функций

На этом этапе вы узнаете об области видимости функций и о том, как ведут себя переменные внутри и снаружи функций.

Давайте изучим локальные и глобальные переменные в интерпретаторе Python:

x = 10  ## Global variable

def print_x():
    print(f"Global x: {x}")

print_x()

def change_x():
    x = 20  ## Local variable
    print(f"Local x: {x}")

change_x()
print(f"Global x after change_x(): {x}")

Вы увидите следующий результат:

Global x: 10
Local x: 20
Global x after change_x(): 10

Обратите внимание, что функция change_x() создает новую локальную переменную x, которая никак не влияет на глобальную переменную x.

Чтобы изменить глобальную переменную внутри функции, необходимо использовать ключевое слово global:

def modify_global_x():
    global x
    x = 30
    print(f"Modified global x: {x}")

modify_global_x()
print(f"Global x after modify_global_x(): {x}")

Вы увидите следующий результат:

Modified global x: 30
Global x after modify_global_x(): 30

Теперь глобальная переменная x была успешно изменена.

Функции также могут обращаться к переменным из внешней (охватывающей) области видимости:

def outer_function(x):
    def inner_function():
        print(f"x from outer function: {x}")
    inner_function()

outer_function(40)

Вы увидите следующий результат:

x from outer function: 40

Вложенная функция имеет доступ к параметру x внешней функции.

Понимание области видимости критически важно для написания чистого кода без багов. Это помогает избежать непреднамеренных побочных эффектов и делает работу функций предсказуемой.

Создание и использование модулей

На этом этапе вы научитесь создавать и использовать собственные модули Python.

Выйдите из интерпретатора Python, введя exit() или нажав Ctrl+D.

Откройте WebIDE в среде LabEx VM.

WebIDE LabEx VM interface

Создайте новый файл с именем math_operations.py в директории ~/project:

touch ~/project/math_operations.py

Откройте созданный файл в редакторе WebIDE и добавьте в него следующий код:

## math_operations.py

def add(a, b):
      return a + b

def subtract(a, b):
      return a - b

def multiply(a, b):
      return a * b

def divide(a, b):
      if b != 0:
         return a / b
      else:
         return "Error: Division by zero"

PI = 3.14159

Этот модуль содержит четыре базовые математические операции и константу PI.

Сохраните файл (в WebIDE включено автосохранение).

Теперь создайте еще один файл с именем use_math_module.py в той же директории:

touch ~/project/use_math_module.py

Откройте use_math_module.py в редакторе и добавьте следующий код:

## use_math_module.py

import math_operations

result_add = math_operations.add(5, 3)
result_subtract = math_operations.subtract(10, 4)
result_multiply = math_operations.multiply(2, 6)
result_divide = math_operations.divide(15, 3)

print(f"Addition: {result_add}")
print(f"Subtraction: {result_subtract}")
print(f"Multiplication: {result_multiply}")
print(f"Division: {result_divide}")
print(f"Value of PI: {math_operations.PI}")

Этот скрипт импортирует модуль math_operations и использует его функции и константу.

Сохраните файл и запустите его с помощью следующей команды в терминале:

python ~/project/use_math_module.py

Вы должны увидеть результат, похожий на этот:

Addition: 8
Subtraction: 6
Multiplication: 12
Division: 5.0
Value of PI: 3.14159

Создавая модули, вы можете распределять связанные функции и переменные по разным файлам, что делает код более удобным для поддержки и повторного использования.

Когда вы импортируете модуль, Python компилирует его в байт-код и сохраняет в директории __pycache__. Эта папка создается там же, где находится файл модуля, и содержит скомпилированные файлы байт-кода (.pyc или .pyo).

Вы можете игнорировать эту директорию, так как Python управляет компиляцией и кэшированием модулей автоматически.

Импорт конкретных функций из модулей

На этом этапе вы научитесь импортировать отдельные функции из модулей и использовать псевдонимы (alias) для сокращения кода.

Создайте новый файл advanced_math.py в директории ~/project:

touch ~/project/advanced_math.py

Откройте advanced_math.py в редакторе и добавьте следующий контент:

## advanced_math.py

import math

def square_root(x):
      return math.sqrt(x)

def power(base, exponent):
      return math.pow(base, exponent)

def sin(angle):
      return math.sin(math.radians(angle))

def cos(angle):
      return math.cos(math.radians(angle))

Этот модуль использует встроенный модуль Python math для реализации более сложных математических операций.

Теперь создайте файл use_advanced_math.py в той же директории:

touch ~/project/use_advanced_math.py

Откройте use_advanced_math.py в редакторе и добавьте следующий код:

## use_advanced_math.py

from advanced_math import square_root, power
from advanced_math import sin as sine, cos as cosine

x = 16
y = 2
angle = 30

print(f"Square root of {x}: {square_root(x)}")
print(f"{x} to the power of {y}: {power(x, y)}")
print(f"Sine of {angle} degrees: {sine(angle)}")
print(f"Cosine of {angle} degrees: {cosine(angle)}")

Этот скрипт импортирует только нужные функции из модуля advanced_math и назначает псевдонимы для sin и cos.

Сохраните файл и запустите его:

python ~/project/use_advanced_math.py

Вы увидите результат:

Square root of 16: 4.0
16 to the power of 2: 256.0
Sine of 30 degrees: 0.49999999999999994
Cosine of 30 degrees: 0.8660254037844387

Импорт конкретных функций и использование псевдонимов делают код более читаемым и помогают избежать конфликтов имен между разными модулями.

Создание пакета

На заключительном этапе вы научитесь создавать пакеты — это способ организации связанных модулей в иерархическую структуру директорий.

Создайте новую директорию geometry в папке ~/project:

mkdir ~/project/geometry

Внутри директории geometry создайте два файла: __init__.py и shapes.py:

touch ~/project/geometry/__init__.py
touch ~/project/geometry/shapes.py

Файл __init__.py необходим для того, чтобы Python воспринимал эту директорию как пакет. Он может быть пустым или содержать код инициализации пакета.

Откройте shapes.py в редакторе и добавьте следующий код:

## geometry/shapes.py

import math

def circle_area(radius):
      return math.pi * radius ** 2

def rectangle_area(length, width):
      return length * width

def triangle_area(base, height):
      return 0.5 * base * height

Теперь создайте файл use_geometry_package.py в корневой директории ~/project:

touch ~/project/use_geometry_package.py

Откройте use_geometry_package.py и добавьте следующий код:

## use_geometry_package.py

from geometry.shapes import circle_area, rectangle_area, triangle_area

radius = 5
length = 4
width = 6
base = 3
height = 8

print(f"Area of circle with radius {radius}: {circle_area(radius):.2f}")
print(f"Area of rectangle with length {length} and width {width}: {rectangle_area(length, width)}")
print(f"Area of triangle with base {base} and height {height}: {triangle_area(base, height)}")

Сохраните файл и запустите его:

python ~/project/use_geometry_package.py

Вы увидите результат:

Area of circle with radius 5: 78.54
Area of rectangle with length 4 and width 6: 24
Area of triangle with base 3 and height 8: 12.0

Создав пакет, вы организовали связанные модули в иерархию папок, что значительно упрощает управление функциональностью и импорт в крупных проектах.

Резюме

В этой лабораторной работе вы изучили две фундаментальные концепции программирования на Python: функции и модули. Вы научились определять и вызывать функции, разбираться в области видимости, создавать собственные модули, импортировать из них конкретные элементы и организовывать модули в пакеты.

Вы начали с создания простых функций и постепенно перешли к более сложным темам, таким как область видимости и глобальные переменные. Затем вы узнали, как использовать модули для разделения кода на логические части, что делает его пригодным для повторного использования.

Вы изучили различные способы импорта, включая выборочный импорт и использование псевдонимов. Эти знания позволяют писать лаконичный и понятный код, избегая конфликтов имен.

Наконец, вы научились создавать пакеты, что особенно полезно в больших проектах, где требуется структурировать множество связанных модулей.

Функции и модули — это ключ к написанию хорошо организованного и эффективного кода на Python. По мере вашего развития в программировании эти навыки станут незаменимыми для создания сложных систем и совместной работы над крупными проектами. Регулярно практикуйтесь и изучайте обширную экосистему готовых модулей и пакетов Python, чтобы расширить свои возможности.