1
resposta

Função precisa ficar no topo?

No curso, o professor informa que as funções deveriam funcionar independendo da ordem no código mas comigo não acontece da mesma forma, se desco as funções para a parte inferior (depois da função principal) o código da erro, quando retorno elas ao começo o código é interpretado normalmente. Como faço?

1 resposta

Desconsidere a informação como uma verdade absoluta. Em regra deve-se declarar as coisas antes de efetuar a chamada delas.

O que ocorreu é uma manobra onde ele utiliza if __name__ == '__main__': no final no código abaixo de TUDO, para fazer a chamada de uma função que vamos chamar de "principal" que será executada assim que o módulo for executado diretamente no terminal. Acontece que fazendo isso, TODO o código do módulo (arquivo.py) é lido e carregado pelo interpretador, logo, quando a "função principal" for iniciada, toda função que ela chamar que tiver sido declarada depois da chamada, será executada normalmente como se tivesse sido declarada antes... Vou exemplificar no código abaixo:

def principal():
    print('Função principal')

    funcao_declarada_depois()  # chamamos uma função que tecnicamente não existe "ainda"


def funcao_declarada_depois():  # declaramos a função depois da chamada
    print('Função declarada depois foi chamada')

if __name__ == '__main__':
    principal()  # iniciamos a função principal

Quando você executar esse módulo no terminal, o interpretador irá ler todo o arquivo até á última linha onde nós chamamos a função principal(), nesse momento ele já saberá o que é a funcao_declarada_depois(), mesmo ela sendo chamada "antes" da declaração. Vou lhe provar isso adicionando uma pequena modificação abaixo:

def principal():
    print('Função principal')
    print(f'id funcao_declarada_depois: {funcao_declarada_depois}')  #  aqui vamos mostrar a posição da função_declarada_depois() na memória
                                                                    #  que deveria ser nula, já que tal função sequer foi declarada "ainda", correto?
                                                                    #  Errado! o interpretador python já leu todo o código e já alocou ela em um lugar da 
                                                                    #  memória
    funcao_declarada_depois()


def funcao_declarada_depois():
    print('Função declarada depois foi chamada')

if __name__ == '__main__':
    principal()

Portanto, na prática, é como se tudo o que estivesse declarado acima da chamada de principal() fosse exatamente isso, declarado ANTES. E por isso funciona.