Function returning only one value

Asked

Viewed 98 times

-1

I am making a program in Python and need to implement a function. The function receives as input two parameters: A dictionary containing as key the name of an employee and as value a list containing email , basic salary and position of that employee. The name of an official.


The function must return as a result the employee’s net salary. The salary is calculated according to rules for each position.

  • Developer, 15% discount if salary >= 2000, otherwise discount 5%.
  • Analyst, discount of 20%, if salary >= 3500, if not discount of 10%.
  • Manager, 25% discount if salary >= 4000, otherwise 15% discount% .

However when I implement the code I and run the test file, it returns me a single result: Function Result: 2550.0

How do I get it to return the expected result for each function and not just 2550.0?


Function I implemented

def calcular_salario(dicionario, nome):
    for nome in dicionario:
        if dicionario[nome][2] == 'DESENVOLVEDOR':
            if dicionario[nome][1] >= 2000:
                resultado = dicionario[nome][1] - (dicionario[nome][1] * .15)
            else:
                resultado = dicionario[nome][1] - (dicionario[nome][1] * 0.05)

        if dicionario[nome][2] == 'ANALISTA':
            if dicionario[nome][1] >= 3500:
                resultado = dicionario[nome][1] - (dicionario[nome][1] * .20)
            else:
                resultado = dicionario[nome][1] - (dicionario[nome][1] * .10)

        if dicionario[nome][2] == 'GERENTE':
            if dicionario[nome][1] >= 4000:
                resultado = dicionario[nome][1] - (dicionario[nome][1] * .25)
            else:
                resultado = dicionario[nome][1] - (dicionario[nome][1] * .15)
    return resultado

Test file - I can’t change

from ac02 import calcular_salario


dicionario = {'marcilio': ['[email protected]', 5000.00, 'DESENVOLVEDOR'],
              'pedro': ['[email protected]', 2000.00, 'DESENVOLVEDOR'],
              'carlos': ['[email protected]', 1000.00, 'DESENVOLVEDOR'],
              'roberto': ['[email protected]', 5000.00, 'ANALISTA'],
              'renata': ['[email protected]', 3500.00, 'ANALISTA'],
              'angelica': ['[email protected]', 1000.00, 'ANALISTA'],
              'amanda': ['[email protected]', 8000.00, 'GERENTE'],
              'ricardo': ['[email protected]', 4000.00, 'GERENTE'],
              'fernanda': ['[email protected]', 3000.00, 'GERENTE'],
              'marcos': ['[email protected]', 800.00, 'ESTAGIARIO']}

try:
    resultado = calcular_salario(dicionario, 'marcilio')
    assert resultado == 4250.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 4250.0')
    print(' Resultado da Função:', resultado)

try:
    resultado = calcular_salario(dicionario, 'pedro')
    assert resultado == 1700.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 1700.0')
    print(' Resultado da Função:', resultado)

try:
    resultado = calcular_salario(dicionario, 'carlos')
    assert resultado == 950.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 950.0')
    print(' Resultado da Função:', resultado)

try:
    resultado = calcular_salario(dicionario, 'roberto')
    assert resultado == 4000.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 4000.0')
    print(' Resultado da Função:', resultado)

try:
    resultado = calcular_salario(dicionario, 'renata')
    assert resultado == 2800.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 2800.0')
    print(' Resultado da Função:', resultado)

try:
    resultado = calcular_salario(dicionario, 'angelica')
    assert resultado == 900.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 900.0')
    print(' Resultado da Função:', resultado)

try:
    resultado = calcular_salario(dicionario, 'amanda')
    assert resultado == 6000.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 6000.0')
    print(' Resultado da Função:', resultado)

try:
    resultado = calcular_salario(dicionario, 'ricardo')
    assert resultado == 3000.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 3000.0')
    print(' Resultado da Função:', resultado)

try:
    resultado = calcular_salario(dicionario, 'fernanda')
    assert resultado == 2550.0
    print('CORRETO')
except AssertionError:
    print('ERRO:')
    print(' Resultado esperado: 2550.0')
    print(' Resultado da Função:', resultado)

1 answer

1


The problem begins here:

def calcular_salario(dicionario, nome):
    for nome in dicionario:

In the first line, you define that the function has the parameter nome, but in the second line, uses this variable in loop, i.e., the value that was received is overwritten for each iteration of the same.

But actually you don’t need to make one loop for all dictionary records. Notice the structure of it:

dicionario = {'marcilio': ['[email protected]', 5000.00, 'DESENVOLVEDOR'],
              'pedro': ['[email protected]', 2000.00, 'DESENVOLVEDOR'],
              'carlos': ['[email protected]', 1000.00, 'DESENVOLVEDOR'],
              etc...

I mean, the name is the key, so just do dicionario[nome], that you get the list containing the other employee data. So:

def calcular_salario(dicionario, nome):
    email, salario, cargo = dicionario[nome]
    if cargo == 'DESENVOLVEDOR':
        if salario >= 2000:
            return salario * 0.85
        else:
            return salario * 0.95

    if cargo == 'ANALISTA':
        if salario >= 3500:
            return salario * 0.8
        else:
            return salario * 0.9

    if cargo == 'GERENTE':
        if salario >= 4000:
            return salario * 0.75
        else:
            return salario * 0.85

Note that I can already take the list elements and put them in variables:

email, salario, cargo = dicionario[nome]

As all lists have exactly 3 elements, there will be no problem in doing so.

Then just check the conditions and return the value. Note that I can use return at any point as a return returns the value and exits the function (that is, it does not perform anything later), and is exactly what I need: if I arrived at the condition I need, I return the value and I’m done.

I also changed the percentage calculation. After all, if there is a 10% discount, what is left is 90% of the salary, then just do salario * 0.9 (the same goes for other cases).


Obs: as the email is not used in the function, there is the convention to use _ as variable name, precisely to indicate that it is information that is not used:

_, salario, cargo = dicionario[nome]

Although it is not used in the function, it is still necessary to put it, so that Python knows that the first element of the list must be placed there (so the second and third elements are correctly placed in the variables salario and cargo).

Browser other questions tagged

You are not signed in. Login or sign up in order to post.