Создание программного обеспечения с помощью языка Python

Раздел: Основы Python -> Основы разработки

Основные подходы к построению программ на Python

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

Как организовать код программы с ясной точкой входа и функциями?

Наиболее эффективное решение для скриптов средней сложности - использовать конструкцию if __name__ == "__main__" и выносить логику в отдельные функции. Такой подход позволяет импортировать код как модуль без выполнения основного блока.

# example_program.py
def main():
    """Главная функция программы."""
    name = input("Введите ваше имя: ")
    greeting = generate_greeting(name)
    print(greeting)

def generate_greeting(name):
    """Возвращает приветствие."""
    return f"Привет, {name}! Добро пожаловать в мир Python."

if __name__ == "__main__":
    main()

создание программ на языке python (создание программ на python)

Пошаговое объяснение: Функция main() собирает основную логику. Функция generate_greeting() легко тестируется отдельно. Блок if __name__ == "__main__" гарантирует, что код выполняется только при запуске файла напрямую.

Как написать самую простую программу?

Минимальный вариант - однострочный скрипт.

print("Hello, World!")

Такой подход годится для экспериментов, но не подходит для реальных проектов из-за отсутствия структуры.

Как использовать аргументы командной строки без внешних библиотек?

import sys

print(f"Имя скрипта: {sys.argv[0]}")
if len(sys.argv) > 1:
    print(f"Аргументы: {sys.argv[1:]}")
else:
    print("Аргументы не переданы.")

Этот вариант удобен для быстрых утилит, но плохо масштабируется.

Как построить программу на основе классов?

class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, x):
        self.result += x
        return self

    def display(self):
        print(f"Текущий результат: {self.result}")

if __name__ == "__main__":
    calc = Calculator()
    calc.add(10).add(5).display()

Классы удобны, когда программа оперирует состоянием и должна быть расширена наследованием.

Как разбить программу на модули?

# utils.py
def factorial(n):
    if n < 0:
        raise ValueError("Факториал определён только для неотрицательных чисел.")
    return 1 if n == 0 else n * factorial(n-1)

# main.py
import utils

print(utils.factorial(5))  # 120

Такое разделение облегчает поддержку и тестирование.

Типичные ошибки и их решение

  • IndentationError: неправильные отступы. Решение: настроить редактор на 4 пробела.
  • NameError: name '...' is not defined: забыли определить функцию или переменную, или ошиблись в порядке импорта.
  • При запуске скрипта код не выполняется: возможно, пропущен блок if __name__ == "__main__".
  • ModuleNotFoundError: модуль не установлен или неправильно указан путь. Решение: используйте виртуальное окружение.

Подробные примеры с пояснениями

Пример 1: Калькулятор с обработкой ошибок и аргументами командной строки

Пример
import sys
import operator

OPERATIONS = {
    '+': operator.add,
    '-': operator.sub,
    '*': operator.mul,
    '/': operator.truediv
}

def calculate(expression):
    try:
        a, op, b = expression.split()
        a, b = float(a), float(b)
        func = OPERATIONS.get(op)
        if func is None:
            raise ValueError("Неизвестная операция. Используйте +, -, *, /.")
        result = func(a, b)
        return result
    except ValueError as e:
        return f"Ошибка: {e}"
    except ZeroDivisionError:
        return "Ошибка: деление на ноль."

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Использование: python calculator.py '10 + 5'")
        sys.exit(1)
    expr = sys.argv[1]
    print(calculate(expr))
$ python calculator.py '10 + 5'
15.0
$ python calculator.py '10 / 0'
Ошибка: деление на ноль.

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

Пример 2: Чтение файла построчно и поиск строки (аналог grep)

Пример
import sys
import re

def search_in_file(filename, pattern):
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            for line_num, line in enumerate(f, 1):
                if re.search(pattern, line, re.IGNORECASE):
                    print(f"{line_num}: {line.rstrip()}")
    except FileNotFoundError:
        print(f"Файл {filename} не найден.")

def main():
    if len(sys.argv) != 3:
        print("Использование: python greppy.py 'pattern' filename")
        sys.exit(1)
    pattern = sys.argv[1]
    filename = sys.argv[2]
    search_in_file(filename, pattern)

if __name__ == "__main__":
    main()
$ python greppy.py 'error' sample.log
12: 2025-03-17 error: connection timeout
45: 2025-03-17 error: invalid credentials

Регулярное выражение re.search используется для поиска подстроки, обработчик FileNotFoundError предотвращает падение программы.

Пример 3: Создание простого веб-сервера с использованием встроенной библиотеки http.server

Пример
from http.server import HTTPServer, BaseHTTPRequestHandler
import json

class SimpleHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        response = {'message': 'Hello from Python server!', 'path': self.path}
        self.wfile.write(json.dumps(response, ensure_ascii=False).encode('utf-8'))

if __name__ == "__main__":
    server = HTTPServer(('localhost', 8000), SimpleHandler)
    print('Сервер запущен на http://localhost:8000')
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
$ curl http://localhost:8000/test
{"message": "Hello from Python server!", "path": "/test"}

Встроенный модуль http.server позволяет быстро создать HTTP-сервер без установки дополнительных библиотек. Класс-обработчик переопределяет метод do_GET.

Пример 4: Использование argparse для гибкого разбора аргументов

Пример
import argparse

def main():
    parser = argparse.ArgumentParser(description='Сложение двух чисел.')
    parser.add_argument('a', type=float, help='Первое слагаемое')
    parser.add_argument('b', type=float, help='Второе слагаемое')
    parser.add_argument('--verbose', '-v', action='store_true', help='Подробный вывод')
    args = parser.parse_args()

    result = args.a + args.b
    if args.verbose:
        print(f"{args.a} + {args.b} = {result}")
    else:
        print(result)

if __name__ == "__main__":
    main()
$ python adder.py 3.5 2.1
5.6
$ python adder.py 3.5 2.1 --verbose
3.5 + 2.1 = 5.6

Модуль argparse автоматически генерирует справку и проверяет типы аргументов.

Создание программ на Python - comments

En
создание программ на языке python (python)