Olá! Esta é uma rápida introdução à programação em Python, que lhe servirá de base enquanto percorre os 12 Passos para Navier-Stokes.
Existem duas maneiras para você aproveitar estas lições com Python:
Você pode baixar e instalar a distribuição de Python no seu computador. Existe uma distribuição grátis Anaconda Scientific Python. E outra Canopy, que é grátis para fins acadêmicos. Nossa recomendação é Anaconda.
Você pode executar Python na nuvem (nenhum software precisa ser instalado) usando Binder ou Research Colab, o último requer um conta Google.
Em qualquer caso, você provavelmente queira baixar uma cópia desse notebook, ou de toda a coleção 12 Passos para Navier-Stokes. Recomendamos que você siga cada lição experimentando o código no notebook, ou digitando o código em uma seção interativa Python separada.
Se você decidir trabalhar em uma instalação Python local, use o terminal para navegar até o diretório que contenha os arquivos .ipynb
. Então lance o servidor notebook digitando:
python notebook
Uma nova janela ou aba será aberta em seu navegador, com a lista de notebooks disponíveis no diretório. Clique em uma e começa a trabalhar!
Python é uma linguagem de programação de código aberto e de alto nível. Além disso, o mundo Python é habitado por diversos pacotes, ou bibliotecas, que nos fornecem ferramentas úteis, tais como operações com arranjos, ferramentas gráficas, e muito mais. Nós podemos importar estas bibliotecas de funções para expandir a capacidade do Python em nossas aplicações.
Muito bem! Vamos começar importando algumas bibliotecas que irão nos ajudar. Primeiramente: nossa biblioteca preferida é NumPy, que fornece uma série utilidades para manipulação de arranjos multidimensionais (similar ao MATLAB). Nós vamos a utilizar constantemente! A segunda biblioteca que precisamos é Matplotlib, uma biblioteca para produção de gráficos, que usaremos para apresentar nossos resultados. O seguinte bloco de código estará no cabeçalho da maioria dos nossos programas, então, execute esta célular primeiro:
# <-- comentários em Python são indicados pelo jogo da velha, igual a esse
import numpy # importamos a biblioteca de arranjos
from matplotlib import pyplot # importamos a biblioteca gráfica
Nós importamos uma biblioteca denominada numpy
e o módulo pyplot
de uma grande biblioteca denominada matplotlib
.
Para usar uma função pertencente a uma destas bibliotecas, nós temos que informar ao Python onde procurar por ela. Para isso, o nome de cada função é escrito seguindo o nome da biblioteca que a contem, com um ponto entre eles.
Então, se queremos usar a função Numpy linspace(), que cria um arranjo com números de espaçamento constante entre start
e end
, nós a invocamos escrevendo:
myarray = numpy.linspace(0, 5, 10)
myarray
array([0. , 0.55555556, 1.11111111, 1.66666667, 2.22222222, 2.77777778, 3.33333333, 3.88888889, 4.44444444, 5. ])
Se não precedermos a função linspace()
com numpy
, Python irá exibir uma mensagem de erro.
myarray = linspace(0, 5, 10)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-3-14f926e9cd07> in <module> ----> 1 myarray = linspace(0, 5, 10) NameError: name 'linspace' is not defined
A função linspace()
é muito útil. Tente mudar os parâmetros de entrada da função!
Estilos de importação:
Você verá frequentemente trechos de código com as seguintes linhas
import numpy as np
import matplotlib.pyplot as plt
Mas qual a ideia envolvida com import as
? Esta é uma maneira de criar um atalho para a biblioteca Numpy e para o módulo pyplot. Você verá isso frequentemente como prática comum, mas nós preferimos manter as importações explícitas. Acreditamos que isso ajuda na legibilidade do código.
Dica de especialista:
Algumas vezes você verá pessoas importanto uma biblioteca completa sem designar nenhum atalho para ela (from numpy import *
, por exemplo). Isso é uma economia em digitação, entretanto, isso pode ser traiçoeiro e lhe colocar em problemas. O melhor é desenvolver bons habitos desde o início.
Para aprender novas funções disponíveis para você, visite a página NumPy Reference. Se você é um usuário com experiência em Matlab
, existe uma página wiki que pode ser muito útil para você: NumPy for Matlab Users.
Python não demanda que as variáveis sejam explicitamente declaradas, como acontece em C, Fortran e outras linguagens.
a = 5 #a é um inteiro 5
b = 'cinco' #b armazena os carcteres da palavra 'cinco'
c = 5.0 #c é um número em ponto flutuante 5
type(a)
int
type(b)
str
type(c)
float
Note que se você dividir um inteiro por outro e a operação apresentar um resto, o resultado será convertido para float (isso é diferente do comportamento no Python 2.7, fique atento).
Python utiliza indentação e espaços em branco para delimitar regiões compreendidas em um bloco de código. Para escrever um laço em C, você usaria:
for (i = 0, i < 5, i++){
printf("Hi! \n");
}
Python não precisa de delimitações por colchetes, de modo que o mesmo procedimento em Python é escrito como:
for i in range(5):
print("Hi \n")
Hi Hi Hi Hi Hi
Para o caso de laços aninhados, basta acrescentar uma indentação extra para o laço interno.
for i in range(3):
for j in range(3):
print(i, j)
print("Esta frase está no laço i, mas não no laço j")
0 0 0 1 0 2 Esta frase está no laço i, mas não no laço j 1 0 1 1 1 2 Esta frase está no laço i, mas não no laço j 2 0 2 1 2 2 Esta frase está no laço i, mas não no laço j
Com NumPy, você pode olhar para porções individuais de um arranjo de maneira análoga ao efetuado com Matlab
, mas com alguns truques extras disponíveis. Vamos partir de um arranjo com valores de 1 a 5.
myvals = numpy.array([1, 2, 3, 4, 5])
myvals
array([1, 2, 3, 4, 5])
Python emprega indexação baseada em zero, então vamos observar o primeiro e último elemento no arranjo myvals
myvals[0], myvals[4]
(1, 5)
Existem 5 elementos no arranjo myvals
, mas se tentarmos acessar myvals[5]
, teremos um erro, uma vez que myvals[5]
está de fato tentando acessar o sexto elemento do arranjo, que nem sequer existe.
myvals[5]
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-12-ec3139020744> in <module> ----> 1 myvals[5] IndexError: index 5 is out of bounds for axis 0 with size 5
Arranjos também podem ser fatiados para um intervalo de valores. Vamos ver os primeiros três elementos
myvals[0:3]
array([1, 2, 3])
Perceba que a fatia inclui a marcação inicial, mas exclui a final, de modo que o comando acima retorno os valores para myvals[0]
, myvals[1]
e myvals[2]
, mas não inclui myvals[3]
.
A atribução e comparação de valores em arranjos são capacidades do Python que podem confundir usuarios iniciantes. Temos que um exemplo, considerando um arranjo 1D denominado $a$:
a = numpy.linspace(1,5,5)
a
array([1., 2., 3., 4., 5.])
Certo, então temos um arranjo $a$, com valores de 1 ao 5. Eu quero fazer uma cópia desse arranjo, denominando $b$, então vou tentar o seguinte
b = a
b
array([1., 2., 3., 4., 5.])
Ótimo. Então $a$ possui os valores de 1 ao 5, assim como $b$. Agora que temos uma cópia de $a$, podemos alterar seus valores sem preocupação de perder os dados (ou foi o que pensei!).
a[2] = 17
a
array([ 1., 2., 17., 4., 5.])
Aqui, o terceiro elemento de $a$ foi alterado para 17. Agora vamos conferir $b$.
b
array([ 1., 2., 17., 4., 5.])
E é aqui que as coisas deram errado! Quando usamos uma definição como $a = b$, ao invés de copiar todos os valores de $a$ para $b$, Python criou apenas um pseudônimo (alias, ou apontador) chamado $b$ e indicou para ele ser uma rota para $a$. Então, ao mudarmos um valor em $a$, a mudança será prontamente refletida em $b$ (isso é chamado tecnicamente de designação por referência). Para efetivamente criar uma cópia de um arranjo, você precisa informar ao Python para copiar todos os elementos de $a$ para um novo arranjo. Vamos chama-lo de $c$.
c = a.copy()
Agora, podemos alterar novamente um valor em $a$ e ver se isso também se reflete em $c$.
a[2] = 3
a
array([1., 2., 3., 4., 5.])
c
array([ 1., 2., 17., 4., 5.])
Certo, funcionou! Se a diferença entre a = b
e a = b.copy()
não ficou clara para você, recomendamos que leia esta etapa novamente. Caso contrário esse problema pode voltar para atormentá-lo.
Existem muitos recursos disponíveis online para você aprender mais sobre Numpy e outras bibliotecas. Para leitura complementar em português, recomendamos que você acesse Aprenda.py. Ou proceda para o Passo 1.
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.