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.