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

Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

Ambientes de desenvolvimento integrados

. . . . . . . . . . . . .

1.3

Modo interactivo

. . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Introduo programao
2.1

Tipos de dados

. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .

2.1.1

Valores numricos

2.1.2

Cadeias de caracteres

. . . . . . . . . . . . . . . . . . . .

2.1.3

Listas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.4

Tuplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.5

Dicionrios

. . . . . . . . . . . . . . . . . . . . . . . . . .

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

12

3.5

3.6

A funo range . . . . . . . . . . . . . . . . . . . . . . . .

Executar um bloco de cdigo enquanto uma condio for verdadeira: while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

As instrues break e continue

13

. . . . . . . . . . . . . . . . . . .

4 Estruturao e organizao do cdigo


4.1

Funes

14

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

Funes base do Python . . . . . . . . . . . . . . . . . . .

15

4.2

Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

4.3

Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

4.1.1

5 Operaes de entrada / sada

20

6 Controlo de erros

22

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


8.1
8.2

8.3

8.4

8.5

25

Numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

8.1.1

Diferenas nitas . . . . . . . . . . . . . . . . . . . . . . .

26

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

VPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

8.3.1

Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

8.3.2

Objectos . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

8.4.1

plot

34

8.4.2

subplot

8.4.3

hist

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

8.4.4

scatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36

8.4.5

imshow

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

Armazenamento de dados de simulaes


8.5.1

35

38

. . . . . . . . . . . . . .

39

Acesso a cheiros netCDF com o ScienticPython . . . . .

40

9 Concluso

42

ii

Captulo

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 legibilidade 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, sempre possvel desenvolver a maior parte do programa em Python suplementado
por um mdulo chamado a partir do Python e desenvolvido noutra linguagem.

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 linguagem Python, embora algumas bibliotecas que iremos utilizar no sejam instaladas 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-

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 distribuio Python

http://www.die-offenbachs.de/eric/index.html.

Eric, disponvel em

Pydev, que uma extenso ao IDE eclipse.

SPE, de

be/.

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

1.3 Modo interactivo


A forma mais simples de experimentar o Python usar a linha de comandos interactiva do Python.

//ipython.scipy.org/)

Alternativamente, pode-se usar o ipython (http:

que tem capacidades de edio e introspeco avana-

das, ou o modo imediato de um IDE Python. Usando o ipython:

Abreviatura de Integrated development environment

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]:
In [2]:

import scipy
scipy.

Display all 526 possibilities? (y or n)


Outra caracterstica importante a habilidade de ver a ajuda relativamente
a qualquer objecto:
In [1]:
In [2]:

import scipy
help(scipy)

e seria mostrada a documentao deste mdulo.


ajuda acerca de funes da prpria linguagem

Tambm podemos pedir

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 avanada
In [1]:
In [2]:

import math
(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 comando, 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 codicados. 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

Captulo

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 operaes 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 escrever 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 processador, e que nos so mais prximas.

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
x = 3.14/2.0
z = 1j
Neste exemplo

# Varivel i nte ira


# Varivel real
# V a r i v e l complexa
n = 3 52 = 75

e varivel

imaginria, que em Python representada por

atribudo o valor da unidade

j,

mas que tem sempre que se

seguir a um nmero para se distinguir da varivel j. As operaes que envolvam 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
print
print

1/3
1/3.0
1.0/3.0

#Imprime 0
#Imprime 0.333333333333
#Imprime 0.333333333333

Este comportamento vai mudar na verso 3.0 do Python, sendo ento o operador / 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 ! '

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 necessrio 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


com

aspas

isso

triplas

constitua

um

iniciarmos

uma

podemos

usar

erro

s i n t a x e """

de

cadeia

mudanas

de

de

linha

caracteres
sem

que

Podemos aceder a caracteres individuais ou seces de uma cadeia de caracteres usando a notao de parntesis rectos e sequncias:
Listagem 2.6:
s = " abcdef "

print

len ( s )

print
print

s [0]

print

s [2:4]

s [ 1]

#A f u n o l e n ( s ) d e v o l v e o tamanho de s ,
# neste caso 6
#Imprime o p r i m e i r o c a r a c t e r de s , ' a '
# 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 '
#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]

print

s [::

print

s [3:]

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

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 '

#I n c i o no n d i c e 3 , imprime ' d e f '

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]:
In [2]:

s = abc
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]:
In [2]:
In [3]:

s = abc
s = z + s[1:]
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 [2]

l [0]

+= 3

l . append ( 1 j )

#Imprime 3 . 1 4
# Agora l [ 3 . 1 4 , " p i " , 1 0 ]
#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:

2 Introduo programao
l

= [ 1 , "a" , 3 . 1 4 , 2 . 7 1 8 ]

print

#Imprime [ 1 , ' a ' ]

l [:2]

2.1.4 Tuplos
Os tuplos so sequncias ordenadas de objectos, semelhantes s listas, mas imutveis. Os tuplos so delimitados por parntesis.
Listagem 2.10:
t = ( 1 , " abc " , 5 . 0 , 7 . 4 )

print

t [1:3]

t2 = ( 1 0 , )

#Imprime ( ' abc ' , 5 . 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 = {}
d[1]

= " abc "

#Um d i c i o n r i o v a z i o
#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 ]

Captulo

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

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 condio 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 lgicos

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

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.
em Python o alinhamento do cdigo signicativo.
programa vai falhar com um erro:

10

Isto ,

Por exemplo o seguinte

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. importante 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

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

mximo "
mximo "
mximo "

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


verdadeira executado o primeiro bloco de cdigo. Uma instruo

11

if

pode ser

3 Instrues de controlo do uxo do programa


opcionalmente seguida por uma ou mais instrues
if , isto , se a condio do

if

elif,

abreviatura de else

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
else

"x

maior

ou

igual

"x

menor

que

10 "

print

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)

range ( 2 , 4 )
range ( 2 , 1 5 , 3 )

#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 .
#D e v o l v e [ 2 , 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

que executada se o bloco dentro da instruo


instruo

while

else

no tiver sado devido

break.
Listagem 3.7:

x = 10

while x >0:
i f x % 2 !=
print x ,
x

0:

#Se x impar
#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

break e continue podem ser usadas dentro de ciclos for e while.


break causa uma sada imediata do ciclo, o continue interrompe

As instrues
A instruo

o processamento do resto do bloco de cdigo do ciclo, passando de imediato


prxima iterao.

13

Captulo

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 parmetros 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
instruo

return

return,

que termina a funo e retorna ao chamador. A

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 documentao 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

return

soma

devolve

soma

dos

seus

prametros """

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 itervel 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 expressao. 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 parmetro, mostra ajuda acerca desse objecto.

hex(n) - Retorna uma cadeia de caracteres com a representao hexadecimal 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 dicionrio 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 funo 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 diferentes, 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
import
print
print

numpy

as

np

#s q r t do mdulo math
#Importa o mdulo numpy , mas
#passamos a r e f e r i l o como np

sys . platform
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 denidos 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 estamos. 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, perdendo 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 procurado 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 agrupar 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

def

de

temperatura """

__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

return
def

return

para

Fahrenheit """

(f

de

graus

Fahrenheit

para

C e l s i u s """

32)*(5.0/9.0)

s e l f . C2F ( s e l f . g r a u s _ C e l s i u s )

Celsius ( s e l f ):

return
def

Celsius
+ 32.0

Fahrenheit ( s e l f ) :

return
def

graus

F2C ( s e l f , f ) :
""" Converte

def

de

(9.0/5.0)

s e l f . graus_Celsius

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

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" )

#Fecha o f i c h e i r o

f . close ()

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

in f :
print l i n h a

linha

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

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 linguagem C. O cdigo \t o tab e %g um formato para imprimir um nmero
real.

21

Captulo

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
/

except,

try

e ao vericar-se a excepo ZeroDivisionError em vez de o programa

falhar, a funo dividir retorna uma mensagem.

22

Captulo

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 trigonomtricas 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

suporta nmeros reais, o

cmath

math,

mas enquanto que o

math

apenas

suporta nmeros imaginrios, pelo que

Listagem 7.1:

import
import

math
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.

sys.stdin, sys.stdout

sys.stderr

As variveis

so objectos Python de tipo cheiro que

esto ligados entrada padro, sada padro e sada de erros padro respectivamente. 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 separador. 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

in

reader :

x . append ( f l o a t ( r [ 0 ] ) )
y . append ( f l o a t ( r [ 1 ] ) )
f . close ()

24

Captulo

Python e clculo numrico


Os tipos de dados includos na linguagem Python so muito exveis, mas podem tornam-se lentos e inecientes para manipular grandes quantidades de informao. 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 especializados para clculo numrico como o numpy e scipy.

Estes mdulos no fazem

parte da distribuio ocial do Python, embora estejam normalmente disponveis 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 matrizes multi-dimensionais, bem como uma srie de funes que operam nesses
objectos. O numpy est documentado exaustivamente num livro gratuito, disponvel 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 funes 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)
reciprocal(x)

x2
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

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

d2 U
dU
=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 limitaes em termos de critrios de convergncia, mas uma forma simples de
ilustrar o uso de diferenas nitas. Variando o ndice
o ndice i sobre a coordenada

x,

sobre a coordenada

temos

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

Uij+1 = Uij +


kt  j
j
j
U

2U
+
U
i1
i1
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
import

numpy

as

np

pylab

dt = 0 . 0 5
dx = 0 . 5

27

t,

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 ,:]

for

= u

in

u[1:

xrange ( 1 , nt ) :

1]

sol [ i , : ]

+= ( k * d t / dx * * 2 ) * (

u[:

2 ] 2.0 * u [ 1 : 1 ]

= 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

8
0.75

0.60

0.45
4

0.30

2
0.15

0
-10

-5

0
x

Figura 8.1: Equao do calor

29

0.00

+ u[2:])

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, integrao, 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 distribuies 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.


tivos objectos.

As chamadas

box

sphere

criam os respec-

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

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

Cone

arrow(pos=<ponto>, axis=<vec>)

Seta

pyramid(pos=<ponto>, size=<vec>)

Pirmide

sphere(pos=<ponto>, radius=<n>)

Esfera

ellipsoid(pos=<ponto>, length=<n>, height=<n>, width=<n>)

Elipside

box(pos=<ponto>, length=<n>, height=<n>, width=<n>)


curve([<ponto1>,<ponto2>,...],radius=<n>)

ring(pos=<ponto>, axis=<vec>, radius=<n>, thickness=<n>)


helix(pos=<ponto>, axis=<vec>, radius=<n>)
label(pos=<ponto>, text= Texto )

Caixa

Curva
Anel
Hlice
Texto

Tabela 8.9: Objectos VPython

8.3.1 Vectores
O VPython suporta o tipo vector.
Listagem 8.6:

from

import *

visual

a = vector ( 1 . , 2 . , 3 . )
b = vector ( 4 . , 5 . , 6 . )
c=a+b

# d um e s c a l a r
# produto v e c t o r i a l
dot ( a , b ) # produto e s c a l a r
norm ( a ) # Versor segundo a d i r e c o a

d = mag ( c )

f = cross (a , b)
g =
h =

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


sendo

<n>

<vec>

por um vector, como por exemplo (1,0,0), e

um nmero real.

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

http://matplotlib.sourceforge.net/,

contrar exemplos e um manual de utilizador.


utilizao desta biblioteca.

8.4.1 plot
import
import

pylab
numpy

as

np

34

onde tambm pode en-

Seguem-se alguns exemplos de

8 Python e clculo numrico

1.2

sinc(x)
1.0

0.8

0.6

0.4

0.2

0.0

-0.2

-0.4
-30

-20

-10

0
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
import
def

pylab
numpy

as

np

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

10

20

30

8 Python e clculo numrico

m=1

1.0
0.5

0.5

0.0

0.0

-0.5

-0.5

-1.0
-10

-5

10

m=3

1.0

-1.0
-10

0.5

0.0

0.0

-0.5

-0.5

-5

-5

10

-1.0
-10

-5

Figura 8.4: subplot

for

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
import
import

pylab
numpy

as

np

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

10

10

m=4

1.0

0.5

-1.0
-10

m=2

1.0

8 Python e clculo numrico

700

600

500

400

300

200

100

0
-4

-3

-2

-1

Figura 8.5: subplot

37

8 Python e clculo numrico

-1

-2

-3
-1.5

-1.0

-0.5

0.0

0.5

Figura 8.6: scatter

import
import

numpy

as

np

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
import

pylab
numpy

as

x = np . a r a n g e (

np

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) ,

5.0 ,5.0 , 5.0 ,5.0] ,

extent =[

38

1.0

1.5

8 Python e clculo numrico

0.8
0.6

0.4
0.2

0.0
-0.2

-2

-0.4
-0.6

-4

-0.8

-4

-2

-1.0

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 armazenado. 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 programao 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 programao, 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 seguinte 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).
netCDF tm usualmente a extenso .nc.

Os cheiros

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 valores em termos de dimenses, pelo que antes de se poderem criar quaisquer variveis necessrio criar primeiro as dimenses que elas usam.

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

le.createVariable(nome,tipo,dimensoes) - Cria uma varivel onde vo poder 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 propriedade 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 formato netCDF, como o ncview (http://meteora.ucsd.edu/~pierce/ncview_

home_page.html). O conjunto de programas NCO (netCDF Operators), disponvel em http://nco.sourceforge.net/, til para manipular estes cheiros.

41

Captulo

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 referncias exaustivas da linguagem e biblioteca padro.

How to think like a computer scientist, disponvel em

net/thinkCSpy/

http://openbookproject.

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:

http://www.tramy.us/

O numpy possu um livro gratuito, disponvel em

O matplotlib (http://matplotlib.sourceforge.net/) tem um manual

guidetoscipy.html.

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