Python - O limite é a sua imaginação! Emanuel Rocha Woiski Departamento de Engenharia Mecânica Unesp – Campus de Ilha Solteira 28/9/2005 CREEM2005 1 Conteúdo Qual a Origem? A Linguagem Python O que é Python? Por que usar Python? Quem está utilizando? ...E no Brasil? Interfaces para… Shell Interativa Tipos de dados Demais Elementos da Linguagem... 28/9/2005 CREEM2005 2 Qual a Origem? Criada em 1989 pelo holandês Guido van Rossum no Centrum voor Wiskunde en Informatica (CWI), em Amsterdã, Holanda. Influenciada pela linguagem ABC, desenvolvida no CWI por Guido e outros nas décadas de 70 e 80. ABC tinha um foco bem definido: ser uma linguagem de programação para usuários inteligentes de computadores que não eram programadores: Físicos, Cientistas Sociais e até Lingüistas. O projeto de sistema operacional distribuído Amoeba precisava de uma linguagem de script. Nasce o Python. 28/9/2005 CREEM2005 3 A linguagem Python Origem nome: Monty Python’s Flying Circus Linguagem O-O de prototipação ágil Não apenas linguagem de script Fácil de usar, aprender, ler Extensível (adicionar novos módulos) C/C++ Java (através Jython) Madura (13 anos) Design limpo, simples, fácil entender ler como se fosse “pseudo-código” 28/9/2005 CREEM2005 4 O que é Python? Linguagem de programação orientada a objetos Linguagem de muito alto nível (VHLL) Dinamicamente (mas fortemente) tipada Multi-plataforma Windows, HP-UX, SunOS, Linux (todas as distribuições), PalmOS, Symbian, Java, entre outras OpenSource e licença compatível com GPL (Free Software) a partir de sua versão 2.0 28/9/2005 CREEM2005 5 Por que usar Python? Uma das linguagens mais divertidas que se tem atualmente Já vem com “baterias inclusas” (vasto repertório de bibliotecas) Protótipos rápidos sem preocupação com detalhes de implementação da linguagem Linguagem Interpretada: evita “codifica-compilaroda”. A Máquina Virtual já vem inclusa.. Bem menos linhas de código comparando com Java, C/C++... 28/9/2005 CREEM2005 6 Quem está utilizando? Google (vários projetos) NASA (vários projetos) Yahoo! (Yahoo mail & groups) RealNetworks (function and load testing) RedHat e outras distros (ferramentas de instalação Linux) Zope Corporation (gerenciamento de conteúdo) Apple, H.P., Microsoft, Disney, Bank Boston Muitas Universidades, como MIT, e Stanford (inclusive para ensino de programação) Jornal do Brasil, AOL Brasil Industrial Light & Magic (gerenciamento de C e C++) 28/9/2005 CREEM2005 7 ...E no Brasil? Embratel: monitoramento de backbone e clientes de internet e scripts de uso interno. CPqD: monitoramento de centrais telefônicas. Conectiva: Gerenciamento de pacotes da distribuição Linux e ferramentas de uso interno. Async: desenvolvimento de software de automação comercial. GPr Sistemas: Desenvolvimento de aplicações sob encomenda, sistemas como monitoramento de transporte terrestre via satélite são as soluções já feitas Outras que utilizam o Python para sistemas Web, como Varig, Serpro, Câmara, Interlegis, ... Os sistemas web de gestão de conteúdo usando o trio Python/Zope/Plone vem crescendo a cada dia, principalmente em empresas grandes e no governo. 28/9/2005 CREEM2005 8 Interfaces para… 28/9/2005 XML DOM, expat XMLRPC, SOAP, Web Services Base de dados relacional e orientada a objetos MySQL, PostgreSQL, Oracle , ODBC, Sybase, Informix e, é claro, ZODB Java (via Jython) Objective C COM, DCOM (.NET too) Many GUI libraries cross-platform Tk, wxWindows, GTK, Qt platform-specific MFC, Mac (classic, Cocoa), X11 CREEM2005 9 Shell Interativa Ótimo para aprender a linguagem Experimentar bibliotecas Testar novos módulos Digite comandos ou expressões no prompt >> print “Hello world!” Hello world! >> x = 2 ** 3 >> x / 2 4 >> 28/9/2005 CREEM2005 10 Tipos de dados Números: int, long (precisão ilimitada!), float, complex, boolean (True, False) Strings, ASCII/Unicode: imutável Listas, tuplas and dicionários: “containers” Módulos estendidos podem definir novos tipos de dados primitivos 28/9/2005 CREEM2005 11 Variáveis Sintaxe: (underscore ou letra) + (qualquer número de dígitos ou underscores) Case sensitivas Nomes são criados quando atribuídos pela primeira vez Nomes devem ser atribuídos antes de serem referenciados spam = 'Spam' #básico spam, ham = 'yum', 42 #tupla spam = ham = 'lunch' #múltiplo 28/9/2005 CREEM2005 12 Atribuição Atribuição manipula referências x = y não faz uma cópia de y x = y faz x referenciar ao objeto que y referencia Bastante útil, mas cuidado! Exemplo: >>> a = [1, 2, 3] >>> b = a >>> a.append(4) >>> print b [1, 2, 3, 4] Para obter um novo objeto, ao invés de um ponteiro para um objeto existente deve-se usar o módulo copy 28/9/2005 CREEM2005 13 Ilustração do Exemplo a = [1, 2, 3] a 1 2 3 1 2 3 1 2 3 a b=a b a a.append(4) Mas 4 b = [1, 2, 3, 4] 28/9/2005 CREEM2005 14 Strings "hello"+"world" "hello"*3 "hello"[0] "hello"[-1] "hello"[1:4] ‘hello’[1:4:2] ‘hello’[::-1] len("hello") "hello" < "jello" "e" in "hello" 28/9/2005 "helloworld" # concatenação "hellohellohello" # repetição "h" # indexação "o" # (do final) "ell" # “slicing” ‘el’ # com intervalo ‘oellh’ # reversa 5 # tamanho 1 # comparação 1 # busca CREEM2005 15 Listas Arrays flexíveis a = [98, ‘bottles of beer’, [‘on’, ‘the’, ‘wall’]] Mesmas operações para Strings a+b, a*3, a[0], a[-1], a[1:], len(a) Item e slice a[0] = 98 a[1:2] = [‘bottles’, ‘of’, ‘beer’] -> [98, ‘bottles’, ‘of’, ‘beer’, [‘on’, ‘the’, ‘wall’]] del a[-1] # -> [98, ‘bottles’, ‘of’, ‘beer’] 28/9/2005 CREEM2005 16 Mais operações com Listas >>> >>> >>> 5 >>> >>> 42 >>> a = range(5) a.append(5) a.pop() # [0,1,2,3,4] # [0,1,2,3,4,5] # [0,1,2,3,4] a.insert(0, 42) a.pop(0) # [42,0,1,2,3,4] # [0,1,2,3,4] a.reverse() # [4,3,2,1,0] >>> a.sort() 28/9/2005 # [0,1,2,3,4] CREEM2005 17 Dicionários Hash tables, “arrays associativos” d = {‘galinha’: ‘ave’, ‘água’: ‘líquido’} Consulta: d[‘galinha’] obtém-se ‘ave’ d[‘pato’] # ocorre a exceção KeyError Deleta, Insere, Sobrescreve: del d[‘água’] # {‘galinha’: ‘ave’} d[‘peso’] = 3 # {‘galinha’: ‘ave’, ‘peso’: 3} d[‘galinha’] = ‘bicho’ # {“galinha": ‘bicho’, ‘peso’: 3} 28/9/2005 CREEM2005 18 Mais operacões com dicionários Chaves(keys), Valores (values), Items (itens): d.keys() -> [‘galinha’, ‘peso’] d.values() -> [‘bicho’, 3] d.items() -> [(‘galinha’,’bicho’), (‘peso’,3)] Checar existência: d.haskey(‘galinha’) -> 1 ou True d.haskey(‘spam’) -> 0 ou False Valores / Chaves de vários tipos: {‘nome’:’Guido’, ‘idade’:43, (‘hello’,’world’):1, 42:’yes’, ‘flag’: [‘red’,’green’,’blue’] } 28/9/2005 CREEM2005 19 Tuplas pessoa = (sobrenome, prenome) point = x, y, z # parênteses opcional x, y, z = point # unpack x, y = 4.5, ‘borboleta’ # pack, unpack sobrenome = key[0] empty = () # parênteses! tuplas vs. listas tuplas são imutáveis! 28/9/2005 CREEM2005 20 Estruturas de controle if condição: statements [elif condição: statements] ... else: statements while condição: statements for var in sequência: statements break continue 28/9/2005 CREEM2005 21 Funções def nome_da_funcao (arg1, arg2, ...): “””doc string””” # (docstring) string de documentação opcional statement ... statement expressão return # só efeitos colaterais (sem retorno!) # expressão de retorno return expressão 28/9/2005 CREEM2005 22 Regras para escopo de funções Regra LGB Referências buscam 3 escopos: local, global, built-in Atribuições criam ou modificam nomes locais por default Pode forçar argumentos a serem globais utilizando global Exemplo x = 99 def func(y): z = x+y # x não é atribuído então é global return z func(1) retorna 100 28/9/2005 CREEM2005 23 Passando argumentos para funções Argumentos são passados por referência Argumentos são atribuídos a nomes locais Atribuições não afetam o chamador Modificando um mutável pode afetar o chamador def modificar (x,y): x=2 #modifica x local apenas y[0] = ‘hi’ #modifica o objeto compartilhado 28/9/2005 CREEM2005 24 Argumentos Opcionais É possível definir argumentos default (padrão) que não precisam ser passados. def func(a, b, c=10, d=100): print a, b, c, d >>> func(1,2) 1 2 10 100 >>> func(1,2,3,4) 1,2,3,4 28/9/2005 CREEM2005 25 Argumentos como sequências ou associações def fun(*args, **kwrds): for var in args: print var, for var in kwrds.items(): print var, fun('casa', 3, 'idade', nome = 'Maria', sexo = 'feminino') casa 3 idade (nome, ‘Maria’) (sexo, 'feminino') 28/9/2005 CREEM2005 26 Expressões Chamadas para Funções spam(ham, eggs) Referência para Lista/dicionário spam[ham] Chamada para Atributos e Métodos (de classes e outros objetos) spam.ham spam.ham(eggs) Expressões Compostas spam < ham and ham != eggs Testes de Intervalos spam < ham < eggs 28/9/2005 CREEM2005 27 Exceções Informar e capturar uma condição anormal que ocorreu Formato except: except (tipo_excecao_1, tipo_excecao_2, ...) [, variavel_da_excecao] a = [ 1, 2, 3 ] try: a[5] except IndexError: print “””Epa - o vetor não possui tantas posições!“”” finally: print ‘Fim do teste’ Epa - o vetor não possui tantas posições! Fim do teste 28/9/2005 CREEM2005 28 Módulos Módulos são códigos definidos em arquivos separados. objetos dos módulos são importados utilizando from ou import from modulo import alguma_funcao alguma_funcao() ou import modulo modulo.alguma _funcao() Módulos são “namespaces” (espaços de nomes) Podem ser utilizados para organizar nomes de variáveis sem que haja colisão. mod1.soma = mod1.soma - mod2.soma 28/9/2005 CREEM2005 29 Objetos arquivos (file) f = open(filename[, mode[, buffersize]) mode can be "r", "w", "a" (tipo C stdio); default "r" append "b" for text translation mode append "+" for read/write open Alguns Métodos: read([nbytes]), readline(), readlines() write(string), writelines(list) seek(pos[, how]), tell() flush(), close() fileno() 28/9/2005 CREEM2005 30 Algumas funcões úteis help() -> help interativo ou help(objeto), info. sobre objeto dir() -> lista atributos de um objeto type() -> retorna tipo do objeto raw_input() -> prompt de entrada de dados int(), str(), float()… -> typecast (mudança de tipo) chr(), ord() -> ASCII max(), min() -> maior e menor de uma string, list ou tuple 28/9/2005 CREEM2005 31 Classes class Nome_da_Classe ( Classe_Pai_1 , Classe_Pai_2 ): """ Docstring da classe . """ [Atributos da Classe] def __init__ ( self , argumentos ): [ Atributos de instância ] [ Código do Construtor] def nome_do_Metodo ( self , argumentos ): [ Código do Método ] 28/9/2005 CREEM2005 32 Links Site e portal oficial: http://www.python.org Estilo codificação Python: http://www.python.org/doc/essays/styleguide.html Tkinter: http://www.pythonware.com/library/tkinter/introduction/ Projeto Jython (Python em Java): http://www.jython.org/ Site oficial do Brasil: http://www.pythonbrasil.com.br/ 28/9/2005 CREEM2005 33