Minicurso Python Leonardo Santagada Kao Cardoso Félix Introdução Criador da linguagem e benevolent dictator for life: Guido Van Rossum Completamente Open Source (sim Java e C# eu estou olhando pra vocês) Características de Python Interpretada Identação Os blocos são separados por identação e não por delimitadores Tipagem Dinâmica Tipagem Forte Quem usa Python Identação Identação nível 0 Identação nível 1 Usando 4 espaços no estilo da PEP - 8 for x in range(10): print x print X*2 print "fim" Escrevendo Programas Um programa python é uma coleção de arquivos .py Um arquivo .py vai ser chamado de módulo ou script, dependendo da forma como será usado Podem ser organizados em módulos e pacotes Podem ser convertidos para um executável para windows e pacotes .app para mac. Escrevendo Programas Pacote modulo.py modulo.py import script.py modulo.py Olá Mundo! Abram o Interpretador No Windows o PyCrust No Ubuntu abram o terminal e digitem pycrust ou python Digitem o seguinte comando >>> print "Olá mundo!" e sejam bem vindos ao mundo da programação Python! Aprendendo a se virar... Ajuda a qualquer hora no interpretador >>> help(blah) Consultar propriedades de objetos >>> dir(foo) Descobrir tipos de objetos >>> type(obj) Documentação extensa na internet Tutoriais Referências completas O Interpretador é seu Amigo! Use e abuse do interpretador interativo Bom para: Aprender a usar funções e métodos Testar conceitos Documentação interativa (melhor que um manual estático!) Muito Importante Seu comando deu erro? Não se desespere! Leia calmamente a mensagem e tente entendê-la. Tipos Numéricos int inteiro de 32 bits long inteiro de precisão ilimitada (apenas pela memória de sua máquina) float precisão de um double de C complex número complexo parte real e imaginária com precisão de double em C Expressões Matemáticas Sintaxe semelhante a outras linguagens (2 + 4) * (3 - 8) / 10 Alguns operadores incomuns x**y # x elevado na y x // y # divisão inteira de x por y O símbolo _ no interpretador, guarda o valor da última expressão >>> 2+2 4 >>> _ 4 Importando Módulos Um módulo é um arquivo python contendo definições e comandos. Para usar definições de um módulo em um script usamos o comando import >>> import math >>> math.pi 3.1415926535897931 >>> math.degrees(_) Exercícios 1. Execute a expressão 100 + 1 / 2 no interpretador. A resposta foi a esperada? 2. Escreva uma expressão que calcule a distância entre 2 pontos 2D representados por coordenadas x1, y1, x2, y2 (dica: importar módulo math e consultar suas funções e respectivas ajudas) Exercícios: solução 1. Execute a expressão 100 + 1 / 2 no interpretador. A resposta foi a esperada? A resposta é 100, pois dividir dois inteiros em Python gera um resultado inteiro 2. Escreva uma expressão que calcule a distância entre 2 pontos 2D representados por coordenadas x1, y1, x2, y2 (dica: importar módulo math e consultar suas funções e respectivas ajudas) math.sqrt((x2-x1)**2 + (y2-y1)**2) Comando Condicional if Sintaxe simples e direta if <cond1>: <cmds> elif <cond2>: ... elif <condN>: <cmds> else: <cmds> Laço while Sintaxe muito simples: while <cond>: <cmds> E os usos de sempre... Expressões booleanas Operadores de comparação ==, <=, >=, <>, !=, is [not] Operadores booleanos not, and, or Operador de teste de pertinência [not] in if e in lista: print "pertence" Encadeamento if 1 < x < 10: print "x entre 1 e 10" Expressões booleanas None, [], {}, (), '' e 0 são considerados como False em expressões booleanas Expressões condicionais Retornam valores de acordo com testes <var> = <expr1> if <expr2> else <expr3> Exercícios 1. Faça um programa que leia 3 valores inteiros a, b e c e imprima "a , b e c formam uma tripla pitagórica" caso satisfaçam a2 = b2 + c2. Na string exibida a, b e c devem ser os valores lidos. (dica: use a função input para ler os valores) Exercícios: solução 1. Faça um programa que leia 3 valores inteiros a, b e c e imprima "a , b e c formam uma tripla pitagórica" caso satisfaçam a2 = b2 + c2. Na string exibida a, b e c devem ser os valores lidos. (dica: use a função input para ler os valores) a,b,c = input("Digite 3 valores:\n") if a**2 == b**2 + c**2: print "%d , %d e %d formam uma \ tripla pitagórica" % (a,b,c) Definindo Funções Nada estranho aqui def foo(arg1, arg2, ... argn): """Escreva algo útil aqui""" <cmds> return <expr> # docstring docstring: documenta sua função (lembra do help?) Listas Estrutura de dados essencial Sintaxe simples >>> l = ['a', 'b', 3, 'd', [5, 6]] >>> l[0] 3 >>> l[3] 'd' >>> l[4][1] 6 Manipulando Listas Inserção de um elemento >>> lista.append(obj) # insere no final >>> lista.insert(i, obj) # insere na posição i Ordenação de uma lista >>> lista.sort() Revertendo a lista >>> lista.reverse() Retirando elementos >>> lista.pop() #retorna e remove último elemento >>> lista.pop(0)#retorna e remove o primeiro Manipulando Listas Funções builtin : sum(lista): retorna a soma dos elementos da lista zip(lista1, lista2, ..., listaN): retorna uma sequência de tuplas ordenadas com elementos de cada lista enumerate(lista): retorna uma sequência de tuplas (i, elem) onde i é um contador crescente Comando for Diferente do for tradicional Semelhante ao for each encontrado em algumas linguagens Itera sobre valores de uma sequência for i in l: print type(i) Função range(start, [end, step]) List Comprehension Lembram-se da notação de conjuntos por compreensão? { x | x E A ^ x > 0} Python possui uma construção semelhante [x for x in A if x > 0] Ou, de forma mais geral [<exp> for <it> in <seq> [ if <cond1> ... if <condN>] ] Notação poderosa e clara para construção de listas a partir de outras listas List Comprehension Mapeamento Transforma cada elemento de uma lista em outra coisa [f(x) for x in l] List Comprehension Filtragem Gera uma nova lista com apenas alguns elementos da antiga [x for x in l if p(x)] Exercícios 1. Ache a soma de todos os números naturais abaixo de 1000 que são múltiplos de 3 e 5 2. Some duas listas elemento a elemento, isso é, sejam duas listas a = [a1, a2, ..., aN] e b = [b1, b2, ..., bN] produza uma lista [a1+b1, a2+b2, ..., aN+bN] Exercícios: Solução 1. Ache a soma de todos os números naturais abaixo de 1000 que são múltiplos de 3 e 5 sum([x for x in range(1000) if x%3 == 0 if x%5 == 0]) 2. Some duas listas elemento a elemento, isso é, sejam duas listas a = [a1, a2, ..., aN] e b = [b1, b2, ..., bN] produza uma lista [a1+b1, a2+b2, ..., aN+bN] [ai + bi for ai, bi in zip(a,b)] Fibonacci com Geradores def fibonacci(): n1, n2 = 1, 1 while 1: n1, n2, result = n1+n2, n1, n2 yield result yield: um return diferente retorna um valor mas a função mantém seu estado Tuplas Sequência de dados heterôgeneos, assim como listas A grande diferença: tuplas são imutáveis >>> t = (1,2,3) >>> t[0] 1 >>> t[1] = 4 TypeError Dicionários Mapeamento chave-valor >>> d = {} >>> d['chave'] = 1337 >>> d[10] = 'abc' >>> d[(1,2,3)] = [1, 3, {'a':1, 'b':2}] Não tem conceito de ordem Métodos úteis >>> d.keys() # lista de chaves >>> d.values() # lista de valores >>> d.items() # lista de tuplas (chave, valor) Dynamic-Dispatch com Dicionários Funções também são objetos >>> def sqr(x): return x*x >>> f = sqr >>> f(2) 4 Funções anônimas com lambda >>> sqr = lambda x: x*x >>> sqr(2) 4 Dynamic-Dispatch com Dicionários Criando um dicionário mapeando string e funções, podemos decidir o que executar dinamicamente! o_q_fazer = { "dobro": lambda x: x*2, "raiz": lambda x: math.sqrt(x), "quadrado": lambda x: x**2 } >>> o_q_fazer["dobro"](20) 40 Exercício Escreva um programa com um laço que espera um par (comando, dado) do usuário a cada iteração. O programa deve executar e imprimir o resultado do comando correspondente sobre o dado. Comandos: 'reverte' s, s é uma string 'quadrado' x, x é um número 'area' r, r é o raio de um círculo 'sair' deve terminar a execução do programa Arquivos Arquivos em python são fáceis de usar! Leitura f = file('arquivo') for line in f: print line f.close() Escrita f = file('arquivo', 'w') f.write('olá arquivo') f.close() Intervalo Tratamento de Erro com Exceções Exceções são uma forma de alto nível para lidar com erros Quando uma operação pode dar erro nós tentamos fazê-la prevendo os possíveis erros para que possamos tratá-los try: v = dicionario["joão"] except KeyError, e: print '"joão" não é uma chave válida ', e Tratamento de Erro com Exceções Da mesma forma, podemos avisar chamadas externas de nossas funções que erros ocorreram durante a execução: def quero_um_impar(impar): if impar % 2 == 0: raise ValueError("Ei! Pedi um ímpar!") print "Oba, um ímpar!" Orientação a Objetos Uma forma de encapsular uma abstração de um objeto ou tipo de dado junto com operações feitas sobre eles Conceitos Classe: especificação de um tipo de objeto Atributo: uma propriedade (variável) que pertence a um objeto Método: uma operação executada sobre um objeto Instância: um objeto em si Orientação a Objetos Em python, tudo é um objeto: >>> " abcd ".strip() 'abcd' >>> 123 .__add__(123) 246 Classes Sem proteção de atributos Tudo é público Métodos mágicos Métodos especiais Nomes no estilo __nome__ Mais usado __init__, o método que inicializa um objeto da classe, como construtores em outras linguagens Sobrecarga de operadores é feita com métodos mágicos Criando Classes class Shape: pass class Circle(Shape): # herança """Isso é um circulo.""" def __init__(self, radius): #inicializador self.r = radius def get_area(self): return math.pi * self.r**2 c = Circle(10.0) print c.get_area() Criando Classes class Body: def __init__(self, mass): self.m = mass class Disc(Circle, Body): # herança múltipla def __init__(self, radius, density): Circle.__init__(self, radius) mass = density * self.get_area() Body.__init__(self, mass) Atividade Criar uma classe Vetor que suporte operações de soma, subtração e multiplicação por escalar. Para isso use os métodos mágicos documentados na seção 3.4.7 Emulating numeric types de Language Reference no manual do Python. Também devem ser verificados os tipos dos argumentos dos métodos implementados e se os tamanhos dos vetores são iguais para fazer a soma e a subtração. Use exceções TypeError e ValueError para indicar erros. Obs: Para visualizar melhor os resultados das operações, adicione um método __repr__ à classe. Show Pyrotécnico tudo que você queria saber sobre Python mas tinha vergonha de perguntar Biblioteca Padrão Armazenamento de dados: pickle, sqlite, shelve, anydbm Compactação de dados: zlib, bz2, tarfile, zipfile Ferramentas de desenvolvimento: pdb, cprofile, doctest, unittest Redes: servidores para TCP/UDP/HTTP/CGI, raw Biblioteca Padrão 2 Acesso baixo nível/so: os, sys, gc (gc.stop!), ctypes (rmi para python), thread, signal, mmap Web: urllib2, webbrowser, cgi Programação paralela: Threading (threads, locks, cond. var.), Queues XML: minidom, dom, sax, xmlrpc Python para Web WSGI Padrão para rodar frameworks Django Zope/Plone Python Killer Application J2EE do Python Google App Engine Usa WSGI para servir aplicativos Python Django como framework padrão ... inúmeras possibilidades Python para Jogos Pygame escolha clássica e consolidada para jogos 2D Pyglet recente e promissora, baseada em OpenGL Cocos2D framework de altíssimo nível para jogos 2D feito em cima da pyglet Python para Jogos Panda3D Engine 3D criada pela Disney em parceria com o CarnegieMelon ETC Core escrito em C++ Jogos escritos em Python Como passar nas cadeiras da UFRGS com Python from ufrgs import cic; cic.graduate() Futuro da linguagem Como o Python Avança? Rápido Python Enhancement Proposal ou PEP PEP 7 - como formatar código C PEP 8 - como formatar código Python PEP 3XXX - ligados ao Python 3.0 Python 3000 Py3k era a versão do python que nunca iria acontecer Logo sempre que alguém tinha uma idéia inviavel ela era para ser lançada no Py3k, e ele seria lançado no ano 3000 (In)felizmente o Python avança tão rápido que a versão 3.0 vai ser lançada agora em 2008 (992 anos antes!) Algumas Caracteristicas do Python 3.0 Unificação de strings e unicode except E1, E2, E3 as err: {x} significa set([x]) reorganização da biblioteca padrão imports relativos e absolutos um monte de coisas que a gente carinhosamente omitiu durante esse curso Obrigado por assistir ao curso!