1
resposta

Qual o problema do código

Fala galera, estou tentando colocar todo o programa dentro de funções mas está dando erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade Da mesma forma se eu coloco o qtd dentro de uma def e chamo essa def dentro do "programa_princ()" dá erro. Não tem como chamar uma uma função dentro da outra?

1 resposta

Oi, Fabio! Tudo bem?

O erro ocorre devido à chamada recursiva da função main() dentro do bloco except da função programa_princ(), que acaba causando um loop infinito de chamadas entre main() e programa_princ() sempre que uma exceção é capturada, até que a profundidade máxima de recursão do Python seja excedida e um erro seja lançado.

Além disso, há um problema de escopo com a variável qtd, que é definida fora das funções e depois usada dentro da função programa_princ(), mas sem ser passada como argumento. Isso pode causar um erro de NameError se tentarmos chamar programa_princ() de um contexto onde qtd não está definida.

Devido a isso, podemos resolver esses problemas da seguinte forma:

  1. Evitaremos chamar main() dentro do bloco except, em vez disso, podemos usar um loop while na função main() para repetir a solicitação de dados até que sejam válidos.
  2. Passaremos qtd como um argumento para a função programa_princ() para garantir que ela tenha acesso a essa variável.

Podemos, então, reestruturar nosso código da seguinte forma:

def titulo():
    print('Bem vindo!!! Prossiga para calculo de média ')

def programa_princ(qtd):
    media_list = []
    try:
        for c in range(qtd):
            num = int(input('Informe um número: '))
            media_list.append(num)
        soma = sum(media_list)
        media = soma / len(media_list)
        print(f'A média dos números escolhidos é: {media}')
    except ValueError:
        print('Ops! Valor inválido!!!')

def main():
    titulo()
    qtd = int(input('Informe a quantidade de números deseja inserir: '))
    programa_princ(qtd)

if __name__ == "__main__":
    main()

Note que agora qtd é passada como parâmetro para programa_princ(qtd). Além disso, removi a chamada recursiva para main() no bloco except e substituí por uma mensagem de erro. Isso vai evitar o loop infinito e a exceção de máxima profundidade de recursão.

Espero ter ajudado! Caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software