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 Lorena A. Barba, Gilbert F. Forsyth em 2017, traduzido por Felipe N. Schuch em 2020.
@LorenaABarba - @fschuch
Essa tarefa é um complemento para as aulas do primeiro módulo interativo online CFD com Python, por Prof. Lorena A. Barba, denominado 12 Passos para Navier-Stokes. Esse notebook foi escrito pelo estudante de graduação Gilbert Forsyth. Agora, apresentamos algumas novas maneiras de fazer as mesmas coisas, dessa vez mais eficientes e produzem código mais bonito.
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:
def 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.
def simpleadd(a, b):
return a+b
A instrução return
diz ao Python quais dados retornar em resposta à chamada. Agora podemos chamar nossa função simpleadd
:
simpleadd(3, 4)
7
Obviamente, pode haver muito mais a acontecer entre a linha def
e a linhareturn
. 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.
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)
13
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:
for n in range(11):
print(n, fibonacci(n))
0 0 1 1 2 1 3 2 4 3 5 5 6 8 7 13 8 21 9 34 10 55
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
def 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
#Na ausência do argumento, n assumirá
#o valor padrão, nesse caso n=10
fibonacci()
55
Em segundo lugar, o bloco comentado logo à seguir da definição:
'''
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
:
help(fibonacci)
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
Lembra do nosso breve desvio ao Operações com arranjos em NumPy?
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 (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) e faz um uso de funções definidas.
Mas uma nova maneira recente de obter códigos Python rápidos é Numba. 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!
from IPython.core.display import HTML
def css_styling():
styles = open("../styles/custom.css", "r").read()
return HTML(styles)
css_styling()
A célula acima executa o estilo para esse notebook. Nós modificamos o estilo encontrado no GitHub de CamDavidsonPilon, @Cmrn_DP.