Python

53
Lembro-me quando aprendi Python Foi uma tarde agradável... (autor desconhecido) Matheus dos Santos Lima Github: matheussl [email protected]

Transcript of Python

Page 1: Python

Lembro-me quando aprendi

PythonFoi uma tarde agradável...

(autor desconhecido)

Matheus dos Santos LimaGithub: matheussl

[email protected]

Page 2: Python

Apresentação

• Prata da casa ;• Desenvolvedor web desde os 15 anos;• Pythonista há 3 anos;• matheussl no github;• Grupo Python Sergipe (GPS :P);• PUG-SE, Django-BR e Python-BR;

Page 3: Python

Ritmo do Curso

• Hands-on;• Contra o tempo;• Python numa tarde;• Exemplos retirados do• “Tutorial oficial de Python”;

Page 4: Python

Ops...

Antes de começar...

Page 5: Python

Roteiro

• Python?• Um passeio pela linguagem• Blocos• Controle de fluxo• Laços• Tipos• Funções• Estrutura de Dados• Classes• Iteradores

Page 6: Python

Python?

• Python é uma linguagem de altíssimo nível orientada a objeto, de tipagem dinâmica e forte, interpretada e interativa.

– Sintaxe clara;– legibilidade;

Page 7: Python

Python?

• A linguagem foi criada em 1990 por Guido van Rossum

– Google (aplicações Web).– Yahoo (aplicações Web).– Microsoft (IronPython: Python para .NET).– Nokia (disponível para as linhas recentes de

celulares e PDAs).– Disney (animações 3D).

Page 8: Python

Mão na massa!

Page 9: Python

Um passeio pela linguagem

# este é o primeiro comentárioSPAM = 1 # e este é o segundo

comentário # ... e agora um terceiro!STRING = "# Isto não é um comentário."

Comentários

Page 10: Python

Um passeio pela linguagem

>>> 2+2

4

>>> # Isto é um comentário

... 2+2

4

>>> 2+2 # em um comentário na mesma linha do código

4

>>> (50-5*6)/4

5

>>> # A divisão entre inteiros arredonda para baixo:

... 7/3

2

>>> 7/-3

-3

Operações matemáticas

Page 11: Python

Um passeio pela linguagem

>>> largura = 20>>> algura = 5*9>>> largura * altura900>>> x = y = z = 0 # Zerar x, y, z>>> x0>>> y0>>> z0

Atribuindo valores

Page 12: Python

Um passeio pela linguagem

>>> 'spam eggs''spam eggs'>>> 'doesn\'t'"doesn't">>> "doesn't""doesn't">>> '"Yes," he said.''"Yes," he said.'>>> "\"Yes,\" he said."'"Yes," he said.'>>> '"Isn\'t," she said.''"Isn\'t," she said.'

Strings

Page 13: Python

Um passeio pela linguagem

>>> palavra = 'Ajuda' + 'Z'>>> palavra'AjudaZ'>>> '<' + palavra*5 + '>''<AjudaZAjudaZAjudaZAjudaZAjudaZ>'

Concatenando strings

Page 14: Python

Um passeio pela linguagem

>>> 'str' 'ing' # <- Isto funciona'string'>>> 'str'.strip() + 'ing' # <- Isto funciona'string'>>> 'str'.strip() 'ing' # <- Isto é inválido File "<stdin>", line 1, in ? 'str'.strip() 'ing' ^SyntaxError: invalid syntax

Concatenando strings

Page 15: Python

Um passeio pela linguagem

>>> palavra[4]'a'>>> palavra[0:2]'Aj'>>> palavra[2:4]'ud'>>> palavra[:2] # Os dois primeiros caracteres'Aj'>>> palavra[2:] # Tudo menos os dois primeiros

caracteres'udaZ'

Strings podem ser indexadas

Page 16: Python

Strings não podem ser alteradas!

Page 17: Python

Um passeio pela linguagem

>>> palavra[0] = 'x'Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'str' object does not support item

assignment>>> palavra[:1] = 'Splat'Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'str' object does not support item

assignment

Tentando alterar strings

Page 18: Python

Blocos

• Os blocos de código são definidos pela endentação.

– “:” é o caractere que precede um bloco

Page 19: Python

Blocos

>>> a = 2>>> if a == 0:... print 'a é igual a zero'... elif a == 1:... print 'a é igual a um'... else:... print 'a é diferente de zero e um.'...a é diferente de zero e um.

Blocos

Page 20: Python

Controles de Fluxo

>>> x = int(raw_input("Favor digitar um inteiro: "))Favor digitar um inteiro: 42>>> if x < 0:... x = 0... print 'Negativo alterado para zero'... elif x == 0:... print 'Zero'... elif x == 1:... print 'Unidade'... else:... print 'Mais'...Mais

Comando if

Page 21: Python

Controles de Fluxo

• O comando for difere das linguagens C, Pascal ou Java.

– Itera sobre uma seqüência qualquer, ao invés de progressões aritméticas;

Page 22: Python

Controles de Fluxo

>>> # Medir o tamanho de algumas strings:>>> a = ['gato', 'janela', 'defenestrar']>>> for x in a:... print x, len(x)...gato 4janela 6defenestrar 11>>>

Comando for

Page 23: Python

Controles de Fluxo

• Não é seguro alterar a seqüência da lista durante a iteração.

– Solução: passar uma cópia da seqüência.

Page 24: Python

Controles de Fluxo

>>> for x in a[:]: # fazer uma cópia da lista inteira

... if len(x) > 6: a.insert(0, x)

...>>> a['defenestrar', 'gato', 'janela', 'defenestrar']

Comando for

Page 25: Python

Controles de Fluxo

>>> range(10)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> range(5, 10)[5, 6, 7, 8, 9]>>> range(0, 10, 3)[0, 3, 6, 9]>>> range(-10, -100, -30)[-10, -40, -70]>>> a = ['Mary', 'had', 'a', 'little', 'lamb']>>> for i in range(len(a)):... print i, a[i]...0 Mary1 had2 a3 little4 lamb

Função range()

Page 26: Python

Controles de Fluxo

>>> for n in range(2, 10):... for x in range(2, n):... if n % x == 0:... print n, '=', x, '*', n/x... break... else:... # laço terminou sem encontrar um fator... print n, 'é um número primo'...2 é um número primo3 é um número primo4 = 2 * 25 é um número primo6 = 2 * 37 é um número primo8 = 2 * 49 = 3 * 3

break e continue, e cláusulas else em laços

Page 27: Python

Controles de Fluxo

>>> while True:... pass # esperar interrupção via teclado

(Ctrl+C)...>>> def initlog(*args):... pass # Lembrar de implementar isto!...

Comando pass

Page 28: Python

Funções

def confirmar(pergunta, tentativas=4, reclamacao='Sim ou não, por favor!‘):

while True: ok = raw_input(pergunta).lower() if ok in ('s', 'si', 'sim'): return True if ok in ('n', 'no', 'não', 'nananinanão'): return False tentativas = tentativas - 1 if tentativas == 0: raise IOError('usuario nao quer cooperar') print reclamacao

Definindo funções

Page 29: Python

Funções

• A função do slide anterior pode ser invocada de várias formas:– fornecendo apenas o argumento

obrigatório: confirmar('Deseja mesmo encerrar?')– fornecendo um dos argumentos

opcionais: confirmar('Sobrescrever o arquivo?', 2)– ou fornecendo todos os

argumentos: confirmar('Sobrescrever o arquivo?', 2, 'Escolha apenas s ou n')

Page 30: Python

Funções

>>> def minha_funcao():... """Não faz nada, mas é documentada....... Realmente ela não faz nada.... """... pass...>>> print minha_funcao.__doc__Não faz nada, mas é documentada.

Realmente ela não faz nada.

Strings de documentação

Page 31: Python

Tratamento de Exceções

>>> def divide(x, y):... try:... resultado = x / y... except ZeroDivisionError:... print "divisão por zero!“... else:... print "resultado é", resultado... finally:... print "executando a cláusula finally"...>>> divide(2, 1)resultado é 2executando a cláusula finally>>> divide(2, 0)divisão por zero!executando a cláusula finally>>> divide("2", "1")executando a cláusula finallyTraceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 3, in divideTypeError: unsupported operand type(s) for /: 'str' and 'str'

Tratamento de exceções

Page 32: Python

Estrutura de dados

>>> a = [66.25, 333, 333, 1, 1234.5]>>> print a.count(333), a.count(66.25), a.count('x')2 1 0>>> a.insert(2, -1)>>> a.append(333)>>> a[66.25, 333, -1, 333, 1, 1234.5, 333]>>> a.index(333)1>>> a.remove(333)>>> a[66.25, -1, 333, 1, 1234.5, 333]>>> a.reverse()>>> a[333, 1234.5, 1, 333, -1, 66.25]>>> a.sort()>>> a[-1, 1, 66.25, 333, 333, 1234.5]

Listas

Page 33: Python

Estrutura de Dados

• Exercício – Demonstrem como criar uma pilha usando lista.– Dica: pop(), append()

Page 34: Python

Estrutura de Dados

>>> pilha = [3, 4, 5]>>> pilha.append(6)>>> pilha.append(7)>>> pilha[3, 4, 5, 6, 7]>>> pilha.pop()7>>> pilha[3, 4, 5, 6]>>> pilha.pop()6>>> pilha.pop()5>>> pilha[3, 4]

Utilizando Lista como Pilha

Page 35: Python

Estrutura de Dados

>>> from collections import deque>>> fila = deque(["Eric", "John", "Michael"])>>> fila.append("Terry") # Terry chega>>> fila.append("Graham") # Graham chega>>> fila.popleft() # O primeiro a chegar

parte'Eric'>>> fila.popleft() # O segundo a chegar parte'John'>>> fila # O resto da fila, em

ordem de chegadadeque(['Michael', 'Terry', 'Graham'])

Usando listas como filas

Page 36: Python

Estrutura de Dados

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y][(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]>>>>>> combs = []>>> for x in [1,2,3]:... for y in [3,1,4]:... if x != y:... combs.append((x, y))...>>> combs[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]>>>>>>>>> matriz = [... [1, 2, 3, 4],... [5, 6, 7, 8],... [9, 10, 11, 12],... ]

Mais sobre listas

Page 37: Python

Estrutura de Dados

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]>>> del a[0]>>> a[1, 66.25, 333, 333, 1234.5]>>> del a[2:4]>>> a[1, 66.25, 1234.5]>>> del a[:]>>> a[]

Comando del

Page 38: Python

Estrutura de Dados

>>> t = 12345, 54321, 'bom dia!'>>> t[0]12345>>> t(12345, 54321, 'bom dia!')>>> # Tuplas podem ser aninhadas:... u = t, (1, 2, 3, 4, 5)>>> u((12345, 54321, 'bom dia!'), (1, 2, 3, 4, 5))>>>>>>>>>>>> a, b = b, a # troca os valores de a e b

Tuplas

Page 39: Python

Estrutura de Dados

>>> tel = {'jack': 4098, 'sape': 4139}>>> tel['guido'] = 4127>>> tel{'sape': 4139, 'guido': 4127, 'jack': 4098}>>> tel['jack']4098>>> del tel['sape']>>> tel['irv'] = 4127>>> tel{'guido': 4127, 'irv': 4127, 'jack': 4098}>>> tel.keys()['guido', 'irv', 'jack']>>> 'guido' in telTrue

Dicionários

Page 40: Python

Módulos

• Um módulo é um arquivo Python contendo definições e instruções.– __name__ armazena o nome o módulo;

Page 41: Python

Módulos

# coding: utf-8# Módulo números de Fibonacci

def fib(n): # exibe a série de Fibonacci de 0 até n a, b = 0, 1 while b < n: print b, a, b = b, a+b

def fib2(n): # devolve a série de Fibonacci de 0 até n resultado = [] a, b = 0, 1 while b < n: resultado.append(b) a, b = b, a+b return resultado

Criando um módulo

Page 42: Python

Módulos

>>> import fibo>>>>>>>>> fibo.fib(1000)1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987>>> fibo.fib2(100)[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]>>> fibo.__name__'fibo'>>>>>>>>> fib = fibo.fib>>> fib(500)1 1 2 3 5 8 13 21 34 55 89 144 233 377

Importando e utilizando um módulo

Page 43: Python

Módulos

if __name__ == "__main__": import sys fib(int(sys.argv[1]))

Executando um módulo

Page 44: Python

Classes

• Em Python, as classes não trazem recursos fora do convencional.– Baseado em C++, Smalltalk e Modula-3;– Herança múltipla e todos os membros da classe são

públicos, como em C++;– Classes são objetos, como em Smalltalk;– As funções membro são virtuais, como em Modula-3;

Page 45: Python

Classes

class NomeDaClasse: <instrução-1> . . . <instrução-N

Sintaxe de definição de uma classe

Page 46: Python

Classes

>>> class MinhaClasse:... """Um exemplo simples de classe"""... i = 12345... def f(self):... return 'olá, mundo'... >>> x = MinhaClasse()>>> >>> class Complexo:... def __init__(self, parte_real, parte_imag):... self.r = parte_real... self.i = parte_imag...>>> x = Complexo(3.0, -4.5)>>> x.r, x.i(3.0, -4.5)

Criando um objeto classe

Page 47: Python

Classes

• Python não possui variáveis de instância privadas– Convenção: prefixo “__”• __name• __idade

Page 48: Python

Iteradores

class Inversor: """Iterador para percorrer uma sequencia de trás

para frente.""" def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): return self def next(self): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index]

Iteradores

Page 49: Python

Iteradores

>>> inv = Inversor('spam')>>> iter(inv)<__main__.Reverse object at 0x00A1DB50>>>> for car in inv:... print car...maps

Utilizando o iterador

Page 50: Python

Iteradores

• Você acaba de usar um recurso de meta-programação pra criar geradores.– Fácil né?

Page 51: Python

Ainda falta...

• Property• Decorators• Descriptors• __getattr__• Fameworks

Page 52: Python

Continuação

• Hangout• matheuslima.org• @matheeusLimaaa

Page 53: Python

Referências

• http://docs.python.org/tutorial/• http://turing.com.br/• Python para Desenvolvedores / Luiz Eduardo

Borges,Rio de Janeiro, Edição do Autor, 2010