Python 3 программы: написание и примеры
Эффективная структура программы на 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)
Пояснение шагов:
- Импортируем модуль sys для работы с аргументами.
- Определяем функцию main(), в которой проверяем количество аргументов.
- Если аргументов меньше двух (первый - имя скрипта), выводим сообщение об ошибке и завершаем программу с кодом 1.
- Иначе извлекаем первый пользовательский аргумент и выводим приветствие.
- Блок 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 Иван До свидания, Иван!