Создание программного обеспечения с помощью языка 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 автоматически генерирует справку и проверяет типы аргументов.