Эта программа на 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 ответ
Ввод данных без сохранения не имеет смысла в большинстве случаев.. Если человеку нужно ввести данные, сохраните их где-нибудь. Это может быть файл 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).— Моделмат