Apresentação feita para introduzir Python a programadores de outras linguagens, mostrando alguns dos recursos da linguagem, programação funcional, orientação a objetos, list comprehensions, splicing, metaprogramação, dentre outras funcionalidades.
Código dos exercícios: https://github.com/BrunoCodeman/dojo_python
1. Como se sentir deprimido ao programar em outras linguagens
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
1 of 40 04/03/15 01:36
2. self.description
Bruno de Oliva Bemfica
Trabalho com TI há 14 anos (5 de infra, 9 de desenvolvimento)
Já trabalhei com C, Java, PHP, C#, VB.NET, Ruby e Python
Agilista (se não é agile, não funciona para software)
Fã de TDD, BDD, DDD, OMG, BBQ e todas essas siglas que ninguém entende
Um dos membros fundadores do PyTchê (http://pytche-site.readthedocs.org/en/latest/)
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
2 of 40 04/03/15 01:36
3. Um pouco de História
Lançada em 1991 por Guido Van Rossum
Interpretada ou compilada
Imperativa, orientada a objetos e strongly-typed
Nome vem de Monty Python
Mantida pela Python Software Foundation
Possui um ZEN
Possui PEPs (Python Enhancement Proposals)
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
3 of 40 04/03/15 01:36
4. Quem usa Python?
Google (spiders de busca, gmail, google groups, youtube)
Yahoo (yahoo groups)
Instagram
Dropbox
Pixar
NASA
CIA
FBI
Apple
Groupon
Grupo Pão de Açúcar
Pearson
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
4 of 40 04/03/15 01:36
5. O Zen do Python, por Tim Peters
Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Linear é melhor do que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o bastante para quebrar as regras.
Ainda que praticidade vença a pureza.
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
5 of 40 04/03/15 01:36
6. O Zen do Python
Erros nunca devem passar silenciosamente.
A menos que sejam explicitamente silenciados.
Diante da ambigüidade, recuse a tentação de adivinhar.
Deveria haver um — e preferencialmente só um — modo óbvio para fazer algo.
Embora esse modo possa não ser óbvio a princípio a menos que você seja holandês.
Agora é melhor que nunca.
Embora nunca freqüentemente seja melhor que já.
Se a implementação é difícil de explicar, é uma má idéia.
Se a implementação é fácil de explicar, pode ser uma boa idéia.
Namespaces são uma grande idéia — vamos ter mais dessas!
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
6 of 40 04/03/15 01:36
7. Iniciando a depressão
Hello world em "C#"
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
7 of 40 04/03/15 01:36
8. Iniciando a depressão
Hello world em Java
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
8 of 40 04/03/15 01:36
9. Iniciando a depressão
Hello world em Python
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
9 of 40 04/03/15 01:36
10. Iniciando a depressão
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
10 of 40 04/03/15 01:36
12. Show me the code!
Pequenos exemplos de código
1 #identação define o bloco de código
2 numeros = [1,2,3,4,5,6,7,8,9]
3 for numero in numeros:
4 if numero % 2 == 0:
5 print 'o numero %i eh par' % numero
6 else:
7 print 'o numero %i eh impar' % numero
8 else:
9 print('lista vazia')
10
11
12 x = 1
13 while(x<10):
14 print(x)
15 x+=1
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
12 of 40 04/03/15 01:36
13. Sintaxe amigável
1 #reparem na diferença das aspas entre as duas strings
2 nome = "Bruno"
3 sobrenome = 'Bemfica'
4 print(nome.__class__ is str and nome is not None)
5 print('olá')
6
7 string_vazia = ''
8 print('valor nulo' if string_vazia else 'string possui valor')
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
13 of 40 04/03/15 01:36
14. Iteráveis
Listas, dicionários e tuplas
1 lista = [1,2,3, 'Python', None, 3.14]
2
3 dicionario = {'a':1,'b':'Python','c':3.14}
4
5 outro_dicionario=dict(a=1,b=2,c=3)
6
7 tupla = (4,5,6, '', None)
8
9 lista_sem_repeticao = set('ara ararauna')#strings também são iteráveis
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
14 of 40 04/03/15 01:36
15. Orientação a objetos
Métodos e classes
1 class MinhaClasse:
2 #o inicializador tem parâmetros opcionais
3 def __init__(self,a=0,b=0):
4 self.a = a
5 self.b = b
6 def soma(a,b):
7 return a+b
8 def soma_propriedades(self):
9 return self.a + self.b
10 #Cadê os getters e seters?
11
12 class OutraClasse(MinhaClasse,object):
13 """ new style class com herança múltipla"""
14 pass
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
15 of 40 04/03/15 01:36
16. Funções e argument unpacking
functions são métodos de escopo geral, definidos dentro de
módulos.
1 from datetime import datetime as datahora
2 def que_horas_sao():
3 data = datahora.now().date()
4 hora = datahora.now().time()
5 print('executando no dia %s, às %s horas' %(data, hora)
6
7 def somar(a, b, c):
8 return a + b + c
9 numeros = [1,2,3]
10 print somar(numeros)
11 #Exibe 6
12 outros_numeros = {'a':2, 'b':4 , 'c':6 }
13 print somar(**outros_numeros)
14 #Exibe 12
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
16 of 40 04/03/15 01:36
17. args e kwargs
Python tem um jeito padrão de utilizar listas e dicionários como
parâmetros em funções/métodos
1 def funcao(*args):
2 #executa alguma mágica
3
4 def outra_funcao(**kwargs):
5 #executa outra mágica
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
17 of 40 04/03/15 01:36
18. Métodos em OO
Classes possuem métodos estáticos, de classe e de objetos
(exemplos em arquivo)
1 class MyClass:
2 def __init__(self, a, b):
3 self.a = a
4 self.b = b
5 #método protected
6 def _print_a(self):
7 print('a vale %s' %str(self.a))
8 #método private
9 def __print_b(self):
10 print('b vale %s' %str(self.b))
11 def method(self):
12 self._print_a()
13 self.__print_b()
14 @classmethod
15 def class_method(cls, a, b):
16 print(a + b)
17 @staticmethod
18 def static_method(a, b):
19 print(a + b)
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
18 of 40 04/03/15 01:36
19. "Multiplicidade" do Python
Python tem herança múltipla, atribuição múltipla e retorno múltiplo
1 class MinhaClasse(OutraClasse,object):
2 pass
3
4 a, b = 1,2
5
6 def soma_e_multiplica(a, b):
7 soma = a + b
8 multiplica = a * b
9 return soma, multiplica
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
19 of 40 04/03/15 01:36
20. Módulos e programação funcional
Python é uma linguagem multiparadigma e o funcional é parte
importantíssima disso
1 import datetime as datahora #isto é um alias ao import
2
3 def data_hora():
4 print('data e hora atual' % datahora.datetime.now())
5
6 def data_hora_utc():
7 print('data e hora UTC' % datahora.datetime.utcnow())
8
9 if __name__ == '__main__':
10 data_hora()
11 data_hora_utc()
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
20 of 40 04/03/15 01:36
21. Funções como objetos
Em python, tudo é objeto. Incluindo as funções, que são cidadãos de
primeira classe
1 def soma(a, b):
2 return a+b
3
4 soma(1,2)
5 soma.__call__(1,2)
6 #ambos exibem 3
7 type(soma)
8 #<type 'function'>
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
21 of 40 04/03/15 01:36
22. Decorators
Decorators são funções que executam rotinas complementares à
função decorada
1 def pares_decorator(func):
2 def checa_pares(a, b):
3 if a % 2 == 0 and b % 2 == 0:
4 return a+b
5 else:
6 return 'os parâmetros não são pares'
7 return checa_pares
8
9 @pares_decorator
10 def soma(a, b):
11 return a+b
12
13 if __name__ == '__main__':
14 print soma(2,4)
15 #exibe 6
16 print soma(2,3)
17 # exibe a mensagem
Exercício!
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
22 of 40 04/03/15 01:36
24. Quantas funções!Não tem um JavaDoc?
Usamos builtin functions!
Função dir()
Função help()
Exercício!
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
24 of 40 04/03/15 01:36
25. Arquivos e filesystem
Trabalhar com arquivos e sistema de arquivos é muito fácil em
python
1 import os
2 print(os.getcwd()) #exibe o caminho do diretório atual
3 os.system('ifconfig')
4 arquivo = open('arquivo.txt','w')
5 arquivo.write('Arquivo escrito em python')
6 arquivo.close()
Exercício!
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
25 of 40 04/03/15 01:36
26. Callable
Função que checa se o argumento é "chamável"
1 class Teste():
2
3 def __init__(self,a):
4 self.a = a
5
6 def soma(self,z):
7 return self.a + z
8
9 x = Teste(1)
10 callable(x.a)
11 #retorna False
12 callable(x.soma)
13 #retorna True
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
26 of 40 04/03/15 01:36
27. getattr e setattr
getattr: Função que obtém o valor de um atributo de um objeto
setattr: Função que atribui um valor a um atributo de um objeto
1 class Teste():
2
3 def __init__(self,a):
4 self.a = a
5
6 def soma(self,z):
7 return self.a + z
8
9 x = Teste('dojo de python')
10 atributo = getattr(x, 'a')
11 print(atributo)
12 #exibe 'dojo de python'
13 setattr(x, 'a', 'novo valor')
14 print(atributo)
15 #exibe 'novo valor'
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
27 of 40 04/03/15 01:36
28. List Comprehension
Sintaxe pythonica que facilita trabalhar com coleções. É um
construtor de processamento de listas
1 numeros = range(10)
2 print [numero for numero in numeros]
3
4 lista = range(100)
5 lista_ao_quadrado = [x for x in L if x**2 > 3]
Exercício
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
28 of 40 04/03/15 01:36
29. Map, Reduce, Filter e Lambda
Funções builtin muito úteis para trabalho com coleções.
map: Mapeia uma função para cada variável da coleção
reduce: Aplica uma função à coleção, como um todo
filter: Filtra os elementos de uma lista
lambda: Função anônima para executar pequenas instruções de código
Exercício!
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
29 of 40 04/03/15 01:36
31. Slicing de coleções
1 a[start:end] # Traz os itens do início ao fim
2 a[start:] # Traz o resto do array à partir de um ponto
3 a[:end] # Traz o array até um ponto
4 a[:] # Copia a lista
5
6 a[-1] # último item do array
7 a[-2:] # dois últimos itens array
8 a[:-2] # tudo, exceto os dois últimos items
9 a[::-1] # Inverte o array
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
31 of 40 04/03/15 01:36
34. Frameworks web
Tem para todos os gostos:
Pyramid
Bottle
Pylons
Django
TurboGears
Web2py
Flask
WebWare
CherryPy
Plone
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
34 of 40 04/03/15 01:36
36. Aonde posso aprender mais?
Apostila do ark4n (http://ark4n.wordpress.com/python/)
Dive into python (http://www.diveintopython.net/)
Mutirão PyCursos (vídeos no Youtube)
Python para zumbis (Curso do Fernando Masanori)
Vídeos do google sobre
Blog do Vinicius "Ban" Assef (http://aprenda-
python.blogspot.com.br/)
Site do Sérgio Berlotto (http://www.pythonrs.org/)
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
36 of 40 04/03/15 01:36
37. Grupo de usuários de Python do RS
"Subgrupo" do MateHackers
Estamos no Bunker 360 (Av. Independência, 330 - Sala 206 - Porto Alegre/RS)
Encontros semanais (Quintas-feiras, 19:30)
http://pytche-site.readthedocs.org/en/latest/
None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...
37 of 40 04/03/15 01:36