Sei sulla pagina 1di 22

Programando em Python Aula 1

Gustavo Sverzut Barbieri <barbieri@gmail.com>

The contents of this document are licensed under the Creative Commons - Attribution / Share Alike license. See http://creativecommons.org/licenses/by-sa/2.0/

Programando em Python

Aula 1

Sumrio a
1 Introduo ca 2 Por que Python 3 Hello World 3.1 A funao print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c 4 Variveis a 5 Usando Condicionais: if ...elif ...else 6 Laos: while e for c 7 Funoes c 7.1 Criando Funoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c 7.2 Funoes com Argumentos Pr-Denidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c e 7.3 Funoes com Nmero Varivel de Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . c u a 8 Classes 8.1 Criando Uma Classe . . . . . . . . 8.2 Controlando o Acesso aos Recursos 8.3 Herana Mltipla . . . . . . . . . . c u 8.4 Simulando Sobrecarga de Mtodos e 8.5 Reimplementando Operadores . . . 8.6 Exceoes . . . . . . . . . . . . . . . c 9 Mdulos o 10 Encerramento 11 Referncias e 12 Resumo: Variveis e Controle de Fluxo a 13 Resumo: Funoes e Classes c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 5 5 6 7 8 8 9 11 12 12 15 16 17 18 19 19 20 20 21 22

Programando em Python

Aula 1

Introduo ca

Esta aula parte de uma apostila introdutria a linguagem de programaao Python. Supe-se que o leitor e o ` c o seja um programador em alguma outra linguagem, isto , no abordarei conceitos bsicos de programaao. e a a c Esta primeira aula pode ser utilizada como um manual de referncia rpida. Ela contm tudo que voc e a e e precisa saber para programar em Python.

Por que Python

Python uma linguagem fcil e gostosa de ser utilizada. E intuitiva e quem aprende uma vez nunca se e a esquece pois muito prxima de um pseudo-cdigo. Ela no ca no seu caminho na hora de programar. e o o a Python muito fcil de ser ensinada, pois ela foi elaborada por Guido Van Rossum em 1991 para o e a ensino de programaao. Ela orientada a objetos sem lhe forar a programar desta maneira. No reinventa c e c a funoes amplamentes conhecidas no mundo C/C++, como por exemplo, para abrir um arquivo utiliza-se c open( file ) e no new FileInputStream( new File( file ) ) como em Java. a Python tem uma vasta biblioteca de funcionalidades inclu que consiste de implementaoes diversas da c chegando at ao manuseio de conexes HTTP seguras, processamento de XML e HTML, bancos de dados e o e muito mais. Com mdulos extras para coisas mais espec o cas como engines de jogos e processamento de imagens. Possui mdulos para chamadas entre-processos com RPC, RPC-XML e outros, incluindo at o o e RMI1 . Existe uma grande comunidade em volta (http://www.python.org, http://www.pythonbrasil.com.br) e amplamente utilizada nos meios acadmico, software livre, pesquisa (Google, NASA), jogos (Disney) dene e tre outros. Existe uma palestra cujo tema chamar programadores Java para o mundo Python do Osvaldo Santana e Neto em http://www.pythonbrasil.com.br/OsvaldoSantanaNeto. Algums comentrios de gente grande podem ser vistos em http://www.python.org/Quotes.html. a Para mais informaoes, inicie o python e importe o mdulo this, seque abaixo o contedo: c o u
>>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases arent special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless youre Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, its a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- lets do more of those!
1 este

s para a implementaao Jython, que roda dentro de uma mquina virtual Java o c a

Programando em Python

Aula 1

Hello World

Tudo comea com um hello world, e nossa aula no diferente. c a e Como Python uma linguagem interpretada, podemos executar um programa interativamente, sendo e um otimo meio para fazer clculos avanados sem precisar abrir uma planilha de clculo ou at mesmo fazer a c a e prottipos rpidos. Nosso primeiro cdigo ser direto no interpretador. Primeiro, inicie o interpretador o a o a Python, geralmente s chamar python. Ele dever mostrar algo assim na sua tela: e o a [gustavo@gustavo] ~/aulas_python/src$ python Python 2.3.3a0 (#2, Nov 20 2003, 07:51:52) [GCC 3.3.2 (Debian)] on linux2 Type "help", "copyright", "credits" or "license" for more information. Logo aps j pode entrar com o cdigo. Para um simples Hello World : o a o
print " hello world ! "

Caso voc queira o cdigo em um arquivo, para que no precise digitar toda vez, salve o cdigo acima e o a o e o e em um arquivo e depois execute: python arquivo que voc^ salvou o cdigo. Se voc quiser gerar um executvel, s salvar o seguinte cdigo em um arquivo e dar permisses de execuao: a e o o o c
#! / u s r / b i n / env p y t h o n # c o d i n g : i s o 88591 print " hello world ! "

No qual a primeira linha um comentrio, comentrios em Python comeam com # e se estende at o e a a c e nal da linha.

Nota:
No caso da primeira linha temos algo comum em ambientes Unix, que so os comentrios a a funcionais. Se na primeira linha de um arquivo existir #! seguido de um caminho para um executvel, este executvel ser chamado e o nome do arquivo ser passado como argumento. a a a a No nosso caso, o arquivo hello world.py e o Unix vai identicar a primeira linha como sendo e um comentrio funcional e executar da seguinte forma: a / usr / bin / env python hello_world . py

Na segunda linha temos outro comentrio funcional, porm desta vez ele usado pelo Python (e no a e e a pelo Unix, como visto na nota acima). Este comentrio funcional especica em qual codicaao foi escrito o a c cdigo em hello world.py e tem o intuito de facilitar pessoas de outras l o nguas a escreverem cdigo Python o (chineses, japoneses e outros podem escrever as mensagens de texto em linguagem nativa). Este comentrio a funcional utilizado a partir do Python 2.3. e Na terceira linha temos uma funao interna do Python que imprime na tela, a funao print. Voc pode c c e encontrar a documentaao em http://www.python.org/doc/current/ref/print.html. c De agora em diante voc j sabe como executar cdigos Python. Fica a seu critrio executar os exemplos e a o e aqui listados em modo interativo ou via arquivos.

Programando em Python

Aula 1

Nota:
Se voc quiser que o interpretador interativo complete o cdigo voc pode usar um recurso e o e no documentado, basta digitar: a import rlcompleter import readline readline . parse_and_bind ( " tab : complete " ) Isso s vai funcionar se voc possuir o suporte ao readline compilado, o que deve ser verdade o e na maioria das instalaoes GNU/Linux. c Auto-completar o cdigo fonte como o Eclipse faz para o Java imposs o e vel para a maioria dos cdigos Python por que a tipagem dinmica e o editor de textos no tem como saber o e a a o objeto que vai estar presente na execuao. Porm como estamos no interpretador este sabe c e qual o objeto e portanto consegue completar como o Eclipse e outros.

3.1

A funo print ca

Esta funao recebe uma string 2 e a coloca em uma nova linha da sa padro3 , isto , aps o texto dado c da a e o ela envia um caractere de controle (\n) para o terminal de sa avanar para a prxima linha. da c o Caso queiramos suprimir este caracter de controle de nova linha, s colocar uma v e o rgula no m do comando, veja:
print " Texto SEM nova linha . " , print " Texto COM nova linha . "

Isto resultar em: a Texto SEM nova linha.Texto COM nova linha A funao print utiliza-se de um recurso das strings para simular o printf do C, C++, PHP e outras. c Repetimos: este recurso das strings (seria o sprintf de C), portanto pode ser utilizado em outros lugares. e Ele tem a forma:
" STRING FORMATO " % ( LISTA DE VALORES )

No qual "STRING FORMATO" segue o padro do printf, com %s para strings, %f para nmeros reais (ponto a u utuante), %d para decimais. Vide manual do Python para mais informaoes. Uma das principais diferenas c c que o %s mais relaxado, aceitando todos os tipos de contedo e convertendo-os para texto. e e u Exemplo:
minha_string = " a =% d , b =% x " % ( 1234 , 0 xff00ff ) print " decimal : % d , flutuante : %.2 f " % ( 1234 , 1.234 ) print " string : % s , string : % s " % ( " teste " , 123 )

Variveis a

Em Python uma varivel no tem tipo xo, apenas o tipo do contedo atual. Elas podem ser inicializadas a a u em qualquer parte do cdigo porm deve-se tomar extremo cuidado para no utilizar uma varivel o e a a antes desta ser sido inicializada! Os nomes de variveis s podem ter letras de a a z, o caractere de a o sublinhado, , e nmeros. Letras maisculas e minsculas so consideradas diferentes! Para incializar uma u u u a varivel s atribuir um valor a ela, por exemplo: a e o
2 string 3O

pode ser entendido como um pedao de texto, uma cadeia de caracteres. c e termo sa padro comumente referido por stdout, do ingls standard output. da a e

Programando em Python
texto1 texto2 inteiro real real2 = = = = = " algum texto " outro texto 123 1.23 1.23 e6 # 1 . 2 3 106

Aula 1

lista = [ 1 , 2 , " teste " , 1.23 , inteiro ] print " lista =% s " % lista # imprime : l i s t a =[ 1 , 2 , t e s t e , 1 . 2 3 , 123 ] print " lista [0]=% s , lista [1]=% s " % ( lista [ 0 ] , lista [ 1 ] ) # imprime : l i s t a [ 0 ] = 1 , l i s t a [ 1 ] = 2 print " peda o da lista : % s " % lista [ 1 : 3 ] c # imprime : p e d a c o da l i s t a : [ 2 , t e s t e ]

dicionario = { " chave " : " valor " , " inteiro " : inteiro , inteiro : " inteiro " } print " dicionario =% s " % dicionario # imprime : d i c i o n a r i o ={ c h a v e : v a l o r , i n t e i r o : 1 2 3 , 1 2 3 : i n t e i r o } print " dicionario [ chave ]=% s " % dicionario [ " chave " ] # imprime : d i c i o n a r i o [ c h a v e ]= v a l o r print " dicionario [123]=% s " % dicionario [123] # i n t e i r o == 123 # imprime : d i c i o n a r i o [ 1 2 3 ] = i n t e i r o print " dicionario [ chave ]=%( chave ) s " % dicionario

Usando Condicionais: if ...elif ...else

Os elementos condicionais em Python funcionam tais como em outras linguagens, com a sintaxe:
if CONDIC ~ O : A BLOCO DE C DIGO O elif CONDIC ~ O : A BLOCO DE C DIGO O else : BLOCO DE C DIGO O

veja um exemplo:
#! / u s r / b i n / env p y t h o n # c o d i n g : i s o 88591 variavel1 = 1 variavel2 = 2 if variavel1 == 1: print " variavel1 igual a 1 " elif variavel1 !=1 or not variavel2 print " variavel1 diferente de 1 elif variavel1 >= 1000 or variavel2 print " variavel1 maior que 1000 else : print " nenhuma das alternativas

== ou <= ou

2: variavel2 diferente de 2 " -1000: vari vel2 menor que -1000 " a

anteriores "

Programando em Python

Aula 1

Nota-se que as condioes podem se utilizar de operadores == (igual), != (diferente), < (menor), > (maior), c <= (menor ou igual), >= (maior ou igual) e que vrias condioes podem ser combinadas em uma condiao a c c maior utilizando os operadores lgicos and (e), or (ou) e not (negaao). o c

Ateno: ca
Em Python os blocos de comandos so denidos pela endentaao (espaos deixados antes do a c c in cio do texto), portanto muito importante car atento ao programar! Muitos dos erros e advm de m endentaao. e a c

Laos: while e for c

A linguagem prov dois tipos de laos, um que testa uma condiao e executa o bloco de cdigo enquanto tal e c c o for verdadeira (while) e outro que interage com uma seqncia (for). As sintaxes so: ue a
while CONDIC ~ O : A BLOCO DE C DIGO O for VARIAVEL in SEQ ^ NCIA : UE BLOCO DE C DIGO O

Exemplo de laos: c
#! / u s r / b i n / env p y t h o n # c o d i n g : i s o 88591 for fruta in [ " banana " , " ma a " , " uva " ]: c~ print " Fruta : " + fruta # end f o r f r u t a for i in range ( 0 , 10 ): print " i = " + str ( i ) # end f o r i i = 0 while i < 10: print " i = % d " % i i += 1 # end w h i l e i

Dentro de laos poss c e vel usar dois comandos adicionais para ajudar no controle dos mesmos. Os comandos so: a continue este comando vai para a prxima iteraao do lao imediatamente. o c c break este comando interrompe a execuao do lao. c c No exemplo utilizamos um comentrio logo aps o trmino de um lao, isto no obrigatrio porm a o e c a e o e ajuda a prevenir erros de endentaao. Achamos uma boa prtica e aconselhamos que utilizem-a. c a

Programando em Python

Aula 1

Funoes c

Funoes so um mtodo de reaproveitamento e organizaao de cdigo. Uma funao pode receber alguns c a e c o c parmetros e devolver um resultado. a Uma funao chamada pelo seu nome, seguido de parnteses contendo os parmetros. c e e a No exemplo sobre laos (Listagem 6) range( 0, 10 ) uma funao chamada range, que recebe como c e c parmetros dois nmeros inteiros, no exemplo passamos os valores 0 e 10. Esta funao tambm retorna um a u c e valor, que uma seqncia de nmeros desde 0 at 10 (no incluindo este ultimo). e ue u e a Em Python tudo so objetos, incluindo as funoes. Elas tem alguns atributos, dentre os quais os mais a c e c c e c uteis so doc o qual contm a documentaao da funao e name que contm o nome da funao. Mas a espera, pra que eu quero saber o nome da funao se eu tenho que chamar ela pelo nome? Bem, voc pode c e mudar o nome da funao, por exemplo, se uma funao tiver um nome muito grande, pra economizar digitaao, c c c voc pode criar um novo nome apontando pra funao que voc quer (lembra-se que em Python tudo um e c e e objeto?). Exemplo:
r = range print r ( 10 ) == range ( 10 )

Para ver os atributos de um objeto (no caso, de uma funao) utiliza-se a funao dir( OBJETO ). Exemplo: c c
print dir ( range ) for atributo in dir ( range ): print " % s = % s " % ( atributo , getattr ( range , atributo ) ) # end f o r a t r i b u t o

Neste exemplo, getattr uma funao que recebe como primeiro parmetro o objeto e como segundo o e c a atributo que se deseja receber o valor, equivalente a fazer objeto.atributo. Outra peculiaridade que e vemos no exemplo anterior que no importa o tipo do contedo dos atributos, eles so convertidos para e a u a strings pelo uso do %s, isto feito pelo Python usando a funao str( OBJETO ). e c

7.1

Criando Funoes c

Agora que voc sabe usar funoes, deve saber tambm como criar suas prprias. Trataremos s do bsico, e c e o o a porm aconselhamos que voc leia o manual do Python ou outros tutoriais mais avanados para saber os e e c recursos dispon veis. A sintaxe de criar uma funao simples: c e
def NOME DA FUNC ~ O ( LISTA DE PAR ^ METROS ): A A """ DOCUMENTAC ~ O DA FUNC ~ O A A """ BLOCO DE C DIGO O

Onde NOME DA FUNC~O deve ser um nome com apenas caracteres de a a z (letras maisculas e minsculas A u u so consideradas diferentes!), o caractere de sublinhado, , e nmeros, LISTA DE PAR^METROS uma lista a u A e de nomes de variveis separadas por v a rgulas, tais variveis estaro dispon a a veis no escopo da funao com os c valores recebidos. O texto entre a seqncia de trs aspas serve para documentar a funao e chama-se docstring. Existem ue e c diversos aplicativos que geram a documentaao em vrios formatos (html, man, pdf, ...) a partir das c a docstrings. Tambm podemos acessar a documentaao de uma funao lendo o contedo do atributo doc e c c u da funao (Vide exemplo, Listagem 7.1). Voc tambm pode usar a funao help( funao ) para obter a c e e c c~ documentaao desta. c O bloco de cdigo pode conter vrias sa o a das (pontos de retorno), basta somente usar o comando return VALOR A RETORNAR ou apenas return, caso no queira retornar valor algum. a Exemplo: 8

Programando em Python
#! / u s r / b i n / env p y t h o n # c o d i n g : i s o 88591 def fatorial ( numero ): """ Fun a o recursiva que retorna o valor do fatorial do n mero dado . c~ u """ if numero <= 1: return 1 else : return ( numero * fatorial ( numero - 1 ) ) # end f a t o r i a l for n in range ( 1 , 11 ): print " Fatorial de % d e % d " % ( n , fatorial ( n ) ) # end f o r n print " \ nDocumenta a o da fun a o fatorial :\ n " + fatorial . __doc__ c~ c~

Aula 1

Importante:
O Python passa como parmetro para a funao uma cpia da referncia para o objeto, a c o e por isso se voc mudar a referncia para outro objeto, a varivel passada como parmetro no e e a a a ser alterada, caso voc alterar o contedo de um objeto, a varivel ter seu valor alterado. a e u a a Um exemplo facilita o entendimento: lista = [ 1 , 2 , 3 ] def nao_altera_lista ( l ): l = [ 11 , 22 , 33 ]

# Muda a r e f e r n c i a p a r a o u t r o e # o b j e t o . P o r t a n t o n o a l t e r a o a # c o n t e u d o de l i s t a

nao_altera_lista ( lista ) print lista def altera_lista ( l ): l . append ( 123 )

# imprime : [ 1 , 2 , 3 ]

# A l t e r a o c o n t e u d o do o b j e t o . # P o r t a n t o a l t e r a o c o n t e u d o de # lista

altera_lista ( lista ) print lista

# imprime : [ 1 , 2 , 3 , 123 ]

7.2

Funoes com Argumentos Pr-Denidos c e

Pode-se utilizar argumentos com valores pr-denidos, os quais, se no forem especicados pelo usurio, e a a assumiro o dado valor. Veja o exemplo: a
def f ( a , b =1 ): print " a = % s b = % s " % ( a , b )

Programando em Python
f( 2, 2 ) f( 2 ) # imprime a = 2 # imrpime a = 2 b = 2 b = 1

Aula 1

E poss fornecer um argumento espec vel co sem que seja necessrio especicar todos apenas nomeando a o valor:
def f ( a , b =1 , c =2 , d =3 ): print " a = % s b = % s f( f( f( f( 2, 2 ) 2 ) 2 , c =4 ) 2 , c =4 , d =5 ) # # # # imprime imprime imprime imprime c = % s a = 2 a = 2 a = 2 a = 2 d = % s " % ( a , b , c , d ) b = 2 b = 1 b = 1 b = 1 c = 2 c = 2 c = 4 c = 4 d = 3 d = 3 d = 3 d = 5

10

Programando em Python

Aula 1

Importante:
Ao denir valores padro para argumentos, nunca utilize listas, dicionrios ou classes. Utilize a a apenas tipos imutveis: nmeros, strings, tuplas ou o valor None. a u Isto ocorre pois o objeto referido na descriao da classe ou o valor padro do mtodo instanc a e e ciado na hora da deniao e no na hora da execuao do mtodo. c a c e # I m p l e m e n t a c a o e r r o n e a ( Vide t e x t o e x p l i c a t i v o a b a i x o ) def f ( arg =[] ): # Errado ! ! ! return arg a = f () b = f () print a # imprime [ ] print b # imprime [ ] a += [ 1 ] print a # imprime [ 1 ] print b # imprime [ 1 ] tambm ! ! ! e

# Implementacao c o r r e t a : def f ( arg = None ): a = arg or [] # Mesmo que : i f a r g : a=a r g e l s e a = [ ] return a a = f () b = f () print a # imprime [ ] print b # imprime [ ] a += [ 1 ] print a # imprime [ 1 ] print b # imprime [ ] Note que a implementaao acima no est errada (por isso as aspas na palavra errnea). c a a o E apenas um recurso da linguagem que voc tem que saber usar. Em geral queremos que o e parmetro seja algo novo, que possa ser usado como no exemplo. Porm, certas vezes desejaa e se usar uma unica instncia para todas as chamadas e seria correto usar essa instncia como a a valor, obtendo-se o funcionamento desejado (como para singletons). O mesmo vale para os atributos de classe versus atributos de instncia. a

7.3

Funoes com N mero Varivel de Argumentos c u a

Pode-se utilizar funoes que recebem um nmero indenido de argumentos. Estes podem ser nomeados ou c u no. Tudo ca mais fcil com exemplos: a a
def arg_sem_nome ( * args ): for arg in args : # a r g s uma l i s t a com o s v a l o r e s e print " arg : % s " % arg arg_sem_nome ( " a " , " b " , 123 , 1.23 ) # imprime :

11

Programando em Python
# # # # arg : arg : arg : arg : a b 123 1.23

Aula 1

def arg_com_nome ( ** args ): for arg in args : # a r g s um d i c i o n a r i o com a s c h a v e s / v a l o r e s e print " % s =% s " % ( arg , args [ arg ] ) arg_com_nome ( a =123 , b =4.56 , teste = " teste12345 " ) # imprime : # a=123 # b =4.56 # t e s t e =t e s t e 1 2 3 4 5

Classes

A implementaao de classes em Python extremamente fcil e suporta herana mltipla, possui troca de c e a c u operadores, porm no tem sobrecarga de mtodos. e a e

8.1

Criando Uma Classe

Para criar uma classe utiliza-se a sintaxe:


class MINHA_CLASSE ( CLASSE_MAE_1 , CLASSE_MAE_2 , ... ): """ DOCUMENTACAO MINHA_CLASSE """ ATRIBUTO_1 ATRIBUTO_2 __ATRIBUTO_3__ __PRIVADO_1 __PRIVADO_2_ = = = = = VALOR_ATRIBUTO_1 VALOR_ATRIBUTO_2 VALOR_ATRIBUTO_3 VALOR_PRIVADO_1 VALOR_PRIVADO_2

def __init__ ( self , OUTROS_PARAMETROS ): " " " DOCUMENTAC ~ O DO CONSTRUTOR " " " A BLOCO DE C DIGO DO CONSTRUTOR O def __del__ ( self ): " " " DOCUMENTAC ~ O DO DESTRUTOR " " " A BLOCO DE C DIGO DO DESTRUTOR O def METODO_1 ( self , PARAM_1 , PARAM_2 = VALOR_PADRAO ): BLOCO DE C DIGO O def __METODO_PRIVADO_1 ( self , PARAM_1 ): BLOCO DE C DIGO O

Algumas peculiaridades da deniao acima: c a Construtores so indicados por __init__() e destrutores por __del__(). Estes so operadores. a Atributos e mtodos iniciados por dois sublinhados e terminados com no mximo um sublinhado e a so privados. Sim, o n de proteao de um atributo/mtodo baseado no nome dele! __PRIVADO_1 a vel c e e 12

Programando em Python

Aula 1

e __PRIVADO_2_ so atributos privados, enquanto que ATRIBUTO_1, ATRIBUTO_2 e __ATRIBUTO_3__ so a a pblicos. Isto pode parecer estranho, mas muito util ao programar, pois baseado no nome voc j u e e a sabe se algo pblico ou privado. e u Todos os mtodos de instncia tem que receber o primeiro parmetro como sendo o objeto representante e a a da prpria classe. Em outras linguagens isto feito pelo compilador, em python isto expl o e e cito. Por convenao chamamos de self, porm se voc estiver acostumado com Java/C++ pode chamar de this c e e ou qualquer coisa que lhe agradar mais. Muita coisa lhe pareceu estranha? No se preocupe... mais fcil quando se faz algo real, portanto a e a vamos a um exemplo:
class Pessoa : def __init__ ( self , nome = " " , idade =0 ): """ Cria uma pessoa . Par^ metros : a - nome e opcional ( padr~ o : " " ). a - idade e opcional ( padr~ o : 0). a """ self . nome = nome self . idade = idade # init () def getIdade ( self ): " " " Pega a idade da pessoa " " " return self . idade # getIdade () # Usando : p1 = Pessoa () # Nova c l a s s e p2 = Pessoa ( " Gustavo " ) # Nova c l a s s e , p a s s a n d o o nome p3 = Pessoa ( " Gustavo " , 22 ) # Nova c l a s s e , p a s s a n d o o nome e i d a d e p1 . nome = " Teste " p2 . idade = 22 i = p3 . getIdade () # A t r i b u i nome a p1 # A t r i b u i i d a d e a p2 # U t i l i z a m todo g e t I d a d e ( ) de p3 e

Neste exemplo foi denido uma classe Pessoa e instanciados trs objetos: p1, p2 e p3. e

Importante:
Como mostra getIdade(), sempre que utilizar um atributo da classe, precisa utilizar o self, ou qualquer nome denido como primeiro elemento do mtodo, isto devido a pol e e ` tica do python: Explicit is better than implicit. Isto mantm sempre as coisas claras. Voc sempre vai especicar de onde o valor vem. e e

13

Programando em Python

Aula 1

Importante:
Cuidado para no confundir variveis de classe e variveis de instncia. Ambas podem ser a a a a acessadas atravs de uma referncia para uma instncia. e e a class A : a = [] # V a r i a v e l de c l a s s e def __init__ ( self , b ={} , d = " teste " ): self . b = [] # V a r i a v e l de i n s t a n c i a

obj1 = A () obj2 = A () obj1 . a . append ( 1 ) print obj1 . a print obj2 . a print A . a obj2 . b . append ( 1 ) print obj1 . b print obj2 . b print A . b # imprime [ 1 ] # imprime [ 1 ] # imprime [ 1 ] tambm ! ! e

# imprime [ ] # imprime [ 1 ] # g e r a e r r o : c l a s s A h a s no a t t r i b u t e

Usos para as variveis de classe (a no exemplo) so diversos, como criar singletons ou a a mesmo armazenar um semforo para todas as instncias da classe (o que no deixa de ser um a a a singleton do semforo). a Porm tenha cuidado ao implementar, verique se este o comportamento que precisa. e e class PessoaRG ( Pessoa ): def __init__ ( self , RG , nome = " " , idade =0 ): Pessoa . __init__ ( self , nome , idade ) # i n i c i a nome e i d a d e self . RG = RG

Neste exemplo mostramos como criar uma nova classe PessoaRG herdando da classe Pessoa. Para esta nova classe criamos um novo construtor que acrescenta o parmetro RG e utiliza o construtor da classe a Pessoa para iniciar nome e idade. Note que o funcionamento de Pessoa.__init__() seria equivalente ao super() de Java, porm isso mais expl e e cito. O acesso a Pessoa.__init__() tambm nos mostra que poss acessar os mtodos e atributos de uma e e vel e classe sem ter que instanci-la, um exemplo: a
class A : a = 1234 print A . a # imprime 1234 # Porm p a r a u t i l i z a r o s m todos p r e c i s a s e r d e s c e n d e n t e : e e a = A () Pessoa . __init__ ( a , " Teste ERRADO " , 1234 ) # Gera o e r r o : # T r a c e b a c k ( most r e c e n t c a l l l a s t ) : # F i l e < s t d i n >, l i n e 1 , i n ? # TypeError : unbound method init ( ) must b e c a l l e d w i t h P e s s o a # i n s t a n c e a s f i r s t argument ( g o t A i n s t a n c e i n s t e a d )

14

Programando em Python
# Correto s e r i a : class A ( Pessoa ): a = 1234 print A . a # imprime 1234 a = A () Pessoa . __init__ ( a , " Teste CORRETO " , 12 ) print a . nome # imprime T e s t e CORRETO print a . idade # imprime 12 print a . a # imprime 1234

Aula 1

Nota:
Note a simplicidade e elegncia do Python. Ao utilizar self como primeiro parmetro a a e poss chamar qualquer mtodo de uma funao passando um objeto para ela. Alm disso a vel e c e implementaao do interpretador ca fcil e ainda permite que se utilize os conceitos bsicos c a a de herana mltipla, pois ca a cargo do usurio decidir o construtor a usar. c u a

8.2

Controlando o Acesso aos Recursos

Como vimos anteriormente os recursos so controlados pelo nome do mesmo. Aqui faremos alguns testes a para demonstrar o funcionamento:
class A : a = 1 __b = 2 class B ( A ): __c = 3 def __init__ ( self ): print self . a print self . __c print self . __b # Vai d a r e r r o , p o i s a = A () print a . a # imprime 1 print b . __b # e r r o , b r e s t r i t o a A e b = B () # e r r o , v i d e acima (B . init ( ) n o tem a c e s s o a a b)

b n o e x i s t e em B ! a

Outra forma de controlar o acesso aos atributos especicar as funoes de consultar, escrever e apagar e c (get, set e del ) dos atributos de forma individual. Para isso a classe precisa herdar de object isto , e precisa ser uma classe do novo estilo ou new style class. O controle pode ser feito usando os mtodos e __getattribute__(), __getattr__(), __setattr__() e __delete ou ento a facilidade property(): a
class A ( property ): def __init__ ( self ): self . __a1__ = 123 def __set_a1__ ( self , value ): print " Atribuindo valor : % s a a1 . " % value self . __a1__ = value

15

Programando em Python
def __get_a1__ ( self ): print " Obtendo valor de a1 . " return self . __a1__ def __del_a1__ ( self ): print " Apagando a1 . " del self . __a1__ a1 = property ( __get_a1__ , __set_a1__ , __del_a1__ ) a = A () print a . a1 a . a1 = 222 del a . a1

Aula 1

# Imprime Obtendo v a l o r de a1 . e d e p o i s : 123 # Imprime A t r i b u i n d o v a l o r : 2 2 2 a a1 . # Imprime Apagando a1 .

O acesso de leitura ao atributo a1 ser controlado por __get_a1__(), escrita a __set_a1__() e a aao de a c apagar a __del_a1__, com isso pode-se limitar tais aoes. Ao passar None para qualquer um dos parmetros c a c a de property() tal aao ser proibida.

8.3

Herana M ltipla c u

O suporte a herana mltipla bem bsico. E poss c u e a vel utilizar-se deste recurso, porm ele tem algumas e limitaoes, que exploraremos a seguir: c
class A ( object ): a = 1 class B ( object ): a = 2 b = 2 class C ( A , B ): pass # No tem c o r p o . Usado p a r a p e r m i t i r b l o c o v a z i o a class D ( B , A ): pass # No tem c o r p o . Usado p a r a p e r m i t i r b l o c o v a z i o a a b c d = = = = A () B () C () D ()

print a . a # imprime 1 print b . a # imprime 2 print b . b # imrpime 2 print c . a # imprime 1 print c . b # imrpime 2 print d . a # imprime 2 print d . b # imprime 2 <

<

print D . __mro__ # imprime ordem de p e r c u r s o na h i e r a r q u i a de c l a s s e s # (< c l a s s m a i n .D > , < c l a s s m a i n . B > , # < c l a s s m a i n .A > , <t y p e o b j e c t >)

16

Programando em Python
print C . __mro__ # imprime (< c l a s s m a i n . C > , < c l a s s # c l a s s m a i n . B > , <t y p e o b j e c t >) < main .A > ,

Aula 1

Como vimos, a herana mltipla implementada buscando por atributos denidos nas classes me da c u e a esquerda para a direita, parando quando o mesmo encontrado. e

Nota:
Neste exemplo as classes herdam de object. Classes que herdam deste so chamadas de a novo estilo (new style classes) e fornecem uma gama de funcionalidades extras, como o atributo __mro__, a funcionalidade property(), os mtodos __setattr__(), __getattr__(), e __delattr__(), dentre outros.

8.4

Simulando Sobrecarga de Mtodos e

Python no suporta sobrecarga de mtodos, ao denir um mtodo com um nome j denido, o anterior a e e a e trocado pelo mais recente. Por exemplo:
class A : def a ( self , a ): print a def a ( self , a , b ): print " %s , % s " % ( a , b ) a = A () a . a ( " teste " ) # No f u n c i o n a . . . e l e r e q u e r 3 a r g u m e n t o s ( s e l f + 2 ) a a . b ( " teste " , 123 ) # Funciona p e r f e i t a m e n t e

Como a linguagem suporta parmetros variveis e os nomes de variveis no tem tipos (no tipagem a a a a a e esttica, em tempo de compilaao), isto resolvido de vrias formas dependendo da necessidade: a c e a Tratar tipos diferentes de parmetros: devido ao python no atribuir tipos aos nomes das a a variveis, a implementaao ca trivial, trata-se os parmetros passados usando isinstance( parametro, classe ) a c a e ento toma-se a aao: a c
class A : def m ( self , a ): if isinstance ( a , int ): print " inteiro " elif isinstance ( a , str ): print " string " else raise TypeError , " Tipo % s n~ o suportado . " % a . __class__ . __name__ a

17

Programando em Python

Aula 1

Importante:
Evite usar este tipo de programao! ca O interessante em Python ele ser de tipagem dinmica e voc deve aproveitar isso. No e a e a conra o tipo, conra a interface! Isto , verique se o objeto implementa os mtodos e e necessrios para o funcionamento do algoritmo. a Por exemplo, existe algum algoritmo de ordenaao para inteiros. Ora, por que no ordenar c a textos, listas, tuplas ou qualquer outra lista de objetos com o mesmo cdigo? Se tudo que o voc precisa para ordenar uma lista de objetos conseguir compar-los, qualquer um que e e a implemente os mtodos necessrios (__le__(), __ge__(), __eq__(), ...), funcionar! e a a Para testar a interface pode-se utilizar hasattr() e callable(): def f ( p ): if not ( hasattr ( p , " metodo_necessario " ) and \ callable ( p . metodo_necessario ) ): raise TypeError , " p precisa implementar metodo_necessario () " c o d i g o _ d a _ f u n c a o _ u s a n d o p . metodo_necessario Um uso de isinstance() com objetos que devem herdar de uma classe que no implementa e a cdigo, apenas dene os mtodos, tambm conhecida como interface. Porm isso traz alguns o e e e problemas tambm: o primeiro que a classe herdeira pode denir um atributo com o mesmo e e nome do mtodo, ela vai continuar sendo vlida para a conferncia, porm no vai funcionar e a e e a (da a necessidade da chamada ao callable() na conferncia acima); outro problema existir e e algum cdigo na interface (no deveria), se este possuir um problema ele ser propagado. o a a Vide isinstance() considered harmful (http: // www. canonical. org/ ~kragen/ isinstance/ ) o qual explica vrios problemas em usar isinstance(). a Para um projeto maior, algo j pronto recomendado, vide o PyProtocols em a e http: // peak. telecommunity. com/ PyProtocols. html .

Outra maneira seria utilizar try ... except para os casos que os parmetros tem interface similares e a capturar os que fogem a regra. ` Tratar n mero diferente de parmetros: pode-se utilizar os mesmos recursos de funoes com u a c parmetros variveis ou ento parmetros com valores padro. a a a a a

8.5

Reimplementando Operadores

Em Python pode-se reimplementar operadores. Os operadores na verdade chamam mtodos espec e cos. Como visto acima, para trocar um mtodo s reimplementar o mesmo. O Python prov uma interface bsica e e o e a de operadores que podem ser implementados. Pode-se ver os mtodos que uma classe/objeto implementa e com o comando dir(), os operadores so nomeados com __ no in e m do nome. Os mais interessantes a cio so: a +, __add__( self, outros ) implementa o s mbolo + como operador binrio. E muito utilizado para a juntar duas coisas (listas, tuplas, nmeros, ...). u str(), __str__( self ) retornar uma string representando o objeto. E muito utilizado para impresso a de objetos na tela. Se precisar customizar a apresentaao da sua classe, utilize este. Tambm pode ser c e utilizado para mapear uma classe para XML e ao se imprimir a classe, esta feita de modo a formar e uma estrutura de tags. [x], __getitem__( self, x ) pega o elemento de ndice x. 18

Programando em Python [x]=y, __setitem__( self, x, y ) atribui y ao valor do elemento de ndice x. ==, __eq__( self, outro ) testa a igualdade. Exemplo:
class HTML_A : href = " " cdata = " " def __str__ ( self ): return <a href ="% s " >%s </ a > % ( self . href , self . cdata ) a = HTML_A () a . href = " http :// www . unicamp . br " a . cdata = " Site da Unicamp " print a # Imprime <a h r e f = h t t p : / /www . unicamp . b r > S i t e da Unicamp</a>

Aula 1

8.6

Exceoes c

Python implementa exceoes como sendo classes. Uma exceao pode herdar da classe base Exception gac c nhando assim toda a funcionalidade desta. A A Uma exceao pode ser capturada com um bloco try: COMANDOS except TIPO_EXCEC~O, EXCEC~O: COMANDOS c
try : a [ key ] = value except KeyError , e : # Captura e x c e c a o do t i p o KeyError , g u a r d a em e print " O valor usado como ndice (% s ) n~ o existe : % s " % ( key , e ) a except TypeError : # Captura e x c e c a o do t i p o TypError , d e s c a r t a a print " Tipo errado ! " except : # Captura q u a l q u e r o u t r a e x c e c a o pass # No f a z nada , i g n o r a . a

Em alguns casos no queremos tratar as exceoes, porm desejamos que alguns comandos sejam execua c e tados antes de prosseguir com a excesso para o prximo n a o vel. Para isso utilizamos o bloco try: COMANDOS finally: COMANDOS. Exemplo:
try : f = open ( " arquivo . txt " , " r " ) a [ key ] = value finally : f . close () # Sempre e x e c u t a o f . c l o s e ( )

Nota:
No poss a e vel utilizar try: ... except: ... finally: ...! Voc tem que aninh-los ou e a apenas usar o except:, que o que feito na maioria das vezes. e e

Mdulos o

Para utilizar mdulos bem fcil, apenas importe o mdulo que voc pretende utilizar. Por exemplo: o e a o e
import urllib

19

Programando em Python

Aula 1

Isto carregar o mdulo urllib, que proporciona uma interface de conexo e tratamento de URLs. Note a o a porm que toda funcionalidade est dentro name space (espao de nomes) urllib e portanto todo acesso e a c deve comear com ele: c
import urllib url = urllib . urlopen ( " http :// www . ic . unicamp . br " ) conteudo = url . read () # Notou a f a c i l i d a d e de s e d o w n l o a d e a r uma p a g i n a ??? url . close ()

Algumas vezes queremos os s mbolos no mesmo espao de nomes que nosso aplicativo, neste caso podemos c import-los, todos ou seletivamente: a
import urllib from urllib import urlopen url = urlopen ( " http :// www . ic . unicamp . br " ) conteudo = url . read () url . close () print urllib . quote ( " teste ? teste & bla " ) from urllib import * url = urlopen ( " http :// www . ic . unicamp . br " ) conteudo = url . read () url . close () print quote ( " teste ? teste & bla " )

Para criar um mdulo simples, crie um arquivo terminado em .py e coloque-o no seu diretrio corrente, o e o no diretrio com suas bibliotecas python (i: /usr/lib/python2.3/site-packages/) ou em algum lugar o e que a varivel de ambiente PYTHONPATH aponte. a Uma alternativa construir um diretrio e nele colocar os arquivos com os submdulos. e o o Procure pelos mdulos dispon o veis em: o veis na biblioteca padro. a http://www.python.org/doc/current/lib/lib.html Mdulos dispon http://www.python.org/pypi Python Package Index.

10

Encerramento

Com o contedo desta aula voc deve ter aprendido o bsico do Python. J poss u e a a e vel fazer aplicativos completos, porm pretendo desenvolver algumas aulas mais para passar algumas dicas desta linguagem que e eu adoro. Existem muitos recursos para facilitar sua vida! Se voc no descobrir sozinho, aguarde por um e a prximo texto! o

11

Referncias e

http://www.python.org Site ocial. http://www.pythonbrasil.com.br Site da comunidade brasileira. http://www.python.org/pypi Lista de mdulos extra. o

20

Programando em Python

Aula 1

12
lista print print print lista print tupla print print print tupla print

Resumo: Variveis e Controle de Fluxo a


= [ 1 , 2 , " texto " , 3.5 ] lista [ 0 ] # imprime lista [ 1 : 2 ] # imprime lista [ : -1 ] # imprime += [ " novo " ] lista # imprime = ( 1 , 2 , " texto " , 3.5 ) tupla [ 0 ] # imprime tupla [ 1 : 2 ] # imprime tupla [ : -1 ] # imprime += ( " novo " , ) tupla # imprime

Variveis e Substituiao: a c
1 [ 2, texto ] [ 1, 2, texto ] [ 1 , 2 , t e x t o , 3 . 5 , novo ] # E l e m e n t o s n o podem s e r a l t e r a d o s ! a 1 ( 2, texto ) ( 1, 2, texto ) ( 1 , 2 , t e x t o , 3 . 5 , novo )

dicionario = { " chave " : " valor " , " c2 " : " v2 " } print dicionario [ " chave " ] # imprime v a l o r newstring1 = " string = % s int = % d float = %03.2 f " % ( " txt " , 123 , 4.56 ) newstring2 = " chave =%( chave ) s c2 =%( c2 ) s " % dicionario newstring3 = " chave =% s c2 =% s " % ( dicionario [ " chave " ] , dicionario [ " c2 " ] )

Controle de Fluxo e Laos: c


if a > b and print " a elif a > c : print " a else : print " a a < c: entre b e c " maior que c " menor ou igual a b ou igual a c "

for elemento in lista : print " elemento : % s " % elemento coordenadas = [ ( 0 , 0 , 0 ) , ( 1 , 0 , 0 ) , ( 0 , 1 , 0 ) , ( 0 , 0 , 1 ) ] for x , y , z in coordenadas : print " Ponto : x =% d , y =% d , z =% d " % ( x , y , z ) loop = 1 while loop : resultado = faca_acao () if resultado < 0: break # P ra o l a c o a else resultado > 0: continue # V o l t a p a r a o come o do l a c o c print " teste "

21

Programando em Python

Aula 1

13

Resumo: Funoes e Classes c

Funoes: c
def funcao ( p1 , p2 = " Valor Padrao " ): print " p1 : % s p2 : % s " % ( p1 , p2 ) def f_param_variaveis ( p1 , * args ): print " p1 : % s " % p1 for arg in args : print " arg : % s " % arg def f _ p a r a m _ n o m e _ v a r i a v e i s ( p1 , ** args ): print " p1 : % s " % p1 for p_name , p_value in args : print " arg : % s =% s " % ( p_name , p_value )

Classes:
class A : attributo = 1 __privado = 123 def __init__ ( self , valor ): self . attributo = valor self . __metodo_privado () def __metodo_privado ( self ): print " chamando metodo privado " class B : attributo = 2 def __init__ ( self ): self . novo_attributo = 2 class C ( A , B ): def __init__ ( self ): B . __init__ ( self ) class D ( B , A ): def __init__ ( self ): B . __init__ ( self ) a = A( 1 ) b = B () c = C () d = D () print a . attributo # imprime 1 print b . attributo # imprime 2 print c . attributo # imprime 1 < h e r a n c a m u l t i p l a (A, B) A s o b r e p o e s e a B print d . attributo # imprime 2 < h e r a n c a m u l t i p l a (B,A) B s o b r e p o e s e a A

Mdulos e Espao de Nomes: o c


import urllib url = " http :// www . unicamp . br / " + urllib . quote ( " index . html " ) conteudo = urllib . urlopen ( url ). read () # i m p o r t a s m b o l o s p a r a e s p a c o de nomes a t u a l : from urllib import * url = " http :// www . unicamp . br / " + quote ( " index . html " ) conteudo = urlopen ( url ). read ()

22

Potrebbero piacerti anche