Анализ средних бюджетов фильмов с помощью Python 3

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

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

# List of movies and their budgets
movies = [
    ('Avengers: Endgame', 400000000),
    ('Pirates of the Caribbean: On Stranger Tides', 379000000),
    ('Avengers: Age of Ultron', 365000000),
    ('Star Wars: Ep. VII: The Force Awakens', 306000000),
    ('Avengers: Infinity War', 300000000)
]

# Allows user to input how many movies they want to add to the list
add_new_movie = int(input('How many movies do you want to add? '))

# Takes the name and budget of the movie the user entered and add the movie to the list
for _ in range(add_new_movie):
    name = input('Enter movie name: ')
    budget = input('Enter movie budget: ')
    new_movie = (name, int(budget))
    movies.append(new_movie)

# List representing over budget movies and counter to keep track of the total budget of all the movies in the list
over_budget_movies = []
total_budget = 0

# Adds together the budget of each movie
for movie in movies:
    total_budget += movie[1]

# Calculates the average cost of all movies in the list
average_budget = int(total_budget / len(movies))

# If the movie budget is over the average budget, how much the movies are over budget will be calculated and added to the over budget list
for movie in movies:
    if movie[1] > average_budget:
        over_budget_movies.append(movie)
        over_average_cost = movie[1] - average_budget
        print(
            f"{movie[0]} was ${movie[1]:,}: ${over_average_cost:,} over average.")
        print()

# Prints how many movies were over the average budget
print(
    f"There were {len(over_budget_movies)} movies with budgets that were over average.")

1 ответ
1

Ввод данных без сохранения не имеет смысла в большинстве случаев.. Если человеку нужно ввести данные, сохраните их где-нибудь. Это может быть файл JSON, файл CSV, база данных — все, что вы хотите попробовать. Такой подход, когда данные хранятся отдельно от кода, имеет много преимуществ. Это также хорошее средство для обучения, так что попробуйте.

Ввод данных и отчетность — разные задачи. Иногда вы хотите добавить новые данные в систему. Иногда вы хотите проанализировать эти данные, получить отчеты и т. Д. В простейшей форме это может вызвать программу с 3 функциями: main()
функция, в которой пользователь решает, что делать (добавить данные или получить отчет), а затем по одной функции для каждой задачи.

Используйте значимые объекты данных, а не общие коллекции. В настоящее время вы представляете фильм как кортеж из двух частей. Но это не очень декларативно: например, ваш код должен использовать movie[1] скорее, чем movie.budget. Современный Python упрощает создание простых объектов данных (например, namedtuple, dataclass или классов на основе attrs).

По возможности избегайте смешивания вычислений и печати.. Хорошей практикой является разделение вычислений и всего, что имеет «побочные эффекты». Печать — наиболее частый пример побочного эффекта. Это огромная тема в информатике, и вы сможете узнать о ней больше по мере продвижения вперед. Но когда вы учитесь, просто попробуйте выработать привычку хранить разные вещи отдельно: например, не печатайте фильмы с превышением бюджета, пока вы составляете их список.

Вот иллюстрация этих идей (без учета ввода данных):

from collections import namedtuple

# Meaningful data objects.

Movie = namedtuple('Movie', 'title budget')

movies = [
    Movie('Avengers: Endgame', 400000000),
    Movie('Pirates of the Caribbean: On Stranger Tides', 379000000),
    Movie('Avengers: Age of Ultron', 365000000),
    Movie('Star Wars: Ep. VII: The Force Awakens', 306000000),
    Movie('Avengers: Infinity War', 300000000)
]

# Computation.

total_budget = sum(m.budget for m in movies)
average_budget = int(total_budget / len(movies))
over_budget_movies = [m for m in movies if m.budget > average_budget]

# Printing.

print(f'Number of overbudget movies: {len(over_budget_movies)}')
for m in over_budget_movies:
    diff = m.budget - average_budget
    print(f'{m.title} was ${m.budget}: ${diff} over average.')

  • Вы также можете использовать total_budget // len(movies) (деление пола, идентичное приведению к целому числу положительных чисел). Лучшей версией было бы округление до ближайшего целого числа (например, 3,75 -> 4 вместо 3).

    — Моделмат

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *