Minicurso Python - Inf

Propaganda
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!
Download