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.2 1.3 Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ambientes de desenvolvimento integrados Modo interactivo . . . . . . . . . . . . .

1
2 2 2

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

2 Introduo programao
2.1 Tipos de dados 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Valores numricos

5
6 6 6 8 9 9

Cadeias de caracteres Listas

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

Tuplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dicionrios . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Instrues de controlo do uxo do programa


3.1 3.2 3.3 3.4 Condies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blocos de cdigo Decises: if . . . . . . . . . . . . . . . . . . . . . . . . . . .

10
10 10 11 12 12

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

Executar um bloco de cdigo um dado nmero de vezes: for . . . 3.4.1 A funo range . . . . . . . . . . . . . . . . . . . . . . . .

3.5

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

3.6

As instrues break e continue

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

4 Estruturao e organizao do cdigo


4.1 Funes 4.1.1 4.2 4.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funes base do Python . . . . . . . . . . . . . . . . . . .

14
14 15 17 18

Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 Operaes de entrada / sada 6 Controlo de erros

20 22

Contedo

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

23
23 23 24 24

8 Python e clculo numrico


8.1 8.2 Numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.2.7 8.3 8.3.1 8.3.2 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 Diferenas nitas . . . . . . . . . . . . . . . . . . . . . . . optimize . . . . . . . . . . . . . . . . . . . . . . . . . . . . stats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . linalg signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Scipy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25
25 26 30 30 30 30 31 31 32 32 32 34 34 34 34 35 36 36 38 39 40

tpack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . integrate . . . . . . . . . . . . . . . . . . . . . . . . . . . . outras . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

VPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . plot hist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . subplot

scatter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . imshow

Armazenamento de dados de simulaes

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

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 em falta.

http://www.python.org/,

e acrescentar posteriormente os mdulos

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 desenvolvimento integrado (IDE ) que suporte o Python. programas gratuitos de cdigo aberto destacam-se:

Entre as vrias escolhas de

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

Eric, disponvel em

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

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/)
1

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)


Tambm podemos pedir

e seria mostrada a documentao deste mdulo. ajuda acerca de funes da prpria linguagem

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

import math (1+math.sqrt(5))/2.0 2**3

Out[2]: 1.6180339887498949 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 Listagem 1.1:

print.

# * 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: $ 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

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. chama Como difcil programar usando apenas nmeros criou-se uma representao intermdia

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

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 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 com isso aspas 1\ n L i n h a 2 " iniciarmos usar de uma cadeia de de caracteres sem que podemos erro mudanas linha

mensagem_longa = " " "Ao triplas um constitua

s i n t a x e """

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

len ( s ) s [0] 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 '

print

s [2:4]

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 '

2 Introduo programao
Mtodo insert(i,v) append(v) remove(v) pop() index(v) count(v) sort() reverse() Descrio Insere o valor v na posio i Acrescenta o valor v ao m da lista Remove da lista o primeiro item com valor v Retorna o ltimo valor da lista, removendo-o. Retorna o ndice da primeira ocorrncia de v. Se no existir retorna um erro. Nmero de vezes que v est na lista Ordena a lista 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]: zbc

s = abc s = z + s[1:] print s

2.1.3 Listas
Uma lista um conjunto ordenado de objectos. Uma lista pode ser alterada, inserindo, apagando ou substituindo um ou mais elementos. listas so delimitadas por parntesis rectos. Listagem 2.8: l = [ 3.1 4 , " pi " ,7] l [0] += 3 Em Python as

print
l [2]

#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

l . append ( 1 j )

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

print

#Imprime [ 1 , ' a ' ]

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 = [] lista est vazia "

i f not l i s t a : print "A

3.2 Blocos de cdigo


As instrues

if, while, for

def

so seguidas por um bloco de cdigo. Em Isto ,

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: Por exemplo o seguinte

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. 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, de l ter pelo menos uma linha.

pass.

Desta forma, se por exemplo quisermos

deixar temporariamente um dado bloco vazio esta instruo satisfaz o requisito

3.3 Decises: if
A instruo condio. Listagem 3.3:

if

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

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

if

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

if

pode ser

11

3 Instrues de controlo do uxo do programa


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

elif,

abreviatura de else

if

inicial no for verdadeira ento executar o bloco

seguinte se esta nova condio se vericar. No nal, pode existir opcionalmente

else,

cujo bloco executado se nenhuma das outras condies

tiver sido vericada. Listagem 3.4:

if

x >=10:

print else
:

"x "x

maior menor

ou que

igual 10 "

10 "

print

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 . #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 . #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 . #D e v o l v e [ ] (uma l i s t a v a z i a ) .

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

range (5 ,0 , 1)

range (0 ,5 , 1)

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 conPode opcionalmente ser seguida de uma clausula

dio for verdadeira. instruo

else

que executada se o bloco dentro da instruo

while

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


As instrues A instruo

break e continue podem ser usadas dentro de ciclos for e while. 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
Ora, no de todo isso que se deve fazer.

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. 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. exemplo anterior da tabuada como sendo Listagem 4.1: Por exemplo podemos re-escrever o

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


def,
que seguida pelo nome da funo

Uma funo denida pela instruo pode usar a instruo instruo

e por parntesis, que contm a lista de parmetros. Opcionalmente uma funo

return,

que termina a funo e retorna ao chamador. A

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 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 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 itervel for verdadeiro. bool(x) - Converte x para booleano, isto , retorna 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

True

ou

False

de

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 importantes:

import

tem vrias caractersticas

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). com extenso .pyc. Se tal no se vericar, o mdulo ento compilado, e o bytecode gerado guardado num cheiro

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

reload (),

que volta a carregar o mdulo

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 : 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 C2F ( s e l f , c ) : """ Converte de graus Celsius + 32.0 Fahrenheit para C e l s i u s """ para Fahrenheit """ """ Converses

def def

return def

(9.0/5.0) de graus

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

return def def def return return return

(f

32)*(5.0/9.0)

Fahrenheit ( s e l f ) : s e l f . C2F ( s e l f . g r a u s _ C e l s i u s ) s e l f . graus_Celsius s e l f . graus_Celsius + 273.15 Celsius ( s e l f ): Kelvin ( s e l f ) :

#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 obrigatoriamente 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
open(nome_cheiro,modo)
Listagem 5.1:

Operaes de entrada / sada


Para abrir um cheiro, seja para leitura ou escrita usa-se a funo 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.

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

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

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

6
Listagem 6.1:

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:

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
Vamos apenas apresentar aqui uma pequena

A biblioteca padro
O Python uma linguagem com as pilhas includas no sentido em que inclui uma extensa lista de mdulos. Library Reference em parte dos mdulos disponveis, para ver a lista completa consultar a Python

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

math,

mas enquanto que o

math

apenas

suporta nmeros reais, o

cmath

suporta nmeros imaginrios, pelo que

Listagem 7.1:

import import print

math cmath 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 #Imprime 1 j

print

cmath . s q r t ( 1 . 0 )

7.2 O mdulo sys


A varivel

sys.argv

contem uma lista com os parmetros passados ao programa As variveis e

Python, sendo o primeiro parmetro o nome do prprio script.

sys.stdin, sys.stdout
vamente. A funo

sys.stderr

so objectos Python de tipo cheiro que

esto ligados entrada padro, sada padro e sada de erros padro respecti-

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
x = y = [] [] r

csv

f = open ( " f i l e . d at " , " r " )

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 bool uint8 int32 int64 oat32 oat64 complex64 complex128 Descrio Booleano (Verdadeiro / Falso) Inteiro sem sinal, 8 bits (1 byte). Inteiro 32 bits Inteiro 64 bits Real de preciso simples Real de preciso dupla Complexo de preciso simples 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:

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

import

numpy

as

np

#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 abs conj exp(x) log log10 sqrt square(x) reciprocal(x) sin, cos, tan arcsin, arccos, arctan arctan2(x1,x2) hypot(x1,x2) sinh,cosh, tanh arcsinh, arccosh, arctanh maximum(x1,x2) minimum(x1,x2) real, imag Descrio Valor absoluto Complexo conjugado

ex
Logaritmo natural Logaritmo base 10 Raiz quadrada

x2 1/x
Funes trignomtricas Funes trignomtricas inversas arctan(x1/x2) considerando os sinais de x1 e x2

x2 + x2 1 2
Funes trignomtricas hiperblicas Funes trignomtricas hiperblicas inversas Elemento mximo Elemento mnimo 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

j
j

sobre a coordenada

t,

x,

temos

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


ou seja,

Uij+1 = Uij +

kt j j j Ui1 2Ui1 + Ui+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 pylab as np

dt = 0 . 0 5 dx = 0 . 5

27

8 Python e clculo numrico


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

1 0 . 0 , 1 0 . 0 , dx )

t = np . a r a n g e ( 0 . 0 , 1 0 . 0 , d 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 ) = u xrange ( 1 , nt ) : += ( k * d t / dx * * 2 ) * ( = u \ u[: sol [0 ,:]

for

in

u[1:

1]

2 ] 2.0 * u [ 1 : 1 ]

+ u[2:])

sol [ i , : ]

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 [ 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 ( )

1] , t [ 0 ]

, t[

1]))

0.90

8 0.75

0.60

0.45 4

0.30

2 0.15

0 -10

-5

0 x

0.00

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, integrao, transformadas de Fourier rpidas e outras tarefas comuns.

8.2.1 optimize
Rotinas gerais de optimizao e minimizao.

Mtodo fmin fmin_powell fmin_cg fmin_bfgs fmin_ncg leastsq fsolve brentq bisect newton

Descrio Algoritmo simplex Nelder-Mead Powell's (modied) level set method Algoritmo de gradiente conjugado no linear Mtodo quasi-Newton (Broydon-Fletcher-Goldfarb-Shanno) Gradiente conjugado usando o mtodo de Newton Mtodo dos mnimos quadrados Clculo de zeros de uma funo Interpolao quadrtica pelo mtodo de Brent Mtodo da bisseco 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 inv solve det norm lstsq eig eigvals lu cholesky qr Descrio Inverte uma matriz quadrada Resolve um sistema de equaes lineares Determinante de uma matriz quadrada Norma Mnimos quadrados lineares Valores e vectores prprios de uma matriz quadrada Valores prprios de uma matriz quadrada Decomposio LU de uma matriz Decomposio Cholesky de uma matriz Decomposio QR de uma matriz Tabela 8.5: Alguns mtodos de scipy.linalg

8.2.4 signal
Rotinas de processamento de sinal Mtodo convolve correlate tconvolve bspline medlt sawtooth square boxcar triang gaussian hann hamming Descrio Convoluo Correlao Convoluo usando transformadas de Fourier rpidas B-splines Filtro median Onda dentes de serra Onda quadrada Janela boxcar Janela triangular Janela gaussiana Janela de Hann Janela de Hamming Tabela 8.6: Alguns mtodos de scipy.signal

8.2.5 tpack
Transformadas de Fourier rpidas Mtodo t / it tn / itn tshift hilbert / ihilbert di Descrio Transformada de Fourier 1D Transformada de Fourier multidimensional Muda a frequncia zero para o centro do espectro Transformada de Hilbert 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 quad dblquad tplquad xed_quad quadrature romberg trapz / simps / romb odeint / ode Descrio Rotina geral de integrao Rotina geral para clculo de integrais duplos Rotina geral para clculo de integrais triplos Quadratura Gaussiana Quadratura Gaussiana com tolerncia xa Quadratura de uma funo pelo mtodo de Romberg Quadratura de valores igualmente espaados 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 *
\ \ c o l o r=c o l o r . r e d )

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 . ) , 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 ) , c o l o r=c o l o r . g r e e n ) r a d i u s =2 ,

possvel rodar a gura mantendo o boto direito do rato premido sobre a janela e movendo-o. tivos objectos. Procedendo da mesma maneira com o boto do meio As chamadas permite-nos ampliar ou reduzir.

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 cylinder(pos=<ponto >, axis=<vec>, radius=<n>) cone(pos=<ponto >, axis=<vec>, radius=<n>) pyramid(pos=<ponto>, size=<vec>) sphere(pos=<ponto>, radius=<n>) arrow(pos=<ponto>, axis=<vec>) Descrio Cilindro Seta Cone Pirmide Esfera Caixa Elipside Curva Anel Hlice Texto

ellipsoid(pos=<ponto>, length=<n>, height=<n>, width=<n>) ring(pos=<ponto>, axis=<vec>, radius=<n>, thickness=<n>) helix(pos=<ponto>, axis=<vec>, radius=<n>) label(pos=<ponto>, text= Texto ) curve([<ponto1>,<ponto2>,...],radius=<n>)

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

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 ) g = h = f = cross (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

8.3.2 Objectos
Na tabela 8.9, sendo

<ponto>

deve ser substitudo por um dado ponto no espao 3D

como por exemplo (1,2,3) e

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

onde tambm pode en-

contrar exemplos e um manual de utilizador. utilizao desta biblioteca.

Seguem-se alguns exemplos de

8.4.1 plot
import import
pylab numpy as np

34

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

10

20

30

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

8 Python e clculo numrico

1.0 0.5 0.0 -0.5 -1.0 -10 1.0 0.5 0.0 -0.5 -1.0 -10

m=1

1.0 0.5 0.0 -0.5 -1.0 -10 1.0 0.5 0.0 -0.5 -1.0 -10

m=2

-5

10

-5

10

m=3

m=4

-5

10

-5

10

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 as random numpy . 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

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 import
n = 100

numpy

as

np as random

numpy . random

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
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 =[ \ \ pylab numpy as np

x = np . a r a n g e (

5.0 ,5.0 ,0.01)

5.0 ,5.0 , 5.0 ,5.0] ,

38

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

-4

-2

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 necessrio, 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 Listagem 8.7:

y (x)

para um cheiro netCDF.

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 x = y = x [:] y [:] = NetCDFFile ( f i l e n a m e , "w" ) f i l e . c r e a t e V a r i a b l e ( "x" , "d" , ( "x" , ) ) f i l e . c r e a t e V a r i a b l e ( "y" , "d" , ( "x" , ) ) = x_data = y_data f i l e . c r e a t e D i m e n s i o n ( "x" , n )

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. com esta funo, como por exemplo le = NetCDFFile(teste.nc,w) Os cheiros Para um dado cheiro aberto

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

proporciona uma introduo simples linguagem.

Dive into Python, disponvel em mais avanadas.

http://diveintopython.org/

a linguagem Python de uma introduo simples at algumas aplicaes

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

guidetoscipy.html.

http://www.tramy.us/

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. docstrings. Entretando, a melhor documentao deste mdulo a das

42

Você também pode gostar