Я бы организовал код по-другому.1. Функции для упаковки фрагментов кода, чтобы их можно было повторно использовать и параметризовать.2. Обработка исключений для указания неправильного пользовательского ввода.
def get_hrs_rph_from_user():
while True:
hrs = input('Enter Hours: ')
try:
hrs = int(hrs)
break
except ValueError:
print('Cannot convert [{}] into integer'.format(hrs))
while True:
rph = input('Enter Rate per Hour: ')
try:
rph = float(rph)
break
except ValueError:
print('Cannot convert [{}] into float'.format(rph))
return hrs, rph
def calculate_payout(hrs, rph, hrs_norm=40, coeff=1.5):
if hrs <= hrs_norm:
return hrs * rph
else:
return hrs_norm * rph + (hrs - hrs_norm) * coeff * rph
if __name__ == '__main__':
payout = calculate_payout(*get_hrs_rph_from_user())
print('\nCalculated payout = {}'.format(payout))
Другая версия того же кода, основанная на предложении @Jeronimo (довольно сложный и подверженный ошибкам способ для новичка в python):
def get_from_user_factory(config):
ans = dict()
for key, elem in config.items():
def get_from_user(line=elem['input_line'], type_=elem['value_type']):
while True:
value = input('{}: '.format(line))
try:
return type_(value)
except ValueError:
print(
'Cannot convert [{}] into {}'
.format(value, type_.__name__))
ans[key] = get_from_user
return ans
def calculate_payout(hrs, rph, hrs_norm=40, coeff=1.5):
if hrs <= hrs_norm:
return hrs * rph
else:
return hrs_norm * rph + (hrs - hrs_norm) * coeff * rph
if __name__ == '__main__':
input_config = {
'hrs': {'input_line': 'Enter Hours', 'value_type': int},
'rph': {'input_line': 'Enter Rate per Hour', 'value_type': float}}
input_functions = get_from_user_factory(input_config)
input_data = {key: func() for key, func in input_functions.items()}
print('\nData from user: {}'.format(input_data))
payout = calculate_payout(**input_data)
print('Calculated payout = {}'.format(payout))