How to pass values from one function to another?

Asked

Viewed 80 times

1

I made the code below, in order to receive and display data, as if they were related to a tax bill. The code displays the following error when running:

File "main.py", line 49, in <module>
    imprimir_nota()
  File "main.py", line 41, in imprimir_nota
    print ('\nCliente: {}'. format (Nome))
NameError: name 'Nome' is not defined

If I’m right and there’s no big mistake in my logic regarding the code, the problem is the absence of a return of values from the first two functions to the third. I tried to make the correction when I imagined it, but I couldn’t, very likely due to my lack of understanding on how to perform right.

def dados_cliente():
Nome = str (input ('Por gentileza, informe o nome do cliente: '))
CPF = int (input ('Por gentileza, informe o CPF do cliente: '))
Celular = int (input ('Por gentileza, informe o celular: '))

def dados_peça():
    peca1 = 823556
    peca2 = 632552
    peca3 = 445568
    peca4 = 550632
    peca5 = 785642

Numero_Peca = str (input ('\n\nPor gentileza, informe o número da peça: '))

if Numero_Peca == peca1:
  Descricao_Peca = str ('Peça de motor para motocicleta Yamanha.')
  Preco = 100.0

elif Numero_Peca == peca2:
  Descricao_Peca = str ('Peça de motor para carro Honda.')
  Preco = 170.0

elif Numero_Peca == peca3:
  Descricao_Peca = str ('Peça de rolamento Yamaha.')
  Preco = 257.99

elif Numero_Peca == peca4:
  Descricao_Peca = str ('Peça de aceleração Dafra.')
  Preco = 55.80

elif Numero_Peca == peca5:
  Descricao_Peca = str ('Peça de frenagem Honda.')
  Preco = 145.98

Qtd_Peca = int (input ('Por gentileza, informe a quantidade desejada: '))

def imprimir_nota():
    print ('\n\n..::NOTA FISCAL::..')
    print ('LOJA DE PEÇAS EM GERAL')
    print ('CNPJ: 40.769.710/0001-03')
    print ('\nCliente: {}'. format (Nome))
    print ('CPF: {}'. format (CPF))
    print ('Telefone Celular: {}'. format (Celular))

    print ('Quantidade do produto: {}    Código do produto: {}    Descrição do produto: {}    Preço unitário: {}'. format (Qtd_Peca, Numero_Peca, Descricao_Peca, Preco))

   dados_cliente()
   dados_peça()
   imprimir_nota()
  • 1

    Search by "parameters" of functions.

1 answer

1


Basically, when you do this:

def dados_cliente():
    Nome = str (input ('Por gentileza, informe o nome do cliente: '))

The variable Nome is local to the function dados_cliente, and cannot be accessed from outside the function (there is a more detailed explanation here).

One option to fix this is to make the function return this data. For example, the 3 information could be returned in a tuple, and whoever calls the function can get the return and save in variables:

def dados_cliente():
    nome = input('Por gentileza, informe o nome do cliente: ')
    cpf = input('Por gentileza, informe o CPF do cliente: ')
    celular = input('Por gentileza, informe o celular: ')
    # função retorna os dados em uma tupla
    return (nome, cpf, celular)

# chamar a função e obter o retorno, já separado em variáveis
nome, cpf, celular = dados_cliente()

# ou obter tudo em uma tupla
# nesse caso, dados[0] é o nome, dados[1] é o CPF e dados[2] é o celular
dados = dados_cliente()

Notice some changes: input already returns a string so it’s redundant to do str(input()). And the CPF is not a number (in the sense of being a numerical value with which I can make calculations, etc), he’s information that just happens to use digits (in documents this makes a difference because many allow zeros on the left, for example, that would disappear if you converted to number - not counting other documents that allow letters). Anyway, that’s why I removed the int CPF. The same goes for the phone number ("0800" is not the same as the number "800", because removing the front zero makes the phone invalid, etc).

Finally, once the function returns, you can pass it as parameters to the other functions. There are other things you can simplify, would look like this:

def dados_cliente():
    nome = input('Por gentileza, informe o nome do cliente: ')
    cpf = input('Por gentileza, informe o CPF do cliente: ')
    celular = int(input('Por gentileza, informe o celular: '))
    return (nome, cpf, celular)

def dados_peça():
    pecas = { # cada número de peça é mapeado para uma tupla com a descrição e preço
      823556: ('Peça de motor para motocicleta Yamanha.', 100.0),
      632552: ('Peça de motor para carro Honda.', 170.0),
      445568: ('Peça de rolamento Yamaha.', 257.99),
      550632: ('Peça de aceleração Dafra.', 55.8),
      785642: ('Peça de frenagem Honda.', 145.98)
    }

    while True: # faz um loop, enquanto não for digitado um número de peça válido
        numero_peca = int(input('\n\nPor gentileza, informe o número da peça: '))
        if numero_peca in pecas:
            descricao, preco = pecas[numero_peca]
            break # sai do while True
        else:
            print(f'Peça {numero_peca} não existe, digite novamente')

    qtd_peca = int(input('Por gentileza, informe a quantidade desejada: '))
    return (qtd_peca, numero_peca, descricao, preco)

# função recebe como parâmetros as tuplas retornadas pelas 2 funções acima
def imprimir_nota(cliente, peca):
    print('\n\n..::NOTA FISCAL::..')
    print('LOJA DE PEÇAS EM GERAL')
    print('CNPJ: 40.769.710/0001-03')
    print('\nCliente: {}'.format(cliente[0]))
    print('CPF: {}'.format(cliente[1]))
    print('Telefone Celular: {}'.format(cliente[2]))

    # eu também poderia fazer format(peca[0], peca[1], peca[2], peca[3]) em vez de format(*peca)
    # coloquei :.2f no preço para sempre imprimir com 2 casas decimais
    print('Quantidade do produto: {}    Código do produto: {}    Descrição do produto: {}    Preço unitário: {:.2f}'.format(*peca))

cliente = dados_cliente() # obter os dados retornados pela função
peca = dados_peça() # obter os dados retornados pela função

# passar os dados obtidos pelas funções anteriores para a função imprimir_nota
imprimir_nota(cliente, peca)
  • 1

    Wow, thank you! It was VERY enlightening, and I still managed to learn new things. Vlw!

Browser other questions tagged

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