Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

extrair valor atribuído a variável em função dentro de função

Boa tarde,

Visando utilizar os conhecimentos adquiridos até então, comecei a montar um programa onde foi necessário ter uma função dentro de outra função (Na figura abaixo, as funções atuacao_usuário() e lotacao() no circulo amarelo estão dentro da funçao cadastrar_usuário. Contudo, na hora de imprimir (círculo vermelho) os valores das variáveis geradas pelas funções internas (geradas pelo comando "input") dentro da função externa (cadastrar_usuário() ), aparece a mensagem de erro em verde ("variável" "is not defined"). Como faço para extrar os valores gegistrados nas funções internas no comando da função externa? Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas
solução!

Olá William, tudo bem com você?

O comportamento apresentado ocorre porque as variáveis lotacao e meio_atuacao são definidas dentro das funções internas lotacao_usuario() e atuacao_usuario(), e não estão disponíveis no escopo da função externa cadastrar_usuario(). Para resolver isso, basta retornar os valores dessas variáveis usando a cláusula return e atribuí-los a novas variáveis dentro da função cadastrar_usuario().

Aqui está um exemplo de como você pode fazer isso, deixei o código simplificado por não ter acesso ao projeto completo:

Exemplo para a função lotacao_usuario

def lotacao_usuario():
    # Seu código atual
    # ...
    return lotacao  # Retorne a variável lotacao

Exemplo para a função atuacao_usuario

Nessa função, ao invés de fazer o uso da função print() dentro das validações if e elif, basta retornar o valor presente na variável meio_atuacao, como no exemplo simplificado abaixo:

def atuacao_usuario():
    meio_atuacao = int(input('Informe seu meio de atuação: '))
    # Seu código atual
    # ...
    if (meio_atuacao == 5):
        meio_atuacao = ("Análise de Riscos")
        return meio_atuacao # Retorne a variável meio_atuacao
    elif (meio_atuacao == 6):
        meio_atuacao = ("Não se aplica")
        return meio_atuacao # Retorne a variável meio_atuacao
    else:
        opcao_invalida()

Por fim, na função cadastrar_usuario, basta chamar as funções lotacao_usuario e atuacao_usuario e atribuir seu retorno as variáveis lotacao e meio_atuacao, como apresentado abaixo:

def cadastrar_usuario():
    nome_usuario = input('Informe seu nome: ').strip().title()
    email_usuario = input('Informe seu e-mail: ').strip().title()
    
    lotacao = lotacao_usuario()  # Chame a função e atribua o valor retornado
    meio_atuacao = atuacao_usuario()  # Chame a função e atribua o valor retornado
    
    print('Parabéns, seu cadastro foi registrado os seguintes dados: Seu nome: {}, seu e-mail: {}, sua lotação - {} e, sua área de atuação como: {}.'.format(nome_usuario, email_usuario, lotacao, meio_atuacao))

# Teste a função principal
cadastrar_usuario()

Exemplo de execução:

Imagem com o resultado da execução do código acima.

Com essas mudanças, as variáveis lotacao e meio_atuacao serão definidas no escopo da função cadastrar_usuario() e estarão disponíveis para uso na função print. Após realizar as modificações acima, salve o arquivo e execute-o novamente.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Boa noite professor Rafael Rocha. Funcionou sim, obrigado. Mas gerou um segundo problema. Para a opção de lotação que eu fiz essa alteração sugerida (opção 2), aparece duas vezes no terminal as opções de seleção implementadas (unidade e estado). A alteração ficou da seguinte forma: Alteração realizada no ciclo vermelho resolveu o problema inicial. Mas agora a seleção de unidade e estado para a opção 2 aparece duas vezes no terminal.

Olá Wiliam,

O novo comportamento apresentado, onde a seleção de unidade de lotação e estado de lotação, é chamada duas vezes, está ocorrendo devido à chamada duplicada das funções unidade_lotacao e estado_lotacao dentro da estrutura condicional elif lotacao == 2: Quando estamos atribuindo o retorno de uma função a uma variável não é necessário realizar a chamada da função antes da sua atribuição, pois, quando realizamos a atribuição a função é chamada automaticamente. Basta usarmos o código da seguinte forma:

unidade = unidade_lotacao()
estado = estado_lotacao()

Para corrigir o seu código, basta apagar a primeira chamada das funções unidade_lotacao e estado_lotacao dentro da estrutura condicional elif lotacao == 2:, deixando o código como apresentado abaixo:

elif lotacao == 2:
    unidade = unidade_lotacao()
    estado = estado_lotacao()
    lotacao = unidade, estado
    return lotacao

Após realizar as modificações acima, salve o arquivo e execute-o novamente.

Fico à disposição. Abraços e bons estudos!

Boa noite Rafael, Deu certo, muito obrigado.