Вопрос для новичка в Python 3: эффективен ли этот код?Может ли это улучшить / упростить - PullRequest
0 голосов
/ 12 октября 2018

запрос на расчет выплат, основанный на отработанных часах и ставке в час, где часы свыше 40 выплачиваются в 1,5 раза от первоначальной ставки.

Тест в 45 часов при 10,50 в час.на выходе должны быть цифры выплат.

code

1 Ответ

0 голосов
/ 12 октября 2018

Я бы организовал код по-другому.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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...