SOCIEDADE BRASILEIRA DE COMPUTAÇÃO I Escola Regional de Informática – Norte 3 (Acre/Rondônia) – ERIN3 MCS2 Conhecendo a Linguagem Python Marcos Thomaz da Silva Novembro de 2011 Sobre o Autor • Especialista em Bancos de Dados; • Graduado em Sistemas de Informação pela Universidade Federal do Acre; • Analista de Sistemas da Universidade Federal do Acre; • Moderador da Lista Django Brasil; • Moderador da Lista Active Delphi; • Trabalha com desenvolvimento de sistemas desde o ano de 1994, atuando com diversas linguagens: Clipper, Delphi, PHP e Python • Entusiasta de diversas outras linguagens de programação: C/C++, Cobol, Java, Ruby; • Desenvolvedor para PalmOS; • Atua com bancos de dados Firebird, DB2, MySQL, PostgreSQL e Oracle. Histórico Sobre a Linguagem • Criada em 1991 (versão 0.9.0) por Guido van Rossum; • Nome recebido como homenagem ao grupo de humoristas Monty Python; • Versão 1.0 lançada em 1994; • Versão 20 lançada em 2000; • Atualmemente é utilizada em duas vertentes: 2.X (7) e 3.0; Características da Linguagem • Sintaxe de alto-nível, simples e fácil de ser assimilada; • Tipagem dinâmica; • Tipagem forte; • Interpretada (compilada para bytecode); • Lincença de Código Aberto; • Multiplataforma (Unix, Linux, Windows, Maemo) Características da Linguagem • Existe nativamente em sistemas Operacionais Linux e MacOS; • Utilizado no desenvolvimento Web, Desktop (GTK, QT); • Orientada a objetos; • Gera executáveis através de utilitários (cx_freeze, py2Exe); • Console interativo • Primeira Linguagem Implementada no GAP (Google App Engine) Utilização de Python • Python para Web – Possui diversos frameworks para desenvolvimento de aplicações Web, entre os mais conhecidos estão: Zope, Django, Web2Py, Turbogears, Flask, GAP; – O Zope é um framework para aplicações de alta escalabilidade, um dos primeiros a implementar o conceito de No-SQL, e possuidor de diversos tipos de cache (memcached, ramcache, file); Utilização de Python • Gerenciadores de Conteúdo (CMS) – Diversas ferramentas de gerenciamento de conteúdo: Plone (Utiliza Zope), DjangoCMS, LFS, X5; – O plone atualmente é utilizado por boa parte dos portais governamentais (presidencia, siape, legislativo) Utilização de Python • Gestão Empresarial – Aplicativos de gestão comercial, CRM, Vendas, Gerenciamento de Postos de Gasolina: Stoq, ERP5, OpenERP; – Aplicações como o Stoq implementam uma série de frameworks, bibliotecas e métodos , tais como um ORM (SQLAlchemy), MVC (Kiwi), Desenho de telas (Gazpacho), Ambiente desktop multiplataforma (PyGTK) e banco de dados Postgre Utilização de Python • Dispositivos Móveis; – Desenvolvimento para Celulares (PyS60), tablet’s (PyQT e PySide), PSP; • Multimídia e Entretenimento; – Desenvolvimento de Jogos (PyGame, PyMedia, PyOpenGL), Imagens 3D (Aplicativo Blender – Utiliza PyGame) e demais imagens (PIL) • Ciência – Bibliotecas de uso científico (Scipy), matemático (NumPy) e outros (BioPython, AstroPy). IDE’s (Integrated Development Environment) e Editores • Livres – PyDev, Eric, Pida, Boa-Constructor (semelhante ao Delphi 3), Eclipse; • Proprietárias – Komodo, WingIDE, Aptana, PyCharm Editores de Texto – Vi/Vim, Emacs, SciTE, gedit, Textmate, Notepad++ Por que Python? • Possui orientação a objetos (inclusive, com suporte a herança múltipla), exceções, diversos módulos; • Sintaxe simples, prática e objetiva; • Executa em diversas plataformas sem a necessidade de recompilar; • Por utilizar identação (ou endentação) como bloco de código, garante a legibilidade do código; • Possui recursos de integração com outras linguagens como C/C++, Java (Jython), NET (IronPython); • Possui comunidade forte, tanto no Brasil quanto fora; Quem utiliza Python • Google (GAP, Youtube); • Industrial Light & Magic (Indústria de computação gráfica); • DreamWorks; • Laboratórios da Nasa; • AstraZeneca (farmacêutica); • Siapenet (Servidor Público); • Embrapa; • Nokia; • AOL Music; • CIA Iniciando com a Linguagem • Fazer o download da linguagem: – http://www.python.org/download/ • Instalar a linguagem (se necessário) • Abrindo o interpretador: – Ir a um terminal, digitar “python” e pressionar ENTER; • “import this” Conhecendo o interpretador • Usando como uma calculadora – “2 + 2”; “7/3”; “7/3.0”; “5*3”; “7-1” • Executando um arquivo – Abrir um editor de textos (pode ser o “vi”, “nano”, “bloco de notas”); – Digitar: • print “Oi mundo!” – Salvar como oimundo.py – No terminal, digitar: • python oimundo.py Estrutura de Arquivo Fonte • Linhas opcionais: – Podem existir nas primeiras linhas do código fonte (semelhante ao content-type do html); • # -*- coding: encoding -* • !/usr/python • Código • Verificação de chamada: – if __name__== “__main__” Linguagem • Não possui delimitadores de linha (estilo o “;” do PHP); • Delimitadores de bloco de código definidos por identação/endentação (sem o begin/end do pascal ou chaves do php, C/C++ ou Java); • Poucas palavras reservadas; • Sem a necessidade da declaração de variáveis (tipagem dinâmica); • Comentários são marcados por # • Ajuda no interpretador interativo: comando help • Pythonpath Linguagem: Tipos • Tipos Básicos: – Inteiro; – Ponto-Flutuante; – Strings (É possível utilizar ‘, “ ou ‘’’/”””). • Tipos de Sequencia: – – – – Tuplas – () - Imutável; Listas – [] – Mutável; Dicionários – {} - Mutável; Strings – Imutável; • Tipos avançados: – datetime • Para saber o tipo da variável: type Linguagem: Declarando Variáveis • O python não utiliza nenhum delimitador para variáveis (como o PHP ou o Ruby) • k = 3 #declara a variável K como inteiro • l = “ERIN” #declara string • pi = 3.14 #ponto-flutuante • tupla = (1,3,5, “oi” ) • lista = [ 1, 3, 5, 8 ] • dicionario = { ‘A’:1, ‘B’:2, ‘4’: 5} Linguagem: Informações do Usuário • input( <texto> ) • raw_input( <texto> ) • Exemplo: – nome = raw_input(“Digite seu nome:”) – idade = input( “Digite sua idade:” ) – print ‘Oi %s, voce tem %s anos’%( nome, idade) Linguagem: Operadores • Aritméticos: +, -, *, /, % (resto da divisão), ** (potência) • Separador decimal: “.” • Cadeia de bits: >>, <<, ~, &, | • Atribuição: =, +=, -=, /=, *= • Comparação: ==, !=, >, <, >=, <=, “in” • Lógicos: “and”, “or”, “not” Linguagem: Estruturas de Controle • Condicionais: if / elif if a > 1: print ‘A > 1’ • Laço iterativo: for p = ‘Python’ for l in p: print l • Laço condicional: while a, i = 10, 1 while i<a: if ( i % 2 ) == 0: print i i=i+1 • break / continue Linguagem: Funções • Sintaxe def nome_da_funcao( parametros ): instruções return retorno • • • • Argumentos nomeados Argumentos indefinidos (operador * ) Argumentos indefinidos (operador **) locals() e global() Exercícios de Fixação I 1. 2. 3. 4. 5. 6. Usando o interpretador interativo, calcule as seguintes contas: 1 + 2000, 524 / 12, 25 / , 27 / 2.0, 254-326 Crie um arquivo que receba o nome do cliente e seu endereço e imprima a frase: “<cliente> mora em <endereco>” substituindo <cliente> e <endereco> pelos valores recebidos Crie uma função que solicite dois números(variáveis A e B), e faça a inversão destes valores Crie uma função que pegue um número indefinido de parâmetros, e diga qual o valor é o maior Crie um arquivo onde o usuário tenha que informar um número inteiro, positivo, menor que 50, e imprima os valores ímpares que estão dentro deste intervalo. Crie uma função que peça o nome e salário, enquanto o nome esteja sendo preenchido. Ao término da iteração, exiba a quantidade de pessoas que foram informadas, e a soma total dos salários. Lambda • O que são • Quando utilizar • Exemplo: dobro = lambda numero : numero * 2 print dobro( 6 ) Trabalhando com listas • • • • Adicionando elementos (append): itens, e listas Ordenando listas Percorrendo listas (usando len e in ) Slice (fatiando) listas: lista[ <inicio : <fim> : <salto> ] lista = range( 0, 21, 2 ) lista[0:5] lista[5:] lista[:5] lista[-1] lista[-2:] Lista[::1] • Curiosidades: a = [1, 2, 3, 4, 5] b=a a.append(a) print b Trabalhando com listas • split nome = ‘ESTADO DO ACRE’ lista = nome.split() • join lista = [‘arroz’,’feijão’,’batata’,’macarrão’] alimentos = ‘,’.join( lista ) print ‘Alimentos ’+alimentos • Repetindo dados: operador “*” • Somando listas: operador “+” Funções úteis: map, reduce • map – Processa uma lista e retorna outra (mapeamento) – Exemplo: gerar uma lista, baseada em outra, multiplicando seus itens por 3. lista1 = [1, 2, 3] lista2 = map(lambda x: x * 3, lista1) print lista2 • reduce – Processa uma lista e reduz para um único valor – Exemplo: somar o valor de todos os valores de uma lista. lista1 = [1, 2, 3] soma_triplo = reduce( lambda x, y: x+y , lista1) Exercícios de Fixação II 1. 2. 3. 4. 5. 6. Crie uma função que receba uma frase e imprima ao contrário (por exemplo, a palavra “ACRE” seria impresso “ERCA”) Crie uma função que receba uma palavra e um número, e replique essa palavra a mesma quantidade de vezes informada pelo número Crie um código que pegue uma lista composta de valores inteiros e retorne a soma do triplo de seus itens Crie uma função que receba uma lista e imprima o maior elemento, o menor e a soma de todos os elementos Crie uma função que peça o nome e salário, enquanto o nome esteja sendo preenchido. Ao término da iteração, exiba a quantidade de pessoas que foram informadas, e a soma total dos salários, o menor deles, o maior, e a lista de todas as pessoas com seus respectivos salários Complemente a função anterior, ordenando a lista por ordem crescente de salário antes de imprimí-la. Módulos • Conjunto de códigos (biblioteca) • Arquivo __init__.py • Sintaxe: – import modulo ou – from modulo import Funcao1, Funcao2 • Evitar incluir o módulo todo Módulos • Curiosidade: Tomando a estrutura como exemplo (usando como pacote) – pasta1 • • • • arquivo1.py arquivo2.py __init__.py pasta2 – arquivo3.py – arquivo4.py – __init__.py • Poderíamos fazer: – from pasta1.pasta2 import arquivo3 – from pasta1.pasta2.arquivo3 import Funcao3 • E teríamos (respectivamente): – arquivo3.Funcao3( parametro ); ou – Funcao3( parametro ). Módulos: Testando no interpretador import calendar calendar.prmonth(2011, 11) calendar.prcal(2011) Principais Módulos • • • • • • • • sys: oferece várias operações referentes ao próprio interpretador. Inclui: path, uma lista dos diretórios de busca de módulos do python, argv, a lista de parâmetros passados na linha de comando e exit(), uma função que termina o programa. time: oferece funções para manipular valores de tempo. Inclui: time(), uma função que retorna o timestamp14 atual; sleep(n), que pausa a execução por n segundos; e strftime(n), que formata um timestamp em uma string de acordo com um formato fornecido. os: oferece funções relacionadas ao ambiente de execução do sistema. Inclui: mkdir(), que cria diretórios; rename(), que altera nomes e caminhos de arquivos; e system, que executa comandos do sistema. os.path: oferece funções de manipulação do caminho independente de plataforma. Inclui: isdir(p), que testa se d é um diretório; exists(p), que testa se p existe; join(p,m), que retorna uma string com os dois caminhos p e m concatenados. string: oferece funções de manipulação de string (que também estão disponíveis como métodos da string). Inclui: split(c, s, p), que divide a string c em até p partições separadas pelo símbolo s, retornando-as em uma lista; lower(c), que retorna a string c convertida em minúsculas; e strip(c), que retorna c removendo espaços e quebras de linha do seu início e fim. math: funções matemáticas gerais. Inclui funções como cos(x), que retorna o cosseno de x; hypot(x, y); que retorna a distância euclidiana entre x e y; e exp(x); que retorna o exponencial de x. random: geração de números randômicos. Inclui: random(), que retorna um número randômico entre 0 e 1; randrange(m,n), que retorna um randômico entre m e n; choice(s), que retorna um elemento randômico de uma seqüência s. getopt: processamento de argumentos de comando de linha; ou seja, os parâmetros que passamos para o interpretador na linha de execução. Inclui: getopt(), que retorna duas listas, uma com argumentos e outra com opções da linha de comando. Outros Módulos Importantes • datetime: fornece funções e métodos para controle de datas. • PIL / Image: funções e métodos para controlar e modificar imagens • Decimal: funções de decimais (muito usado para trabalhar com valores monetários). • Reportlab: Geração de arquivos PDF Trabalhando com arquivos • open – Métodos de abertura: w, r, w+, r+ – arquivo = open( ‘caminho/do/Arquivo’ , ‘r+’) # abre o arquivo para leitura e alteração – os.path.exists() #verifica se o arquivo existe • read / realines – linhas = arquivo.readlines() #carrega uma lista com as linhas do arquivo • write – arquivo.write( ‘nova linha’) #escreve no arquivo • seek – arquivo.seek( 5 ) #vai para o sexto byte • tell • close Erros e Exceções • Tratar exceções – Sintaxe: try: bloco de codigo except Excecao1: mensagem de tratamento except Excecao2: mensagem de tratamento • Levantar exceções – raise Exception(‘Mensagem de Erro’) Strings de Documentação • Para que servem • Como utilizar: def funcao( p1 ): ‘’’ O parametro p1 é um inteiro ‘’’ return p1 * 2 help( funcao ) print funcao.__doc__ Palavras Especiais • • • • • • • • __name__ __file__ __init__ __call__ __sum__ __sub__ __mul__ __div__ Funções Pré-Definidas • range / xrange: retorna uma lista • chr: retorna o caracter correspondente ao número. (por exemplo 65 é igual a “A”). • len: retorna o tamanho da lista • ord: retorna o número referente ao caracter • round: arredonda um ponto-flutuante • pow: calcula potência • min: menor valor de uma lista • max: maior valor de uma lista • abs: valor absoluto de um número • float: converte um número para float • str: converte um número para string • int: converte algo para inteiro • sum: soma os elementos de uma lista Exercícios de Fixação III 1. 2. Crie uma função que peça o nome e salário, enquanto o nome esteja sendo preenchido. Ao término da iteração, exiba a quantidade de pessoas que foram informadas, e a soma total dos salários, o menor deles, o maior, e a lista de todas as pessoas com seus respectivos salários. Armazene a lista em um arquivo. Em outra função, abra este arquivo e reimprima as informações. O código deve verificar se o arquivo existe. As funções comuns (exibir informações), devem ser colocadas em um arquivo separado. Tendo como dados de entrada a altura e o sexo de uma pessoa, construa um algoritmo que calcule seu peso ideal, utilizando as seguintes fórmulas: • • • 3. Monte uma função que receba como entrada uma frase e imprima-a como uma escada. Por exemplo, a palavra ACRE. • • • • 4. Para homens: (72.7*h) - 58 Para mulheres: (62.1*h) - 44.7 (h = altura) Peça o peso da pessoa e informe se ela está dentro, acima ou abaixo do peso. A AC ACR ACRE Crie uma função que receba como entrada o caminho completo de um arquivo, indique qual a maior linha do arquivo e imprima-a Orientação a Objetos: Classes • Uma classe é um molde de uma instância, ou seja, um modelo que indica quais os métodos e atributos um objeto deve ter. • Sintaxe: class MinhaClasse: <atributos> <métodos> • Ou então: class MinhaClasse( object ): <atributos> <métodos> Orientação a Objetos: Classes • Exemplo: class Aluno(object): ‘’’ Classe que define um aluno ‘’’ nome = None nota = None def situacao( self ): return ‘AP’ if nota and nota > 5 else ‘RP’ Orientação a Objetos: Classes • Construtores class Retangulo(object): base = altura = None __cor = ‘azul’ #método protegido def __init__(self, b, a): self.base, self.altura = b, a def area(self): return self.base * self.altura R = Retangulo( 5, 4 ) #instancia de Retangulo Orientação a Objetos: Herança • Classe Pai class Forma(object): __cor = ‘azul’ #método protegido def setCor(self, cor): self.__cor = cor class Quadrada(object): base = altura = None def __init__(self, b, a): self.base, self.altura = b, a def area(self): return self.base * self.altura • Classe Herdada class Retangulo(Forma, Quadrada): pass R = Retangulo( 5, 4 ) #instancia de Retangulo • Herança Múltipla (ordem de pai indica ordem de métodos) Orientação a Objetos: Herança • Reaproveitando código da classe pai: class Retangulo(Forma, Quadrada): def area_ao_quadrado( self ): return super(Retangulo,self).area() ** 2 Ou class Retangulo(Forma, Quadrada): def area_ao_quadrado( self ): return Quadrada.area(self) ** 2 Orientação a Objetos: Exceções • Exceções Também São Classes • A classe base das exceções é a Exception • Podem ser definidas classes de Exceção para melhorar o controle e mensagens de erro. Orientação a Objetos: Polimorfismo class Forma(object): cor = ‘Azul’ base = altura = None def getCor( self , c ): self.cor = c def __init__(self, b, h): self.base, self.altura = b, h def area(self): pass class Quadrado(Forma): def area(self): return self.base * self.altura Class TrianguloRetangulo(Forma): def area(self): return (self.base * self.altura)/2 Orientação a Objetos: Encapsulamento class Quadrado(object): base = altura = None def __init__(self, b, h): self.base, self.altura = b, h def __getArea(self): return self.base * self.altura def __setArea(self,a): from math import sqrt if a <= 0: raise Exception(‘Valor tem que ser maior que zero’) base = altura = sqrt( a ) area = property( __getArea, __setArea ) q = Quadrado(2, 2) q.area = 64 #valor de base e de altura fica 8 O que mais existe • • • • • A linguagem python não pára aí... Annotations C Bindings Iterators Metaclasses Orientação a Objetos: Pequena Brincadeira class Linguagem(object): nome = None def __init__(self, nome): self.nome = nome.capitalize()[0] + nome.lower()[1:] def mostra(self): import string t = 'JA'+string.printable+'VA'+string.printable+string.ascii_letters cp,tnome = ';hc076', string.translate(self.nome,t) print ('Super ' if cp == tnome else '')+self.nome def __add__(self, valor): print 'Aqui' if isinstance( valor , int ): return self.nome * valor elif isinstance( valor, Linguagem): if self.nome=='Python' and valor.nome == 'Java': return 'Jython' else: return self.nome+'/'+valor.nome else: raise Exception('Tipos Invalidos') Orientação a Objetos: Pequena Brincadeira l0 = Linguagem('python') l1 = Linguagem('java') l0.mostra() ## o que é mostrado aqui? l1.mostra() ## e aqui? l2 = Linguagem('python') print (l2 + l1) ## e aqui? print l2.nome ## e aqui? print l2 + 4 ## e aqui? Término • Crescimento da Linguagem • Amplo mercado de trabalho • Considerações finais Obrigado! Links Interessantes • • • • • • • • • • http://www.python.org.br http://www.python.org http://www.django-project.com http://pydev.sf.net/ http://www.die-offenbachs.de/detlev/eric.html http://pida.berlios.de/ http://www.activestate.com/Products/Komodo/ http://www.wingware.com/ http://www.jetbrains.com/ http://ark4n.files.wordpress.com/2009/05/python_para_desenvolved ores.pdf • http://ark4n.files.wordpress.com/2010/01/python_para_desenvolved ores_2ed.pdf