<jupyter_start><jupyter_text>> Texto fornecido sob a Creative Commons Attribution license, CC-BY. Todo o código está disponível sob a FSF-approved BSD-3 license.> (c) Original por <NAME>, <NAME> em 2017, traduzido por <NAME> em 2020.> [@LorenaABarba](https://twitter.com/LorenaABarba) - [@fschuch](https://twitter.com/fschuch) 12 passos para Navier–Stokes======*** Essa tarefa é um complemento para as aulas do primeiro módulo interativo online [CFD com Python](https://github.com/fschuch/CFDPython-BR), por Prof. <NAME>, denominado **12 Passos para Navier-Stokes**. Esse notebook foi escrito pelo estudante de graduação <NAME>. Agora, apresentamos algumas novas maneiras de fazer as mesmas coisas, dessa vez mais eficientes e produzem código mais bonito. Definindo Funções em Python---- Nas etapas de 1 a 8, escrevemos o código Python que deve ser executado de cima para baixo. Conseguimos reutilizar o código (com grande efeito!), copiando e colando, para construir gradualmente um solucionador para a equação de Burgers. Mas, avançando, existem maneiras mais eficientes de escrever nossos códigos Python. Nesta lição, introduziremos *definições de função*, que nos permitirão mais flexibilidade na reutilização e também na organização do nosso código.Começaremos com um exemplo trivial: uma função que adiciona dois números.Para criar uma função no Python, começamos com o seguinte:```pythondef simpleadd(a,b):```Esta declaração cria uma função chamada `simpleadd` que recebe duas entradas,` a` e `b`. Vamos executar esse bloco de definição.<jupyter_code>def simpleadd(a, b):
    return a+b<jupyter_output><empty_output><jupyter_text>A instrução `return` diz ao Python quais dados retornar em resposta à chamada. Agora podemos chamar nossa função `simpleadd`:<jupyter_code>simpleadd(3, 4)<jupyter_output><empty_output><jupyter_text>Obviamente, pode haver muito mais a acontecer entre a linha `def` e a linha` return`. Dessa maneira, pode-se criar código de maneira *modular*. Vamos tentar uma função que retorna o n-ésimo número na sequência de Fibonacci.<jupyter_code>def fibonacci(n=10):
    '''
    Essa função retorna o n-ésimo número
    na sequência de Fibonacci.
    
    Por padrão: n=10
    '''
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a
fibonacci(7)<jupyter_output><empty_output><jupyter_text>Uma vez definida, a função `fibonacci` pode ser chamada como qualquer uma das funções internas do Python que já usamos. Por exemplo, podemos imprimir a sequência de Fibonacci através do valor `n`-ésimo:<jupyter_code>for n in range(11):
    print(n, fibonacci(n))<jupyter_output>0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55<jupyter_text>Usaremos a capacidade de definir nossas próprias funções no Python para nos ajudar a criar código mais fácil de reutilizar, mais fácil de manter, mais fácil de compartilhar! **Nota:** Nossa função didática demonstra também dois conceitos de boas práticas em Python. Primeiro, quando na primeira linha dizemos```pythondef fibonacci(n=10):```o `n=10` representa um valor padrão para o argumento, que será empregado na ausência do mesmo, de modo que<jupyter_code>#Na ausência do argumento, n assumirá
#o valor padrão, nesse caso n=10
fibonacci()<jupyter_output><empty_output><jupyter_text>Em segundo lugar, o bloco comentado logo à seguir da definição:```python    '''    Essa função retorna o n-ésimo número    na sequência de Fibonacci.        Por padrão: n=10    '''```fornece uma breve discrição do que a função faz, quais são seus argumentos de entrada e qual o seu retorno. Essa documentação é uma boa prática, que pode facilmente ser acessada com o comando `help`:<jupyter_code>help(fibonacci)<jupyter_output>Help on function fibonacci in module __main__:

fibonacci(n=10)
    Essa função retorna o n-ésimo número
    na sequência de Fibonacci.
    
    Por padrão: n=10<jupyter_text>Material Complementar-----*** Lembra do nosso breve desvio ao [Operações com arranjos em NumPy](./07_Passo_5.ipynb)?Bem, existem mais algumas maneiras de fazer seus códigos científicos em Python rodarem mais rápido. Recomendamos o artigo no blog Technical Discovery sobre [Speeding Up Python](http://technicaldiscovery.blogspot.com/2011/06/speeding-up-python-numpy-cython-and.html) (20 de junho de 2011), que fala sobre NumPy, Cython e Weave. Ele usa como exemplo a equação de Laplace (que resolveremos no [Passo 9](./12_Passo_9.ipynb)) e faz um uso de funções definidas.Mas uma nova maneira recente de obter códigos Python rápidos é [Numba](http://numba.pydata.org). Aprenderemos um pouco sobre isso depois de concluir os **12 Passos para Navier – Stokes**.Há muitas coisas interessantes acontecendo no mundo do Python de alto desempenho nesse momento!***<jupyter_code>from IPython.core.display import HTML
def css_styling():
    styles = open("../styles/custom.css", "r").read()
    return HTML(styles)
css_styling()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08301119023397761, 'fraction_numerical': 0.017497456765005085, 'mean_word_length': 4.9878197320341044, 'pattern_counts': {'":': 0, '<': 32, '<?xml version=': 0, '>': 35, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '663303', 'license': 'CC-BY-3.0', 'n_tokens_mistral': 1788, 'n_tokens_neox': 1691, 'n_words': 621, 'path': 'tarefas/11_Definindo_Funcoes_em_Python.ipynb', 'repo_name': 'fschuch/CFDPython', 'size': '4964'}