Você está na página 1de 45

Introduo linguagem

de programao Python

Com aplicaes ao clculo cientco

Joo Lus Silva

Setembro/2008
Contedo

1 Introduo 1
1.1 Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2 Ambientes de desenvolvimento integrados . . . . . . . . . . . . . 2

1.3 Modo interactivo . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2 Introduo programao 5
2.1 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.1.1 Valores numricos . . . . . . . . . . . . . . . . . . . . . . 6

2.1.2 Cadeias de caracteres . . . . . . . . . . . . . . . . . . . . 6

2.1.3 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.1.4 Tuplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.1.5 Dicionrios . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3 Instrues de controlo do uxo do programa 10


3.1 Condies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.2 Blocos de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.3 Decises: if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.4 Executar um bloco de cdigo um dado nmero de vezes: for . . . 12

3.4.1 A funo range . . . . . . . . . . . . . . . . . . . . . . . . 12

3.5 Executar um bloco de cdigo enquanto uma condio for verda-


deira: while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.6 As instrues break e continue . . . . . . . . . . . . . . . . . . . 13

4 Estruturao e organizao do cdigo 14


4.1 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4.1.1 Funes base do Python . . . . . . . . . . . . . . . . . . . 15

4.2 Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4.3 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

5 Operaes de entrada / sada 20

6 Controlo de erros 22

i
Contedo

7 A biblioteca padro 23
7.1 Os mdulos math e cmath . . . . . . . . . . . . . . . . . . . . . . 23
7.2 O mdulo sys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.3 O mdulo os . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
7.4 O mdulo csv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

8 Python e clculo numrico 25


8.1 Numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
8.1.1 Diferenas nitas . . . . . . . . . . . . . . . . . . . . . . . 26
8.2 Scipy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
8.2.1 optimize . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
8.2.2 stats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
8.2.3 linalg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
8.2.4 signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
8.2.5 tpack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
8.2.6 integrate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
8.2.7 outras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
8.3 VPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
8.3.1 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.3.2 Objectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.4 matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.4.1 plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.4.2 subplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.4.3 hist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
8.4.4 scatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
8.4.5 imshow . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
8.5 Armazenamento de dados de simulaes . . . . . . . . . . . . . . 39
8.5.1 Acesso a cheiros netCDF com o ScienticPython . . . . . 40

9 Concluso 42

ii
Captulo 1
Introduo

O Python uma linguagem de programao de alto nvel criada por Guido Van
Rossum, cuja primeira verso foi publicada em 1991. O Python suporta vrios
paradigmas de programao, como a programao estruturada, a programao
orientada a objectos e tambm alguns elementos da programao funcional,
mas nenhuma destas escolhas imposta ao utilizador, sendo possvel utilizar o
paradigma que se achar mais adequado. As principais vantagens de usar Python
so:

A qualidade do cdigo: A sintaxe do Python facilita e encoraja a legibili-


dade do cdigo, o que o torna mais fcil de manter e reutilizar.

A produtividade do programador: mais rpido desenvolver um mesmo


cdigo em Python do que noutras linguagens como o C, C++ ou Java.
O cdigo mais compacto, requerendo menos linhas, e no necessita da
declarao prvia do tipo das variveis. Para alm disso, no requer um
ciclo de compilao, podendo o programa ser executado imediatamente.

A portabilidade: Muitos programas Python correm sem qualquer alterao


em vrias plataformas como o Linux e o Windows.

Uma vasta biblioteca padro

A linguagem Python referida usualmente como uma linguagem de scripting


pois usualmente aplicada nessas tarefas, mas no existe uma diferena de
fundo entre um script e um programa, sendo o primeiro entendido como um
programa simples. Um uso comum do Python o de servir de linguagem de
controlo de componentes escritos noutra linguagem (como o C++), no entanto o
Python no est limitado a tarefas simples, podendo ser usado em programas de
qualquer dimenso. Uma possvel desvantagem do Python em relao a outras
linguagens de programao compiladas a velocidade de execuo, o que dadas
as capacidades dos computadores actuais no um problema para a maior parte
dos programas. Para os programas em que essa diferena importante, sem-
pre possvel desenvolver a maior parte do programa em Python suplementado
por um mdulo chamado a partir do Python e desenvolvido noutra linguagem.

1
1 Introduo

No caso particular das simulaes numricas utilizam-se usualmente mdulos


externos distribuio Python base, como o numpy e scipy.

O stio www.python.org contm vasta documentao (sobretudo em ingls)


acerca do Python, para todos os nveis de utilizadores. O nome da linguagem,
Python, deve-se ao seu criador ser um f da srie televisiva da BBC Monty
Python Flying Circus.

1.1 Instalao

As distribuies do sistema operativo Linux j incluem o interpretador de lin-


guagem Python, embora algumas bibliotecas que iremos utilizar no sejam ins-
taladas por defeito. No sistema operativo Windows pode instalar a distribuio
ocial, de http://www.python.org/, e acrescentar posteriormente os mdulos
em falta.

1.2 Ambientes de desenvolvimento integrados

Embora linguagem Python no imponha a utilizao de ferramentas especcas


para a criao de programas, vantajoso utilizar um ambiente de desenvol-
1
vimento integrado (IDE ) que suporte o Python. Entre as vrias escolhas de
programas gratuitos de cdigo aberto destacam-se:

IDLE - Integrated development for Python, que includo com a distri-


buio Python

Eric, disponvel em http://www.die-offenbachs.de/eric/index.html.

Pydev, que uma extenso ao IDE eclipse.

SPE, de Stani's Python Editor, disponvel em http://pythonide.stani.


be/.

1.3 Modo interactivo

A forma mais simples de experimentar o Python usar a linha de coman-


dos interactiva do Python. Alternativamente, pode-se usar o ipython (http:
//ipython.scipy.org/) que tem capacidades de edio e introspeco avana-
das, ou o modo imediato de um IDE Python. Usando o ipython:

1
Abreviatura de Integrated development environment

2
1 Introduo

Figura 1.1: O IDE SPE

$ ipython
Python 2.5.1 (r251:54863, Jul 10 2008, 17:24:48) Type "copyright", "credits" or
"license" for more information.
IPython 0.8.2  An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.
In [1]:

Na linha de comandos do ipython podemos introduzir qualquer comando


Python. Uma das caractersticas mais teis o auto-complete, isto , se a
seguir a um objecto escrevemos . e de seguida premir-mos o tab obtemos uma
lista das possibilidades

In [1]: import scipy


In [2]: scipy.
Display all 526 possibilities? (y or n)

Outra caracterstica importante a habilidade de ver a ajuda relativamente


a qualquer objecto:

In [1]: import scipy


In [2]: help(scipy)

e seria mostrada a documentao deste mdulo. Tambm podemos pedir


ajuda acerca de funes da prpria linguagem

3
1 Introduo

In [1]: help(open)
Help on built-in function open in module __builtin__:

open(...)
open(name[, mode[, buering]]) -> le object

Open a le using the le() type, returns a le object.

Ou ento podemos simplesmente usar o Python como uma calculadora avan-


ada
In [1]: import math
In [2]: (1+math.sqrt(5))/2.0
Out[2]: 1.6180339887498949
In [3]: 2**3
Out[3]: 8

Quando usado interactivamente, o interpretador mostra o resultado do co-


mando, por exemplo 2**3 imprime 8, mas isso no acontece quando est a
executar um cheiro Python, e nessa situao temos de usar a instruo print.

Listagem 1.1:

# * c o d i n g : l a t i n 1 *
#F i c h e i r o p r i n t . py
#O c a r d i n a l i n d i c a que o r e s t o da l i n h a um comentrio
#e s e r i g n o r a d o p e l o Python
print 2 ** 3 #Imprime 8

Para executar o cheiro print.py (listagem 1.1), numa linha de comandos:

$ python print.py
8
A primeira linha do programa (# -*- coding: latin-1 -*- ) necessria porque
este contm caracteres acentuados, e necessrio especicar como esto codi-
cados. As codicaes usuais so o latin-1 e utf-8. Se esta linha no estivesse
presente obteramos o erro:

$ python print.py
File "print.py", line 2
SyntaxError: Non-ASCII character '\xc3' in le t.py on line 2, but no encoding
declared; see http://www.python.org/peps/pep-0263.html for details

4
Captulo 2
Introduo programao

Os computadores que utilizamos normalmente seguem a arquitectura de Von


Neumann (ver Fig. 2.1) em que o processador executa um programa armazenado
na memria, podendo ler ou escrever dados nessa mesma memria e tambm
comunicar com os dispositivos de entrada e sada. As instrues executadas pelo
processador designam-se por cdigo mquina, sendo operaes muito simples,
como por exemplo ler ou escrever um valor de uma dada posio da memria,
somar dois nmeros ou mudar o ponto de execuo do programa para uma outra
posio se o resultado da operao anterior for zero. Cada uma destas opera-
es elementares identicada por um nmero, e quando aplicvel, seguem-se
os nmeros referentes aos parmetros passados a essa instruo. Como di-
fcil programar usando apenas nmeros criou-se uma representao intermdia
chama assembly, em que cada uma destas instrues agora representada por
uma mnemnica, e passa a ser necessrio converter desta representao mais
til para ns para os nmeros que o processador consegue executar usando um
programa chamado assembler. Apesar de o assembly ser mais fcil de utilizar,
ainda necessrio estar envolvido nos detalhes da mquina, sendo complexo es-
crever programas extensos, pelo que hoje em dia apenas utilizado em pequenas
rotinas que necessitem de um contacto mais prximo com o hardware.

Posteriormente foram desenvolvidas outras linguagens de programao que,


por comparao com o assembly, so linguagens de alto nvel, como o Fortran,
Pascal ou C, que utilizam abstraces mais prximas das usadas pelo homem,
mas que tal como a primeira tm de poder ser traduzidas de forma no ambgua
para cdigo mquina. A maior parte dos programas disponveis hoje em dia so
criados em linguagens deste tipo.

Neste curso vamos estudar a linguagem Python, que chamada de muito alto
nvel, pois utiliza abstraces ainda mais afastadas das utilizadas pelo proces-
sador, e que nos so mais prximas.

5
2 Introduo programao

Figura 2.1: A arquitectura de Von Neumann

2.1 Tipos de dados

2.1.1 Valores numricos


O Python suporta nmeros inteiros, reais e complexos, que podemos manipular
com as operaes aritmticas convencionais (ver Tab. 2.1). Por exemplo

Listagem 2.1:

n = 3 * 5 ** 2 # Varivel i nte ira


x = 3.14/2.0 # Varivel real
z = 1j # V a r i v e l complexa

Neste exemplo n = 3 52 = 75 e varivel z atribudo o valor da unidade


imaginria, que em Python representada por j, mas que tem sempre que se
seguir a um nmero para se distinguir da varivel j. As operaes que envol-
vam nmeros inteiros e reais retornam um resultado real e as que envolvam
dois inteiros devolvem um inteiro. Uma consequncia importante desta ltima
propriedade que o mesmo operador diviso efectua a diviso inteira para dois
valores inteiros, mas a diviso real quando um dos valores real.

Listagem 2.2:

print 1/3 #Imprime 0


print 1/3.0 #Imprime 0.333333333333
print 1.0/3.0 #Imprime 0.333333333333

Este comportamento vai mudar na verso 3.0 do Python, sendo ento o ope-
rador / sempre a diviso real, e utilizando // para a diviso inteira. Podemos
forar esse novo comportamento j na verso actual do Python se a primeira
linha do nosso programa for

Listagem 2.3:

from __future__ import division

2.1.2 Cadeias de caracteres


As cadeias de caracteres so delimitadas em Python por ` ou ". Por exemplo

Listagem 2.4:

s = " abcdef "


mensagem = ' Ol , Mundo ! '

6
2 Introduo programao

Operador Descrio

+ Soma
- Subtraco
* Multiplicao
/ Diviso (real ou inteira)
// Diviso inteira
** Elevar a uma potncia
% Mdulo (resto da diviso inteira)

Tabela 2.1: Operadores aritmticos

Estas cadeias de caracteres no podem ter mudanas de linha. Se for neces-


srio incluir mudanas de linha pode-se ou colocar explicitamente o cdigo de
mudana de linha \n ou usar aspas triplas """.

Listagem 2.5:

s2 = " Linha 1\ n L i n h a 2 "


mensagem_longa = " " "Ao iniciarmos uma cadeia de caracteres
com aspas triplas podemos usar mudanas de linha sem que
isso constitua um erro de s i n t a x e """

Podemos aceder a caracteres individuais ou seces de uma cadeia de carac-


teres usando a notao de parntesis rectos e sequncias:

Listagem 2.6:

s = " abcdef "


print len ( s ) #A f u n o l e n ( s ) d e v o l v e o tamanho de s ,
# neste caso 6
print s [0] #Imprime o p r i m e i r o c a r a c t e r de s , ' a '
print s [ 1] # n d i c e s n e g a t i v o s contam a p a r t i r do fim ,
#n e s t e c a s o ' f '

print s [2:4] #S e q u n c i a de n d i c e s , o p r i m e i r o 2 e
#menor que 4 (2 e 3 ) , n e s t e c a s o imprime ' cd '

A sintaxe geral de uma sequncia inicio:m:incremento, em que cada um


destes valores opcional.

Listagem 2.7:

s = " abcdef "


print s [::2] #Todos os e l e m e n t o s , incremento 2 ,
#imprime ' ace '

print s [:: 1 ] #Todos os e l e m e n t o s em ordem i n v e r s a ,


#imprime ' f e d c b a '

print s [3:] #I n c i o no n d i c e 3 , imprime ' d e f '

7
2 Introduo programao

Mtodo Descrio

insert(i,v) Insere o valor v na posio i


append(v) Acrescenta o valor v ao m da lista
remove(v) Remove da lista o primeiro item com valor v
pop() Retorna o ltimo valor da lista, removendo-o.
index(v) Retorna o ndice da primeira ocorrncia de v. Se no existir retorna um erro.
count(v) Nmero de vezes que v est na lista
sort() Ordena a lista
reverse() Inverte a ordem dos elementos da lista

Tabela 2.2: Mtodos das listas

print s [4:2] #I n c i o no n d i c e 4 , termina no 2 ,


#como no c o r r e s p o n d e a nenhum n d i c e
#p o s s v e l , r e t o r n a uma c a d e i a de
#c a r a c t e r e s v a z i a , ' '

Em Python as cadeias de caracteres so imutveis e embora possamos aceder


a caracteres individuais no os podemos alterar:

In [1]: s = abc
In [2]: s[0] = z
TypeError: 'str' object does not support item assignment
Podemos no entanto atribuir mesma varivel um novo valor construdo com
base no anterior:
In [1]: s = abc
In [2]: s = z + s[1:]
In [3]: print s
zbc

2.1.3 Listas
Uma lista um conjunto ordenado de objectos. Uma lista pode ser alterada,
inserindo, apagando ou substituindo um ou mais elementos. Em Python as
listas so delimitadas por parntesis rectos.

Listagem 2.8:

l = [ 3.1 4 , " pi " ,7]


print l [0] #Imprime 3 . 1 4
l [2] += 3 # Agora l [ 3 . 1 4 , " p i " , 1 0 ]

l . append ( 1 j ) #I n s e r e o nmero complexo 1 j


#no fim da l i s t a

As listas, tal como as cadeias de caracteres e tuplos suportam indexao


usando sequncias.

Listagem 2.9:

8
2 Introduo programao

l = [ 1 , "a" , 3 . 1 4 , 2 . 7 1 8 ]
print l [:2] #Imprime [ 1 , ' a ' ]

2.1.4 Tuplos
Os tuplos so sequncias ordenadas de objectos, semelhantes s listas, mas imu-
tveis. Os tuplos so delimitados por parntesis.

Listagem 2.10:

t = ( 1 , " abc " , 5 . 0 , 7 . 4 )


print t [1:3] #Imprime ( ' abc ' , 5 . 0 )
t2 = ( 1 0 , ) #Um t u p l o com apenas um e l e m e n t o

Para criar um tuplo com apenas um elemento necessrio por uma vrgula a
seguir esse elemento, de outra forma seria apenas um valor entre parntesis. Os
prprios parntesis so opcionais onde tal no ambguo:

Listagem 2.11:

a = 10
b = 20
a,b = b,a #Operao e n t r e t u p l o s , a p e s a r de no t e r
#p a r e n t e s i s . Agora a=20 e b=10

2.1.5 Dicionrios
Um dicionrio associa valores a chaves. As chaves tm de ser valores imutveis
(nmeros, cadeias de caracteres ou tuplos destes), sendo associadas um valor
que pode ser qualquer objecto Python.

Listagem 2.12:

d = {} #Um d i c i o n r i o v a z i o
d[1] = " abc " #A s s o c i a o v a l o r " abc " chave 1

Podemos ver quais so as chaves de um dicionrio com o mtodo keys()

Listagem 2.13:

d = { 1 : "um" , 2 : " d o i s " }


print d . k e y s ( ) #Imprime [ 1 , 2 ]
i f 2 in d :
print "O d i c i o n r i o tem a c h a v e 2, com o valor " ,d [ 2 ]

9
Captulo 3
Instrues de controlo do uxo do
programa

O uxo de execuo de um programa que normalmente segue de uma linha


para a seguinte pode ser alterado, executando um dado bloco apenas se uma
condio for verdadeira, ou executando repetidamente blocos de cdigo. Estas
operaes so realizadas com as instrues if, for e while. Antes de estudar
estas instrues necessitamos primeiro denir o que uma condio.

3.1 Condies

Em Python qualquer objecto pode ser testado para determinar se uma condi-
o verdadeira ou falsa. So condies falsas None, False, um valor numrico
nulo, uma lista, cadeia de caracteres, tuplo, ou dicionrio vazios. Os restantes
so verdadeiros. Estas condies podem ser combinadas com os operadores l-
gicos or (ou lgico), and (e lgico) e not (no lgico). O exemplo seguinte vai
imprimir a mensagem, pois uma lista vazia uma condio falsa, e negao de
uma proposio falsa uma proposio verdadeira.

Listagem 3.1:

lista = []
i f not l i s t a :
print "A lista est vazia "

3.2 Blocos de cdigo

As instrues if, while, for e def so seguidas por um bloco de cdigo. Em


Python, um bloco de cdigo um conjunto de uma ou mais linhas de cdigo
que esto espaadas da mesma forma a partir da margem esquerda. Isto ,
em Python o alinhamento do cdigo signicativo. Por exemplo o seguinte
programa vai falhar com um erro:

10
3 Instrues de controlo do uxo do programa

Operador Descrio

< Menor
> Maior
<= Menor ou igual
>= Maior ou igual
== Igual
!= Diferente

Tabela 3.1: Operadores lgicos

Listagem 3.2:

x = 5
if x <10:
x += 1
print "x foi incrementado "

File "bloco.py", line 4


print "x foi incrementado"
^ IndentationError: unexpected indent
A instruo print deveria estar alinhada com a anterior. Como neste ponto o
Python no espera um novo bloco falha com o erro IndentationError. impor-
tante espaar da mesma forma os blocos de cdigo, e a conveno recomendada
usar 4 espaos. Isto tornado mais fcil usando um editor que suporte as
convenes Python, o que assegura a uniformidade do cdigo. Se no estiver a
usar um editor que suporte estas convenes importante usar sempre 4 espaos
e no misturar espaos com tabulaes.
Como um bloco de cdigo tem de ter sempre pelo menos uma linha existe
uma instruo que no faz nada, pass. Desta forma, se por exemplo quisermos
deixar temporariamente um dado bloco vazio esta instruo satisfaz o requisito
de l ter pelo menos uma linha.

3.3 Decises: if

A instruo if permite-nos executar um bloco de cdigo se se vericar uma dada


condio.

Listagem 3.3:

if a>=b and a>=c :


print " a v a l o r mximo "
e l i f b>=a and b>=c :
print " b v a l o r mximo "
else :
print " c v a l o r mximo "

Este exemplo ilustra a sintaxe: Se a primeira condio da primeira linha for


verdadeira executado o primeiro bloco de cdigo. Uma instruo if pode ser

11
3 Instrues de controlo do uxo do programa

opcionalmente seguida por uma ou mais instrues elif, abreviatura de else


if , isto , se a condio do if inicial no for verdadeira ento executar o bloco
seguinte se esta nova condio se vericar. No nal, pode existir opcionalmente
uma clausula else, cujo bloco executado se nenhuma das outras condies
tiver sido vericada.

Listagem 3.4:

if x >=10:
print "x maior ou igual a 10 "
else :
print "x menor que 10 "

3.4 Executar um bloco de cdigo um dado nmero de


vezes: for

Quando queremos que um dado bloco de cdigo seja executado um nmero xo
de vezes (podendo esse nmero de vezes ser dado por uma varivel) utilizamos
a instruo for.

Listagem 3.5:

print "A t a b u a d a do 9 : "


f o r i in r a n g e ( 1 , 1 1 ) :
print " 9 * " , i , "=" , 9 * i

A sintaxe  for varivel in expresso:, em que expresso deve ser itervel.

3.4.1 A funo range


A funo range devolve uma lista com uma sequncia de inteiros. O valor
inicial por defeito zero, o valor de paragem tem sempre de ser especicado, e
por defeito o valor do incremento 1.

Listagem 3.6:

range (5) #D e v o l v e [ 0 , 1 , 2 , 3 , 4 ] . O v a l o r i n i c i a l
#zero , o incremento 1 .

range ( 2 , 4 ) #D e v o l v e [ 2 , 3 ] .
range ( 2 , 1 5 , 3 ) #D e v o l v e [ 2 , 5 , 8 , 11 , 1 4 ] .
#O v a l o r do incremento 3 .

range (5 ,0 , 1) #D e v o l v e [ 5 , 4 , 3 , 2 , 1 ] . O v a l o r do
#incremento pode s e r n e g a t i v o .

range (0 ,5 , 1) #D e v o l v e [ ] (uma l i s t a v a z i a ) .

12
3 Instrues de controlo do uxo do programa

3.5 Executar um bloco de cdigo enquanto uma


condio for verdadeira: while

A instruo while permite-nos repetir um bloco de cdigo enquanto uma con-


dio for verdadeira. Pode opcionalmente ser seguida de uma clausula else
que executada se o bloco dentro da instruo while no tiver sado devido
instruo break.

Listagem 3.7:

x = 10
while x >0:
i f x % 2 != 0: #Se x impar
print x ,
x = 1 #E q u i v a l e n t e a x = x 1

O programa anterior imprime 9 7 5 3 1.

3.6 As instrues break e continue

As instrues break e continue podem ser usadas dentro de ciclos for e while.
A instruo break causa uma sada imediata do ciclo, o continue interrompe
o processamento do resto do bloco de cdigo do ciclo, passando de imediato
prxima iterao.

13
Captulo 4
Estruturao e organizao do cdigo

Neste momento j vimos as instrues principais que constituem um programa,


mas se quisesse-mos aplicar as mesmas operaes em vrias partes do programa
teramos de as escrever de novo. Ora, no de todo isso que se deve fazer.
Vamos primeiro ver a estrutura mais simples, as funes.

4.1 Funes

Uma funo um bloco de cdigo ao qual so opcionalmente passados par-


metros e pode retornar um nico valor. Por exemplo podemos re-escrever o
exemplo anterior da tabuada como sendo

Listagem 4.1:

def tabuada ( n ) :
print "A t a b u a d a do " , n , " : "
f o r i in r a n g e ( 1 , 1 1 ) :
print n , " * " , i , "=" , n * i

tabuada ( 9 ) #Chama a f u n o t a b u a d a que


#acabamos de d e f i n i r para n=9

Uma funo denida pela instruo def, que seguida pelo nome da funo
e por parntesis, que contm a lista de parmetros. Opcionalmente uma funo
pode usar a instruo return, que termina a funo e retorna ao chamador. A
instruo return pode ser seguida de um valor, sendo esse o valor da chamada
da funo.

Listagem 4.2:

def soma ( a , b ) :
return a+b

c = soma ( 2 , 3 )
print soma ( " a b c " , " d e f " ) # Imprime a b c d e f

14
4 Estruturao e organizao do cdigo

Neste exemplo denimos uma funo que retorna a soma de dois nmeros,
sendo o resultado atribudo varivel c. Mesmo que uma funo retorne um
valor, no obrigatrio atribuir esse valor a uma varivel, podendo este ser
ignorado se assim o desejarmos. A funo soma no tem de ser usada apenas
com nmeros, mas pode receber qualquer tipo de dados que possam ser somados
com o operador + , como cadeias de caracteres.
primeira linha de denio de uma funo pode opcionalmente seguir-se
uma cadeia de caracteres. Nesse caso essa cadeia de caracteres a cadeia de do-
cumentao da funo (docstring). Essa cadeia de caracteres ento associada
prpria funo, e pode ser consultada usando os mecanismos de introspeco
do Python ou por programas (como IDEs) que as reconheam.

Listagem 4.3:

def soma ( a , b ) :
" " "A f u n o soma devolve a soma dos seus prametros """
return a+b

4.1.1 Funes base do Python


O Python tm algumas funes pr-denidas, que fazem parte da linguagem.
Estas incluem:

abs(x) - Retorna o valor absoluto de x

all(iteravel) - Retorna verdade se todos os elementos da expresso itervel


so verdadeiros.

any(iteravel) - Retorna verdade se algum dos elementos da expresso ite-


rvel for verdadeiro.

bool(x) - Converte x para booleano, isto , retorna True ou False de


acordo com as regras expostas na Sec. 3.1.

chr(x) - Retorna o caracter com cdigo ASCII x.

cmp(x,y) - Retorna um valor inteiro que negativo se x<y, zero se x=y e


positivo se x>y.

complex(s) - Converte a cadeia de caracteres s para um nmero complexo.

complex(re,im) - Retorna o nmero complexo re + 1j*im onde re e im so


nmeros reais.

dir(objecto) - O parmetro objecto opcional. Se for passado retorna


uma lista dos atributos vlidos do objecto (como funes e variveis), caso
contrrio retorna o contedo da tabela de smbolos local.

divmod(a,b) - Sendo a e b nmeros retorna um par de nmeros que so o


resultado da diviso inteira e o resto da diviso inteira de a por b.

15
4 Estruturao e organizao do cdigo

enumerate(iteravel) - Retorna um objecto itervel que vai devolver tuplos


com dois elementos, sendo o primeiro um valor que comea em zero e vai
sendo incrementado, o segundo o valor do iteravel que lhe foi passado
como argumento.

eval(expressao) - Avalia a expresso contida na cadeira de caracteres ex-


pressao. Por exemplo eval(2+3) retorna 5.

lter(f,iteravel) - Retorna uma lista constituda por todos os elementos de


iteravel para os quais a funo f retornou True.

oat(x) - Converte para nmero real o nmero ou cadeia de caracteres x.

globals() - Retorna um dicionrio contendo a tabela de smbolos global.

help() - Activa o sistema interactivo de ajuda. Se for passado um par-


metro, mostra ajuda acerca desse objecto.

hex(n) - Retorna uma cadeia de caracteres com a representao hexadeci-


mal do nmero inteiro n.

int(x) - Converte para inteiro o nmero ou cadeia de caracteres x.

len(s) - Retorna o tamanho da cadeia de caracteres, tuplo, lista ou dicio-


nrio s.

list(iteravel) - Retorna uma lista com todos os elementos de iteravel.

locals() - Retorna um dicionrio contendo a tabela de smbolos local.

map(f,iteravel1,...) - Recebe uma funo f e um ou mais iterveis. A fun-


o f tem de receber tantos parmetros quantos iterveis forem passados.
Retorna uma lista constituda pelo resultado de f aplicada aos elementos
dos iterveis.

max(iteravel) - Retorna o valor mximo de entre os elementos de iteravel.

max(valor1,valor2,...) - Quando a funo max() chamada com mais do


que um parmetro, devolve o mximo desses parmetros.

min() - Semelhante funo max(), mas retorna o valor mnimo.

open(cheiro,[modo]) - Abre um cheiro. Para mais detalhes ver o Cap.


5.

ord(c) - Retorna o cdigo ASCII ou cdigo Unicode do caracter c.

pow(x,y) - Retorna x elevado a y. Equivalente a x**y.

range() - Cria uma lista contendo uma sequncia. Para mais detalhes ver
a Sec. 3.4.1.

16
4 Estruturao e organizao do cdigo

raw_input(prompt) - Imprime prompt e devolve uma cadeia de caracteres


que leu da entrada padro, que normalmente o teclado. Esta funo
til para pedir valores ao utilizador.

reduce(f,iteravel) - Aplica a funo de dois parmetros f cumulativamente


aos valores de itervel, de forma a reduzir iteravel a um nico valor. Por
exemplo, usando a funo soma da Listagem 4.3, reduce(soma,[1,2,3,4])
retorna 10, pois primeiro chama a funo soma com 1 e 2, depois com 3 e
3, e nalmente com 6 e 4.

reload(modulo) - Volta a carregar o mdulo especicado. Ver a Sec. 4.2


para mais detalhes.

repr(x) - Retorna uma cadeia de caracteres com uma representao do


objecto x, que o mesmo que seria impresso com  print x.

reversed(seq) - Retorna um itervel constitudo pelos elementos de seq


pela ordem inversa.

round(x) - Arrendonda o valor real x. Opcionalmente pode receber um


segundo parmetro inteiro que indica o nmero de casas decimais a manter.

sorted(iteravel) - Retorna uma lista ordenada constituda pelos valores de


iteravel.

str(x) - Converte o objecto x para cadeia de caracteres.

sum(iteravel) - Retorna a soma dos valores de itervel.

tuple(iteravel) - Retorna um tuplo constitudo pelos elementos de iteravel,


mantendo a ordem destes.

unichr(n) - Retorna o caracter Unicode correspondente ao cdigo n.

xrange() - Semelhante a range, mas retorna um itervel e no uma lista,


e est optimizado para a velocidade e menor consumo de memria do que
o range(). A diferena entre o xrange() e o range() s importante para
sequncias com muitos elementos.

zip(iteravel1, iteravel2, ...) - Retorna uma lista de tuplos, em que o n-simo


elemento da lista consiste num tuplo dos n-simos valores dos iterveis.

4.2 Mdulos

Um mdulo simplesmente um cheiro com extenso .py que contem cdigo


Python. importante manter conjuntos lgicos de funes em mdulos dife-
rentes, no s por uma questo de organizao, mas por carem em espaos
de nomes (namespaces) diferentes. Isto , uma varivel global pertence ao
mdulo de onde foi denida, no interferindo com outros mdulos diferentes.
Em programas extensos essencial compartimentar as vrias partes, de forma
a limitar a sua complexidade.

17
4 Estruturao e organizao do cdigo

Podemos num dado mdulo aceder funcionalidade de outro com a instruo


import:

Listagem 4.4:

import s y s #Importa o mdulo da b i b l i o t e c a padro s y s


from math import s i n , s q r t #Importa as f u n e s s i n e
#s q r t do mdulo math
import numpy as np #Importa o mdulo numpy , mas
#passamos a r e f e r i l o como np
print sys . platform
print sqrt (25.0)
x = np . a r a n g e ( 0 . 0 , 1 0 . 0 , 0 . 1 ) #Funo arange do mdulo numpy

Ao usar a forma  import modulo1, para usar as variveis e mtodos de-


nidos no mdulo escrevemos modulo1.metodo ou modulo1.variavel. Na forma
 from modulo1 import func1,func2 ou  from modulo1 import * os mtodos
e variveis do modulo1 cam disponveis no mesmo espao de nomes que j esta-
mos. Se importar-mos desta forma uma funo ou varivel com o mesmo nome
de uma outra j existente s podemos aceder ltima que foi importada, per-
dendo o acesso que j existia. A instruo import tem vrias caractersticas
importantes:

Primeiro o mdulo tem de ser encontrado. Este procurado primeiro na


directoria actual do programa. Se no for encontrado de seguida procu-
rado nas directorias especicadas na varivel de sistema PYTHONPATH,
e no tendo sido encontrado procurado nas directorias que contm a
biblioteca padro do Python.

Se o mdulo for encontrado, vericado se existe uma verso compilada


(bytecode) do cdigo actual (cheiros .pyc). Se tal no se vericar, o
mdulo ento compilado, e o bytecode gerado guardado num cheiro
com extenso .pyc.

O mdulo ento executado, do incio at ao m, o que dene as funes


e variveis desse mdulo. Se houver o mdulo possuir instrues fora de
funes ou classes essas so tambm executadas.

Esta sequncia s ocorre na primeira que importarmos um mdulo num


programa. Se o mesmo mdulo for importado outra vez apenas utilizada
a cpia que j est em memria. Para forar a execuo de todos estes
passos podemos usar a funo reload (), que volta a carregar o mdulo
especicado.

4.3 Classes

A programao orientada a objectos (OOP) suportada em Python, sendo uma


classe criada com a instruo class. Apesar de a OOP ser opcional em Python,
importante estar familiarizado com este tipo de abordagem.

18
4 Estruturao e organizao do cdigo

Na sua forma mais simples uma classe apenas uma forma diferente de agru-
par dados com o cdigo que manipula esses dados:

Listagem 4.5:

# * c o d i n g : l a t i n 1 *
class Temperatura :
""" Converses de temperatura """
def __init__ ( s e l f , t e m p _ C e l s i u s = 0 . 0 ) :
s e l f . g r a u s _ C e l s i u s = temp_Celsius
def C2F ( s e l f , c ) :
""" Converte de graus Celsius para Fahrenheit """
return c * (9.0/5.0) + 32.0
def F2C ( s e l f , f ) :
""" Converte de graus Fahrenheit para C e l s i u s """
return (f 32)*(5.0/9.0)
def Fahrenheit ( s e l f ) :
return s e l f . C2F ( s e l f . g r a u s _ C e l s i u s )
def Celsius ( s e l f ):
return s e l f . graus_Celsius
def Kelvin ( s e l f ) :
return s e l f . graus_Celsius + 273.15

#Cria uma i n s t n c i a da c l a s s e Temperatura


temp1 = T e m p e r a t u r a ( 2 0 . 0 ) # 20 C
print temp1 . C e l s i u s ( ) , " C c o r r e s p o n d e m a " , \
temp1 . F a h r e n h e i t ( ) , " F e a " , temp1 . K e l v i n ( ) , "K"

Neste exemplo a classe Temperatura contem vrias funes, que na OOP so


chamadas de mtodos. Os mtodos de uma classe em Python tm obrigato-
riamente pelo menos um parmetro, a que por conveno se chama self que
recebe a instncia da classe que o chamou. Isto necessrio pois uma mesma
classe pode ter muitas instncias, cada uma com os seus valores, no existindo
assim ambiguidade entre as variveis da classe ou de uma instncia particular.
Uma classe pode ter um mtodo __init__ que chamado automaticamente a
quando da instanciao da classe. Se este mtodo tiver mais parmetros para
alm do self estes so recebidos dos argumentos que foram passados na criao
da instncia, neste exemplo 20.0.
Uma descrio pormenorizada de classes e OOP est fora do mbito deste
texto. Para mais detalhes consulte a documentao indicada no Cap. 9.

19
Captulo 5
Operaes de entrada / sada

Para abrir um cheiro, seja para leitura ou escrita usa-se a funo open(nome_cheiro,modo)
onde o primeiro parmetro o nome do cheiro, e o segundo o modo, r para
leitura, w para escrita (se o cheiro j existir apagado), a para acrescentar
informao a um cheiro existente.

Listagem 5.1:

f = o p e n ( " t e s t e . d a t " , "w" ) #Abre o f i c h e i r o t e s t e . d a t


#para e s c r i t a
f . w r i t e ( " t e s t e \n" )
f . close () #Fecha o f i c h e i r o

Um cheiro um objecto itervel, e podemos ler todas a linhas com um ciclo


for. O prximo exemplo escreve para o ecr o contedo do cheiro t.dat:

Listagem 5.2:

f = open ( " t . d at " , " r " )


for linha in f :
print l i n h a ,

f . close ()

O exemplo seguinte tabela a funo seno, escrevendo os resultados no cheiro


seno.dat, em duas colunas separadas por um tab:

Listagem 5.3:

import numpy as np

x = np . a r a n g e ( 0 . 0 , 1 0 . 0 , 0 . 0 5 )
y = np . s i n ( x )

f = o p e n ( " s e n o . d a t " , "w" )


n = len (x)
for i in range (n ) :

20
5 Operaes de entrada / sada

f . w r i t e ( "%g \ t%g \ n " % ( x [ i ] , y [ i ] ) )

f . close ()

A sintaxe formato % tuplo tem a mesma funcionalidade do printf da lin-


guagem C. O cdigo \t o tab e %g um formato para imprimir um nmero
real.

21
Captulo 6
Controlo de erros

Durante a execuo de um programa podem surgir erros, como por exemplo uma
diviso por zero. Estes erros so chamados de excepes. Se estas excepes
no forem interceptadas so reportados pelo Python e terminam a execuo do
nosso programa:

Listagem 6.1:

print 1/0

$ python erro.py
File "erro1.py", line 1, in <module>
print 1/0
ZeroDivisionError: integer division or modulo by zero
Neste caso despoletada a excepo ZeroDivisionError.

Listagem 6.2:

# * c o d i n g : l a t i n 1 *

def dividir (a , b ):
try :
return a / b
except Z e r o D i v i s i o n E r r o r :
return " D i v i s o p o r z e r o !"

print dividir (1 ,0)

Neste exemplo uma instruo que pode falhar est dentro uma instruo try
/ except, e ao vericar-se a excepo ZeroDivisionError em vez de o programa
falhar, a funo dividir retorna uma mensagem.

22
Captulo 7
A biblioteca padro

O Python uma linguagem com as pilhas includas no sentido em que inclui


uma extensa lista de mdulos. Vamos apenas apresentar aqui uma pequena
parte dos mdulos disponveis, para ver a lista completa consultar a Python
Library Reference em http://docs.python.org/lib/lib.html.

7.1 Os mdulos math e cmath

O mdulo math disponibiliza as operaes matemticas base, como as funes


trigonomtricas usuais (sin, cos, tan, asin, acos, atan, atan2), funes trigono-
mtricas hiperblicas (sinh, cosh, tanh), raiz quadrada (sqrt), exponenciao
(exp, pow ), logaritmos (log , log10), bem como as constantes e e pi.
O mdulo cmath semelhante ao math, mas enquanto que o math apenas
suporta nmeros reais, o cmath suporta nmeros imaginrios, pelo que

Listagem 7.1:

import math
import cmath

print math . s q r t ( 1 . 0 ) #Erro ValueError , p o i s no e x i s t e


#a r a i z quadrada r e a l de 1

print cmath . s q r t ( 1 . 0 ) #Imprime 1 j

7.2 O mdulo sys

A varivel sys.argv contem uma lista com os parmetros passados ao programa


Python, sendo o primeiro parmetro o nome do prprio script. As variveis
sys.stdin, sys.stdout e sys.stderr so objectos Python de tipo cheiro que
esto ligados entrada padro, sada padro e sada de erros padro respecti-
vamente. A funo sys.exit() permite a sada imediata do programa.

23
7 A biblioteca padro

7.3 O mdulo os

O mdulo os fornece acesso a funes subjacentes do sistema operativo de uma


forma portvel.

7.4 O mdulo csv

Este mdulo assiste na leitura de cheiro de dados delimitados por um separa-


dor. O exemplo seguinte mostra como ler o cheiro le.dat que consiste em
duas colunas de valores reais separados por uma tabulao, armazenando cada
coluna numa lista.

Listagem 7.2:

import csv
f = open ( " f i l e . d at " , " r " )
x = []
y = []
r e a d e r = c s v . r e a d e r ( f , d e l i m i t e r=" \ t " )
for r in reader :
x . append ( f l o a t ( r [ 0 ] ) )
y . append ( f l o a t ( r [ 1 ] ) )
f . close ()

24
Captulo 8
Python e clculo numrico

Os tipos de dados includos na linguagem Python so muito exveis, mas po-


dem tornam-se lentos e inecientes para manipular grandes quantidades de in-
formao. Por exemplo, um vector de nmeros reais sempre constitudo por
elementos do mesmo tipo mas se os armazenssemos numa lista essa lista teria
tambm de suportar todas as operaes de qualquer outra lista potencialmente
hetergenea. Para responder a estas diculdades existem mdulos especializa-
dos para clculo numrico como o numpy e scipy. Estes mdulos no fazem
parte da distribuio ocial do Python, embora estejam normalmente dispon-
veis nas distribuies de Linux, e na distribuio de Python para Windows da
Enthought, podendo tambm ser obtidos a partir de http://www.scipy.org/.

8.1 Numpy

O numpy uma extenso do Python que adiciona suporte para vectores e ma-
trizes multi-dimensionais, bem como uma srie de funes que operam nesses
objectos. O numpy est documentado exaustivamente num livro gratuito, dis-
ponvel em http://www.tramy.us/guidetoscipy.html.
O objecto base do numpy o array. Um array um conjunto de elementos,
todos do mesmo tipo, com um dado nmero de dimenses.

Listagem 8.1:

import numpy as np
a = np . a r r a y ( [ 1 , 2 , 3 ] ) #Converte uma l i s t a para a r r a y

#Array 1D com os v a l o r e s de 0 a 10 , p a s s o 0 . 1
#armazenados como r e a i s de p r e c i s o d u p l a
b = np . a r a n g e ( 0 . 0 , 1 0 . 0 , 0 . 1 , d t y p e=np . f l o a t 6 4 )

Um array tem vrios atributos bsicos. Por exemplo para um array a:

a.ndim: Nmero de dimenses

a.shape: Tuplo com o nmero de elementos de cada dimenso

25
8 Python e clculo numrico

Tipo de dados Descrio

bool Booleano (Verdadeiro / Falso)


uint8 Inteiro sem sinal, 8 bits (1 byte).
int32 Inteiro 32 bits
int64 Inteiro 64 bits
oat32 Real de preciso simples
oat64 Real de preciso dupla
complex64 Complexo de preciso simples
complex128 Complexo de preciso dupla

Tabela 8.1: Tipos de dados mais comuns do numpy

a.size: Nmero total de elementos do array

a.dtype: Tipo de dados. Ver a tabela 8.1 para uma lista de tipos de dados.

Podemos criar um array inicializado a zero com a funo zeros:

Listagem 8.2:

import numpy as np
#Array de r e a i s de p r e c i s o d u p l a
#com 3 l i n h a s e 4 c o l u n a s , i n i c i a l i z a d o a z e r o
x = np . z e r o s ( ( 3 , 4 ) , d t y p e=np . f l o a t 6 4 )

#Podemos mudar a forma do array ,


#n e s t e c a s o para 6 l i n h a s e 2 c o l u n a s .
x . reshape ( ( 6 , 2 ) )

O numpy suporta um grande nmero de operaes sobre os arrays, que so


aplicadas elemento a elemento. Podemos utilizar as operaes aritmticas usuais
(+, - , *, /, **), funes trignomtricas (sin, cos, tan, sinh, cosh, tanh, etc.).,
entre outras (abs, conj, power, etc.) (ver tabela 8.2).
Para alm destas funes o numpy suporta funes lgicas, que retornam um
array de valores booleanos com o resultado da respectiva operao. Estas fun-
es so greater, greater_equal, less, less_equal, not_equal, equal, logical_and,
logical_or, logical_xor e logical_not.

Listagem 8.3:

import numpy as np
x = np . a r r a y ( [ 1 0 , 2 , 3 , 5 ] )
y = np . a r r a y ( [ 2 , 4 , 1 5 , 2 ] )
print np . g r e a t e r ( x , y ) #Imprime [ True F a l s e F a l s e True ]

Pode encontrar uma lista de outras funes do numpy na tabela 8.3.

8.1.1 Diferenas nitas


O numpy suporta nos arrays as mesmas operaes de sequncias que as listas
python. Usando esta funcionalidade podemos implementar algoritmos de dife-

26
8 Python e clculo numrico

Funo Descrio

abs Valor absoluto


conj Complexo conjugado
exp(x) ex
log Logaritmo natural
log10 Logaritmo base 10
sqrt Raiz quadrada
square(x) x2
reciprocal(x) 1/x
sin, cos, tan Funes trignomtricas
arcsin, arccos, arctan Funes trignomtricas inversas
arctan2(x1,x2) arctan(x1/x2) considerando os sinais de x1 e x2
q
hypot(x1,x2) x21 + x22
sinh,cosh, tanh Funes trignomtricas hiperblicas
arcsinh, arccosh, arctanh Funes trignomtricas hiperblicas inversas
maximum(x1,x2) Elemento mximo
minimum(x1,x2) Elemento mnimo
real, imag Parte real ou imaginria

Tabela 8.2: Algumas funes do numpy

renas nitas de forma eciente. O exemplo seguinte resolve a equao do calor


1D
dU d2 U
=k 2
dt dx
usando o algoritmo de diferenas nitas FTCS (Forward Time Centered Space).
Este mtodo no o ideal para resolver a equao do calor devido s suas limi-
taes em termos de critrios de convergncia, mas uma forma simples de
ilustrar o uso de diferenas nitas. Variando o ndice j sobre a coordenada t, e
o ndice i sobre a coordenada x, temos

j j j
Uij+1 Uij U 2Ui1 + Ui+1
= k i1 ,
t x2
ou seja,

kt  j 
Uij+1 = Uij + Ui1 2U j
i1 + U j
i+1 .
x2

Listagem 8.4:

# * c o d i n g : l a t i n 1 *
#Equao do c a l o r , dU/ d t = k d^2U/ dx ^2
import numpy as np
import pylab

dt = 0 . 0 5
dx = 0 . 5

27
8 Python e clculo numrico

Funo Descrio

all(x) Retorna verdade se todos os elementos de x forem verdadeiros


angle(z) ngulo do nmero complexo
any Verdade se algum elemento for verdadeiro
append Acrescenta elementos a um array
arange Semelhante ao range, mas devolve um array
array Converte uma lista para um array
array_split, hsplit, vsplit Divide um array em vrias partes
astype Converte o tipo de dados de um array
average Mdia de um array
clip Fora os valores a estarem num intervalo
concatenate Concatena arrays
copy Retorna uma cpia de um dado array
cross Produto externo (vectorial)
delete Remove elementos do array
diag Matriz diagonal
di(x) Diferenas entre os elementos de x
eye Matriz identidade
at Iterador que percorre todos os elementos do array
atten Converte para 1D, retorna um novo array
frombuer Converte uma string para array
fromle L um array a partir de um cheiro
inner Produto interno
insert Insere novos elementos numa dada posio
inv Matriz inversa
linspace(inicio,m,N) Array com N elementos, com os valores de inicio a m
mat, matrix Converte para matriz
max Valor mximo
min Valor mnimo
newaxis Acrescenta uma nova dimenso
nonzero ndices dos elementos diferentes de zero
ravel Verso 1D do array
reshape Altera as dimenses do array, mantendo o n de elementos
resize Altera o tamanho do array
select Aplica operaes diferentes conforme as condies indicadas
shape A forma do array
shue Mistura aleatoriamente os elementos
sort Ordena o array
sum Soma de todos os elementos
swapaxes Troca os eixos indicados
take Retorna os valores do array de ndices especcado
tole Escreve um array para cheiro
tolist Converte um array para uma lista Python
unique(x) Todos os valores diferentes de x
where(condio,a,b) Valores de a ou b dependendo de condio
zeros, ones Array inicializado com o valor zero (ou um)

Tabela 8.3: Outras funes do numpy

28
8 Python e clculo numrico

k = 1.0
#Para k =1, e s t e mtodo e s t v e l s e
#d t / dx **2 <= 1/2

x = np . a r a n g e ( 1 0 . 0 , 1 0 . 0 , dx )
t = np . a r a n g e ( 0 . 0 , 1 0 . 0 , d t )
nx = l e n ( x )
nt = l e n ( t )
#D i s t r i b u i o i n i c i a l
u = np . e x p ( ( x + 2 . 0 ) ** 2 ) + np . e x p ( ( x 2 . 0 ) * * 2 )
sol = np . z e r o s ( ( nt , nx ) , d t y p e=u . d t y p e )
sol [0 ,:] = u

for i in xrange ( 1 , nt ) :
u[1: 1] += ( k * d t / dx * * 2 ) * ( u[: 2 ] 2.0 * u [ 1 : 1 ] + u[2:])
sol [ i , : ] = u

p y l a b . imshow ( s o l , o r i g i n =" l o w e r " , a s p e c t=" a u t o " , \


e x t e n t =(x [ 0 ] , x [ 1] , t [ 0 ] , t[ 1]))
pylab . c o l o r b a r ( )
pylab . x l a b e l ( "x" )
pylab . y l a b e l ( " t " )
p y l a b . show ( )

0.90

0.75

6 0.60
t

0.45
4

0.30

0.15

0 0.00
-10 -5 0 5
x

Figura 8.1: Equao do calor

29
8 Python e clculo numrico

importante usar operaes vectoriais tais como as do exemplo acima, e no


ciclos for a percorrer cada elemento do array, pois estes ltimos podem ser at
cerca de 100 vezes mais lentos.

8.2 Scipy

O scipy complementa o suporte de vectores multidimensionais do numpy com


mdulos com rotinas gerais para clculo nmerico como minimizao, integra-
o, transformadas de Fourier rpidas e outras tarefas comuns.

8.2.1 optimize
Rotinas gerais de optimizao e minimizao.

Mtodo Descrio

fmin Algoritmo simplex Nelder-Mead


fmin_powell Powell's (modied) level set method
fmin_cg Algoritmo de gradiente conjugado no linear
fmin_bfgs Mtodo quasi-Newton (Broydon-Fletcher-Goldfarb-Shanno)
fmin_ncg Gradiente conjugado usando o mtodo de Newton
leastsq Mtodo dos mnimos quadrados
fsolve Clculo de zeros de uma funo
brentq Interpolao quadrtica pelo mtodo de Brent
bisect Mtodo da bisseco
newton Mtodo de Newton

Tabela 8.4: Alguns mtodos de scipy.optimize

8.2.2 stats
Um conjunto de distribuies de probabilidade incluindo por exemplo as dis-
tribuies normal, Chi-quadrado, Cauchy, Gamma, Logstica, T de Student, as
distribuies discretas binomial, Bernoulli, geomtrica e Poisson entre outras.
Inclui tambm as funes estatsticas usuais como a media, mediana, moda, etc.

8.2.3 linalg
Rotinas de lgebra linear.

30
8 Python e clculo numrico

Mtodo Descrio

inv Inverte uma matriz quadrada


solve Resolve um sistema de equaes lineares
det Determinante de uma matriz quadrada
norm Norma
lstsq Mnimos quadrados lineares
eig Valores e vectores prprios de uma matriz quadrada
eigvals Valores prprios de uma matriz quadrada
lu Decomposio LU de uma matriz
cholesky Decomposio Cholesky de uma matriz
qr Decomposio QR de uma matriz

Tabela 8.5: Alguns mtodos de scipy.linalg

8.2.4 signal
Rotinas de processamento de sinal

Mtodo Descrio

convolve Convoluo
correlate Correlao
tconvolve Convoluo usando transformadas de Fourier rpidas
bspline B-splines
medlt Filtro median
sawtooth Onda dentes de serra
square Onda quadrada
boxcar Janela boxcar
triang Janela triangular
gaussian Janela gaussiana
hann Janela de Hann
hamming Janela de Hamming

Tabela 8.6: Alguns mtodos de scipy.signal

8.2.5 tpack
Transformadas de Fourier rpidas

Mtodo Descrio

t / it Transformada de Fourier 1D


tn / itn Transformada de Fourier multidimensional
tshift Muda a frequncia zero para o centro do espectro
hilbert / ihilbert Transformada de Hilbert
di Derivao de sequncias peridicas

Tabela 8.7: Alguns mtodos de scipy.tpack

31
8 Python e clculo numrico

8.2.6 integrate
Integrao e resoluo de equaes diferenciais ordinrias

Mtodo Descrio

quad Rotina geral de integrao


dblquad Rotina geral para clculo de integrais duplos
tplquad Rotina geral para clculo de integrais triplos
xed_quad Quadratura Gaussiana
quadrature Quadratura Gaussiana com tolerncia xa
romberg Quadratura de uma funo pelo mtodo de Romberg
trapz / simps / romb Quadratura de valores igualmente espaados
odeint / ode Resoluo de um sistema de equaes diferencias ordinrias

Tabela 8.8: Alguns mtodos de scipy.integrate

8.2.7 outras
Para alm dos componentes do scipy apresentados acima, destacam-se:

interpolate - Interpolao usando splines

linsolve - Resoluo de sistemas de equaes lineares

sparse - Matrizes esparsas

special - Funes especiais (Airy, elpticas, erf, Bessel, gamma, Hankel,


Legendre, etc.)

Este resumo no uma descrio exaustiva das funcionalidades do scipy. Para


uma descrio completa consulte a documentao desta biblioteca.

8.3 VPython

O VPython, ou Visual Python (http://vpython.org/), uma biblioteca


Python que permite criar grcos 3D interactivos particularmente apropriados
para demonstraes de princpios fsicos.

Listagem 8.5:

from visual import *


r e d b o x=box ( p o s=v e c t o r ( 4 , 2 , 3 ) , s i z e = ( 8 . , 4 . , 6 . ) , \
c o l o r=c o l o r . r e d )
g r e e n b a l l=s p h e r e ( p o s=v e c t o r ( 4 , 7 , 3 ) , r a d i u s =2 , \
c o l o r=c o l o r . g r e e n )

possvel rodar a gura mantendo o boto direito do rato premido sobre


a janela e movendo-o. Procedendo da mesma maneira com o boto do meio
permite-nos ampliar ou reduzir. As chamadas box e sphere criam os respec-
tivos objectos. Se for necessrio referir-nos a esses objectos posteriormente
necessrio atribuir essas chamadas a uma varivel como no exemplo.

32
8 Python e clculo numrico

Figura 8.2: Exemplo de VPython

33
8 Python e clculo numrico

Comando Descrio

cylinder(pos=<ponto >, axis=<vec>, radius=<n>) Cilindro


arrow(pos=<ponto>, axis=<vec>) Seta
cone(pos=<ponto >, axis=<vec>, radius=<n>) Cone
pyramid(pos=<ponto>, size=<vec>) Pirmide
sphere(pos=<ponto>, radius=<n>) Esfera
box(pos=<ponto>, length=<n>, height=<n>, width=<n>) Caixa
ellipsoid(pos=<ponto>, length=<n>, height=<n>, width=<n>) Elipside
curve([<ponto1>,<ponto2>,...],radius=<n>) Curva
ring(pos=<ponto>, axis=<vec>, radius=<n>, thickness=<n>) Anel
helix(pos=<ponto>, axis=<vec>, radius=<n>) Hlice
label(pos=<ponto>, text= Texto ) Texto

Tabela 8.9: Objectos VPython

8.3.1 Vectores
O VPython suporta o tipo vector.

Listagem 8.6:

from visual import *


a = vector ( 1 . , 2 . , 3 . )
b = vector ( 4 . , 5 . , 6 . )
c=a+b
d = mag ( c ) # d um e s c a l a r
f = cross (a , b) # produto v e c t o r i a l
g = dot ( a , b ) # produto e s c a l a r
h = norm ( a ) # Versor segundo a d i r e c o a

8.3.2 Objectos
Na tabela 8.9, <ponto> deve ser substitudo por um dado ponto no espao 3D
como por exemplo (1,2,3) e <vec> por um vector, como por exemplo (1,0,0), e
sendo <n> um nmero real.

8.4 matplotlib

O matplotlib uma biblioteca que produz grcos 2D de elevada qualidade,


disponvel em http://matplotlib.sourceforge.net/, onde tambm pode en-
contrar exemplos e um manual de utilizador. Seguem-se alguns exemplos de
utilizao desta biblioteca.

8.4.1 plot
import pylab
import numpy as np

34
8 Python e clculo numrico

1.2
sinc(x)

1.0

0.8

0.6

0.4
y

0.2

0.0

-0.2

-0.4
-30 -20 -10 0 10 20 30
x

Figura 8.3: plot

x = np . a r a n g e ( 30.0 ,30.0 ,0.01)


y = np . s i n ( x ) / x
p y l a b . p l o t ( x , y , l a b e l =" s i n c ( x ) " )
pylab . x l a b e l ( "x" )
pylab . y l a b e l ( "y" )
pylab . legend ( )
pylab . g r i d ( )
p y l a b . show ( )

8.4.2 subplot
import pylab
import numpy as np

def g r a f i c o (m) :
x = np . a r a n g e ( 10.0 ,10.0 ,0.01)
y = np . s i n (m* x )
pylab . p l o t ( x , y )
p y l a b . t i t l e ( "m="+ s t r (m) )

35
8 Python e clculo numrico

m=1 m=2
1.0 1.0

0.5 0.5

0.0 0.0

-0.5 -0.5

-1.0 -1.0
-10 -5 0 5 10 -10 -5 0 5 10
m=3 m=4
1.0 1.0

0.5 0.5

0.0 0.0

-0.5 -0.5

-1.0 -1.0
-10 -5 0 5 10 -10 -5 0 5 10

Figura 8.4: subplot

for i in range ( 4 ) :
p y l a b . s u b p l o t ( 2 , 2 , i +1)
g r a f i c o ( i +1)
p y l a b . show ( )

8.4.3 hist
import pylab
import numpy as np
import numpy . random as random

#Mdia 0 . 0 , d e s v i o padro 1 . 0 , 10000 e l e m e n t o s


x = random . n o r m a l ( 0 . 0 , 1 . 0 , s i z e = 1000 0)
pylab . h i s t ( x , 5 0 )
p y l a b . show ( )

8.4.4 scatter
import pylab

36
8 Python e clculo numrico

700

600

500

400

300

200

100

0
-4 -3 -2 -1 0 1 2 3 4

Figura 8.5: subplot

37
8 Python e clculo numrico

-1

-2

-3
-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5

Figura 8.6: scatter

import numpy as np
import numpy . random as random

n = 100
x = random . n o r m a l ( 0 . 0 , 0 . 5 , s i z e =n )
y = random . n o r m a l ( 0 . 0 , 1 . 0 , s i z e =n )
a r e a = 1 0 0 . 0 / np . s q r t ( x ** 2+y * * 2 )
c o r = np . a r a n g e ( 0 , n , 1 )
p y l a b . s c a t t e r ( x , y , c=c o r , s=a r e a , a l p h a = 0 . 7 5 )
p y l a b . show ( )

8.4.5 imshow
import pylab
import numpy as np
x = np . a r a n g e ( 5.0 ,5.0 ,0.01)
y = x
X, Y = np . m e s h g r i d ( x , y )
p y l a b . imshow ( np . s i n (X) * np . c o s (Y) , \
extent =[ 5.0 ,5.0 , 5.0 ,5.0] , \

38
8 Python e clculo numrico

4 0.8

0.6

2 0.4

0.2

0 0.0

-0.2

-2 -0.4

-0.6

-4 -0.8

-1.0
-4 -2 0 2 4

Figura 8.7: imshow

o r i g i n =" l o w e r " , a s p e c t=" a u t o " )


pylab . c o l o r b a r ( )
p y l a b . show ( )

8.5 Armazenamento de dados de simulaes

Ao efectuar simulaes normalmente necessrio armazenar os dados obtidos.


A forma mais simples escrever cada conjunto de dados como um cheiro de
texto. Este mtodo no o ideal, pois ocupa mais espao do que o necess-
rio, espalha a informao de uma mesma simulao por vrios cheiros e no
se auto-descreve, isto , no inclui informao acerca do que que est arma-
zenado. Para resolver estes problemas foram desenvolvidos formatos standard
para armazenamento de dados cientcos, como o netCDF e o HDF5. Existem
bibliotecas que suportam estes formatos para todas as linguagens de programa-
o mais comuns. No Python temos o PyTables (http://www.pytables.org/)
para o HDF5 e o ScienticPython (entre outros) para o netCDF. Assim usando
estes formatos podemos desenvolver uma simulao numa linguagem de progra-
mao, armazenar os dados resultantes, e visualizar ou processar estes dados
num outro programa escrito noutra linguagem. Podemos tambm partilhar es-

39
8 Python e clculo numrico

tes cheiros, uma vez que so independentes do sistema operativo que se esteja
a usar.

8.5.1 Acesso a cheiros netCDF com o ScienticPython


O ScienticPython (http://dirac.cnrs-orleans.fr/plone/software/scientificpython/)
tm uma interface simples para ler e escrever cheiros netCDF. O exemplo se-
guinte dene uma funo que escreve valores y (x) para um cheiro netCDF.

Listagem 8.7:

from S c i e n t i f i c . IO . NetCDF import *


import numpy a s np

def s t o r e ( x_data , y_data , f i l e n a m e ) :


n = l e n ( x_data )
file = NetCDFFile ( f i l e n a m e , "w" )
f i l e . c r e a t e D i m e n s i o n ( "x" , n )
x = f i l e . c r e a t e V a r i a b l e ( "x" , "d" , ( "x" , ) )
y = f i l e . c r e a t e V a r i a b l e ( "y" , "d" , ( "x" , ) )
x [:] = x_data
y [:] = y_data
f i l e . close ()

x = np . a r a n g e ( 0 , 2 . 0 * np . p i , 0 . 1 )
y = np . s i n ( x )
s t o r e ( x , y , " t e s t . nc " )

Os mtodos disponibilizados por este interface so:

NetCDFFile(cheiro,modo) - Abre um cheiro para leitura (modo r),


escrita (modo w) ou para acrescentar dados (modo a). Os cheiros
netCDF tm usualmente a extenso .nc. Para um dado cheiro aberto
com esta funo, como por exemplo

le = NetCDFFile(teste.nc,w)

temos os mtodos

le.createDimension(dimensao,tamanho) - O NetCDF dene todos os va-


lores em termos de dimenses, pelo que antes de se poderem criar quais-
quer variveis necessrio criar primeiro as dimenses que elas usam.

le.dimensions - Dicionrio com todas as dimenses e respectivos tama-


nhos

le.createVariable(nome,tipo,dimensoes) - Cria uma varivel onde vo po-


der ser armazenados dados. Os parmetros so o nome da varivel, o tipo
(f  - real preciso simples, d - real preciso dupla, i - inteiro, l -
inteiro longo, c - caracter, b - byte) e dimensoes um tuplo com os
nomes das dimenses desta varivel.

40
8 Python e clculo numrico

le.variables - Dicionrio contento todas a variveis, e respectivos valores.


Para obter um array x com os valores da varivel x usariamos:

x = le.variables[x][:]

le.sync() - Guarda todas as alteraes pendentes no disco.

le.close() - Fecha o cheiro

Podemos aceder e criar atributos globais do cheiro netCDF acedendo propri-


edade respectiva de le. Por exemplo, para criar o atributo nome com o valor
teste:
le.nome = teste
Podemos ler os cheiros resultantes com qualquer programa que suporte o for-
mato netCDF, como o ncview (http://meteora.ucsd.edu/~pierce/ncview_
home_page.html). O conjunto de programas NCO (netCDF Operators), dis-
ponvel em http://nco.sourceforge.net/, til para manipular estes chei-
ros.

41
Captulo 9
Concluso

A linguagem Python torna a programao mais fcil, no limitando o utilizador.


Para aprender mais acerca do Python pode consultar:

A documentao ocial (http://python.org/doc/) muito completa e


legvel, incluindo um tutorial de introduo linguagem, bem como refe-
rncias exaustivas da linguagem e biblioteca padro.

How to think like a computer scientist, disponvel em http://openbookproject.


net/thinkCSpy/ proporciona uma introduo simples linguagem.

Dive into Python, disponvel em http://diveintopython.org/ expe


a linguagem Python de uma introduo simples at algumas aplicaes
mais avanadas.

O livro Learning Python de Mark Lutz da editora O'Reilly, actualmente


na 3 edio, um livro introdutrio muito completo e repleto de exemplos.

Em relao s outras bibliotecas utilizadas, todas elas esto documentadas nos


prprios mdulos (docstrings) e nos respectivos stios web:

O numpy possu um livro gratuito, disponvel em http://www.tramy.us/


guidetoscipy.html.
O matplotlib (http://matplotlib.sourceforge.net/) tem um manual
de utilizador extenso, um guia de referncia de todas as funcionalidades
disponibilizadas e exemplos de utilizao.

A documentao do scipy mais limitada, estando em curso esforos para


a melhorar. Entretando, a melhor documentao deste mdulo a das
docstrings.

42

Você também pode gostar