Python 3 программы: написание и примеры

Раздел: Python -> Версии Python

Эффективная структура программы на Python 3

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

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


import sys

def main():
    if len(sys.argv) < 2:
        print("Ошибка: не указано имя.")
        sys.exit(1)
    name = sys.argv[1]
    print(f"Привет, {name}!")

if __name__ == "__main__":
    main()

Python 2 import (импорт в python 2)

Пояснение шагов:

  1. Импортируем модуль sys для работы с аргументами.
  2. Определяем функцию main(), в которой проверяем количество аргументов.
  3. Если аргументов меньше двух (первый - имя скрипта), выводим сообщение об ошибке и завершаем программу с кодом 1.
  4. Иначе извлекаем первый пользовательский аргумент и выводим приветствие.
  5. Блок if __name__ == "__main__" гарантирует, что main() выполнится только при прямом запуске скрипта.

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

  • IndexError: list index out of range - возникает, если обратиться к sys.argv[1] без проверки длины. Решение: всегда проверять len(sys.argv) > 1.
  • Опечатка в '__main__' - часто пишут '__main_' с одним подчеркиванием. Решение: строго использовать двойные подчеркивания: __main__.
  • Забыли обработать исключения - например, при преобразовании ввода в число. Решение: оборачивать потенциально опасный код в try/except.

Вариант 1: использование argparse

Как обрабатывать именованные аргументы, флаги и значения по умолчанию?

Модуль argparse предоставляет удобный интерфейс для создания CLI. Он автоматически генерирует справку, проверяет типы и обрабатывает ошибки.


import argparse

def main():
    parser = argparse.ArgumentParser(description='Приветствие пользователя')
    parser.add_argument('name', type=str, help='Имя пользователя')
    parser.add_argument('--greeting', type=str, default='Привет', help='Фраза приветствия')
    args = parser.parse_args()
    print(f"{args.greeting}, {args.name}!")

if __name__ == "__main__":
    main()

программы на python 2 (программы на python 2)

Запуск: python script.py Иван --greeting Здравствуйте.

Проблема: забыли импортировать argparse. Решение: проверить наличие модуля (входит в стандартную библиотеку). Также возможна путаница с позиционными и именованными аргументами - всегда читать документацию.

Вариант 2: структурирование с функциями

Как разделить программу на логические блоки для улучшения читаемости?

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


import sys

def greet(name):
    return f"Здравствуйте, {name}!"

def main():
    if len(sys.argv) < 2:
        print("Необходимо указать имя.")
        sys.exit(1)
    message = greet(sys.argv[1])
    print(message)

if __name__ == "__main__":
    main()

Python 3 программы (программы на python 3)

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

Ошибка: не все функции возвращают значения - следить за return.

Вариант 3: объектно-ориентированный подход

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

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


import sys

class Greeter:
    def __init__(self, greeting="Привет"):
        self.greeting = greeting

    def greet(self, name):
        return f"{self.greeting}, {name}!"

def main():
    if len(sys.argv) < 2:
        print("Укажите имя.")
        return
    greeter = Greeter()
    print(greeter.greet(sys.argv[1]))

if __name__ == "__main__":
    main()

Python 2 print (print в python 2)

Использование: для приложений с конфигурацией, логгированием или несколькими режимами.

Проблема: излишнее усложнение для простых скриптов. Решение: оценивать необходимость.

Вариант 4: библиотека Click

Как создать элегантный интерфейс командной строки с минимальными усилиями?

Click предоставляет декораторы для создания команд и автоматической обработки аргументов.


import click

@click.command()
@click.argument('name')
@click.option('--greeting', default='Привет', help='Приветствие')
def greet(name, greeting):
    print(f"{greeting}, {name}!")

if __name__ == "__main__":
    greet()

Необходимо установить: pip install click.

Ошибка: забыли установить модуль. Решение: проверить pip list. Также путаница с декораторами - следить за скобками.

Расширенные примеры программ на Python 3

Пример 1: подсчёт частоты слов в файле

Программа принимает путь к файлу и опционально слово для поиска.

Пример

import argparse
from collections import Counter

def main():
    parser = argparse.ArgumentParser(description='Частота слов в текстовом файле')
    parser.add_argument('file', type=str, help='Путь к файлу')
    parser.add_argument('--word', type=str, help='Конкретное слово для подсчёта')
    parser.add_argument('--top', type=int, default=5, help='Количество популярных слов')
    args = parser.parse_args()

    try:
        with open(args.file, 'r', encoding='utf-8') as f:
            text = f.read()
    except FileNotFoundError:
        print(f"Ошибка: файл {args.file} не найден.")
        return
    except PermissionError:
        print(f"Ошибка: нет прав на чтение {args.file}.")
        return

    words = text.lower().split()
    counter = Counter(words)

    if args.word:
        print(f"Слово '{args.word}' встречается {counter[args.word.lower()]} раз.")
    else:
        print(f"Топ-{args.top} слов:")
        for word, count in counter.most_common(args.top):
            print(f"  {word}: {count}")

if __name__ == "__main__":
    main()

Результат для файла с текстом "hello world hello python world hello":

Топ-5 слов:
  hello: 3
  world: 2
  python: 1

Пример 2: логирование в программе

Использование модуля logging для отслеживания событий.

Пример

import logging
import sys

def setup_logging():
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(levelname)s - %(message)s',
                        handlers=[logging.FileHandler('app.log'),
                                  logging.StreamHandler()])

def process_data(data):
    logging.info("Начало обработки данных")
    try:
        result = sum(data)
        logging.info(f"Результат: {result}")
        return result
    except Exception as e:
        logging.error(f"Ошибка обработки: {e}")
        return None

def main():
    setup_logging()
    logging.info("Программа запущена")
    if len(sys.argv) < 2:
        logging.warning("Не переданы числа")
        return
    try:
        numbers = [float(x) for x in sys.argv[1:]]
    except ValueError:
        logging.error("Некорректные аргументы")
        return
    process_data(numbers)

if __name__ == "__main__":
    main()

Вывод в консоли:

2025-03-19 10:00:00,000 - INFO - Программа запущена
2025-03-19 10:00:00,001 - INFO - Начало обработки данных
2025-03-19 10:00:00,001 - INFO - Результат: 15.0

Пример 3: конвертер единиц измерения с классами

Пример

class Converter:
    def __init__(self, factor, unit_from, unit_to):
        self.factor = factor
        self.unit_from = unit_from
        self.unit_to = unit_to

    def convert(self, value):
        return value * self.factor

def main():
    converters = [
        Converter(0.3048, 'фут', 'метр'),
        Converter(0.453592, 'фунт', 'кг'),
        Converter(1.60934, 'миля', 'км')
    ]
    print("Доступные конвертации:")
    for i, c in enumerate(converters, 1):
        print(f"{i}. {c.unit_from} -> {c.unit_to}")
    choice = int(input("Выберите номер: ")) - 1
    value = float(input("Введите значение: "))
    result = converters[choice].convert(value)
    print(f"{value} {converters[choice].unit_from} = {result:.2f} {converters[choice].unit_to}")

if __name__ == "__main__":
    main()

Пример работы:

Доступные конвертации:
1. фут -> метр
2. фунт -> кг
3. миля -> км
Выберите номер: 1
Введите значение: 10
10.0 фут = 3.05 метр

Пример 4: использование Click для группы команд

Пример

import click

@click.group()
def cli():
    pass

@cli.command()
@click.argument('name')
def hello(name):
    click.echo(f"Привет, {name}!")

@cli.command()
@click.argument('name')
def goodbye(name):
    click.echo(f"До свидания, {name}!")

if __name__ == "__main__":
    cli()

Запуск:

$ python script.py hello Иван
Привет, Иван!
$ python script.py goodbye Иван
До свидания, Иван!

программы на Python 3 - comments

En
Python 3 программы (python)