Рубрики
Без рубрики

30 Дней Проекта Python | Day 3: Простой Калькулятор Заработка

Добро пожаловать в первый проект за 30 дней Python! Сегодня мы создадим калькулятор заработка для сотрудников. Проверьте это, и остальную часть серии тоже!

Автор оригинала: Jose Salvatierra.

Добро пожаловать в первый мини-проект в серии 30 дней Python . Для этого проекта мы собираемся создать простое консольное приложение, которое поможет работодателю рассчитать заработок сотрудника за определенную неделю.

30 Дней Python – это бесплатная серия, которую мы просматриваем в нашем блоге. Каждый день в течение 30 дней мы учим вас чему-то новому о Python (предназначенному для начинающих) и даем вам упражнения. Каждые 3 дня у нас есть мини-проект, а каждые 7 дней-немного больший проект для вас!

Если вы еще не справились с остальной частью контента дня 3 , я бы рекомендовал вам сделать это, прежде чем приступать к проекту. Вы также можете просмотреть предыдущие дни, перейдя по ссылке в верхней части этого сообщения в блоге.

Ниже вы найдете краткое описание проекта, а также типовое решение с объяснением. Я бы очень рекомендовал вам попробовать это самостоятельно, прежде чем искать решение; вы получите от этого гораздо больше, я обещаю. Если вы застряли, нет ничего плохого в том, чтобы вернуться к предыдущим постам в этой серии или просмотреть любые заметки, которые вы написали. Это не экзамен!

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

Краткое изложение

Наше приложение должно работать следующим образом:

  1. Пользователю должно быть выдано три запроса, в которых ему будет предложено предоставить различную информацию о сотруднике. В одном приглашении должно быть указано имя сотрудника, в другом-его почасовая заработная плата, а в последнем – сколько часов сотрудник проработал на этой неделе.
  2. Имя сотрудника должно быть обработано, чтобы убедиться, что оно находится в определенном формате. Все имена сотрудников должны быть лишены лишних пробелов и должны быть в заглавном регистре. Это означает, что каждое слово пишется заглавными буквами, а все остальные буквы-строчными. Например, если у работодателя случайно включен caps lock и он пишет "rEGINA gEORGE" , имя все равно будет правильно сохранено как "Regina George" .
  3. Общий заработок работника за неделю должен быть рассчитан путем умножения отработанных часов на его почасовую заработную плату.
  4. Помните, что любой пользовательский ввод, который мы получаем, будет строкой. Хотя мы можем умножать строки, в этом случае это не совсем то, что вы хотите. Также стоит иметь в виду, что заработная плата сотрудника или количество отработанных часов могут быть не целым числом.
  5. После обработки имени сотрудника и расчета его заработка за неделю программа должна вывести эту информацию в виде одной строки. Например, такой вывод был бы уместен:
Regina George earned $800 this week.

Пошаговое руководство по решению

Ниже вы найдете пошаговое руководство о том, как мы подошли бы к этой конкретной проблеме. Еще раз, если ваш немного отличается, не волнуйтесь!

У нас также есть видеоверсия, которую вы можете посмотреть здесь :

Для этого проекта мы просто будем решать проблемы шаг за шагом. Всегда полезно разбивать задачи на простые куски, потому что это делает проекты менее пугающими.

Во-первых, мы просто запросим у пользователя некоторую информацию. Мы не будем обрабатывать ни одну из строк, и мы не будем беспокоиться о типах. Мы просто хотим получить информацию от пользователя и сохранить эту информацию в некоторых переменных.

name = input("Please enter the employee's name: ")
hourly_wage = input("What is their hourly wage? ")
hours_worked = input("How many hours have they worked this week? ")

Если мы хотим проверить, что все работает, мы можем просто распечатать переменные:

print(name)
print(hourly_wage)
print(hours_worked)

На этом этапе у нас не должно возникнуть никаких проблем, поэтому мы можем перейти к исправлению ввода name . Есть несколько вариантов того, как мы это напишем, но в основном подходы будут одинаковыми. Нам нужно вызвать метод strip , чтобы удалить лишние пробелы с обоих концов строки, и нам нужно вызвать title , чтобы преобразовать строку в регистр заголовка.

Один из способов, которым мы могли бы это сделать, – создать три разные переменные и выполнить разные операции над каждой строкой:

name = input("Please enter the employee's name: ")
stripped_name = name.strip()
title_name = stripped_name.title()

Это нормально, но нам не нужно использовать здесь разные имена переменных. Мы не собираемся использовать имя в его сыром виде, поэтому нам не нужно его сохранять. То же самое касается строки, которую мы удалили из белого пространства. Нас интересует только конечный продукт, поэтому мы можем безопасно перезаписывать name на каждом этапе:

name = input("Please enter the employee's name: ")
name = name.strip()
name = name.title()

Если мы хотим быть действительно краткими, мы можем связать различные операции в конце вызова input следующим образом:

name = input("Please enter the employee's name: ").strip().title()

Причина, по которой это работает, заключается в том, что Python будет оценивать каждый из этих вызовов (которые все являются выражениями) по одному, начиная слева.

Итак, сначала у нас есть вызов input . Это будет оцениваться в строку перед вызовом strip .

Давайте представим , что пользователь вводит "rEGINA gEORGE" , со всем этим пробелом вокруг фактического имени. Это то , что мы получаем от input , поэтому после завершения работы input наша строка кода примерно эквивалентна этой:

name = " rEGINA gEORGE ".strip().title()

Теперь следующая операция, которую нужно выполнить, – это вызов strip . strip также вычисляется в новую строку, поэтому мы получаем что-то вроде этого:

name = "rEGINA gEORGE".title()

Теперь пробел исчез, и нам нужно выполнить еще одну операцию: вызвать title . title , так же как strip и input , вычисляется в другую строку, что оставляет нас с этим:

name = "Regina George"

Теперь, когда имя нашего сотрудника было правильно обработано, мы можем начать думать о расчете его заработка. К сожалению, мы не сможем этого сделать:

name = input("Please enter the employee's name: ").strip().title()
hourly_wage = input("What is their hourly wage? ")
hours_worked = input("How many hours have they worked this week? ")

earnings = hourly_wage * hours_worked

Это даст нам Ошибка типа :

Traceback (most recent call last):
  File "main.py", line 5, in 
    earnings = hourly_wage * hours_worked
TypeError: can't multiply sequence by non-int of type 'str'

Сообщение здесь довольно ясное, мы умножаем строку на строку, но по крайней мере одна из них должна быть целым числом.

Итак, давайте изменим количество отработанных часов на целое число и посмотрим, что произойдет:

name = input("Please enter the employee's name: ").strip().title()
hourly_wage = input("What is their hourly wage? ")
hours_worked = input("How many hours have they worked this week? ")

earnings = hourly_wage * int(hours_worked)

print(earnings)

Если вы попытаетесь запустить этот код, вы получите значение, введенное для почасовой заработной платы, повторенное несколько раз, равное значению, введенному для отработанных часов. Это связано с тем, что умножение строк на целое число является сокращением для выполнения повторной конкатенации строк. "-" * 5 совпадает с "-" + "-" + "-" + "-" + "-" .

Имея это в виду, нам нужно будет преобразовать оба значения в числа. Однако вместо преобразования в целые числа мы собираемся преобразовать в поплавки, потому что это позволит нам принимать нецелые значения для заработной платы пользователя или отработанных часов. Например, мы хотим иметь возможность рассчитать 32,5 часа работы при почасовой оплате труда 13,50.

name = input("Please enter the employee's name: ").strip().title()
hourly_wage = input("What is their hourly wage? ")
hours_worked = input("How many hours have they worked this week? ")

earnings = float(hourly_wage) * float(hours_worked)

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

Одна вещь, которую мы не сможем сделать, – это принять зарплату с символом валюты. Если вам нужна дополнительная задача, вы можете попытаться выяснить, как это сделать для вашей местной валюты. Возможно, вам захочется ознакомиться с документацией для strip , strip и rstrip .

Теперь, когда мы написали всю логику нашей программы, нам просто нужно вывести информацию пользователю. Я собираюсь использовать здесь f-строку, но вы можете использовать формат или конкатенацию строк, если хотите. Если вы используете конкатенацию, помните, что вы можете объединять только строки!

name = input("Please enter the employee's name: ").strip().title()
hourly_wage = input("What is their hourly wage? ")
hours_worked = input("How many hours have they worked this week? ")

earnings = float(hourly_wage) * float(hours_worked)

print(f"{name} earned ${earnings} this week.")

С этим мы покончили!

Надеюсь, вы смогли сделать это самостоятельно, но если нет, не волнуйтесь! Программирование сложно, и требуется время, чтобы по-настоящему усвоить эти новые концепции. Придерживайтесь этого и обязательно просмотрите контент за последние несколько дней, если вам это нужно.

Как всегда, вы можете найти нас на Discord , если вам нужна какая-либо помощь.

Бонусный материал

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

Один из вариантов-преобразовать результат наших вычислений в целое число. Это” усечет ” поплавок, по существу отбросив все после десятичной точки. Это, конечно, выглядит намного лучше, но мы отбрасываем некоторую точность.

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

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

Вот как будет выглядеть наше решение с использованием этих специальных параметров форматирования:

name = input("Please enter the employee's name: ").strip().title()
hourly_wage = input("What is their hourly wage? ")
hours_worked = input("How many hours have they worked this week? ")

earnings = float(hourly_wage) * float(hours_worked)

print(f"{name} earned ${earnings:.2f} this week.")

Вот и все для сегодняшнего проекта! Я надеюсь, что вам понравилось завершить его, а также увидеть наше решение.

Следуйте за нами в Twitter для получения дополнительных обновлений, когда мы выпустим новый контент для этой серии!

Счастливого кодирования!