Dojo de Python

40
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

Transcript of Dojo de Python

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

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

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

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

O Zen do Python, por Tim PetersBonito é 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

O Zen do PythonErros 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

Iniciando a depressãoHello world em "C#"

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

7 of 40 04/03/15 01:36

Iniciando a depressãoHello world em Java

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

8 of 40 04/03/15 01:36

Iniciando a depressãoHello world em Python

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

9 of 40 04/03/15 01:36

Iniciando a depressão

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

10 of 40 04/03/15 01:36

Palavras reservadas-and -del -from -not -while-as -elif -global -or -with-assert -else -if -pass -yield-break -except -import -print-class -exec -in -raise-continue -finally -is -return-def -for -lambda -try

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

11 of 40 04/03/15 01:36

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 = 113 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

Sintaxe amigável1 #reparem na diferença das aspas entre as duas strings2 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

IteráveisListas, dicionários e tuplas1 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

Orientação a objetosMé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.b10 #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

Funções e argument unpackingfunctions são métodos de escopo geral, definidos dentro demó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 612 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

args e kwargsPython tem um jeito padrão de utilizar listas e dicionários comoparâmetros em funções/métodos1 def funcao(*args):2 #executa alguma mágica3 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

Métodos em OOClasses 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 @classmethod15 def class_method(cls, a, b):16 print(a + b)17 @staticmethod18 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

"Multiplicidade" do PythonPython tem herança múltipla, atribuição múltipla e retorno múltiplo1 class MinhaClasse(OutraClasse,object):2 pass3 4 a, b = 1,25 6 def soma_e_multiplica(a, b):7 soma = a + b8 multiplica = a * b9 return soma, multiplica

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

19 of 40 04/03/15 01:36

Módulos e programação funcionalPython é uma linguagem multiparadigma e o funcional é parteimportantí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

Funções como objetosEm python, tudo é objeto. Incluindo as funções, que são cidadãos deprimeira classe1 def soma(a, b):2 return a+b3 4 soma(1,2)5 soma.__call__(1,2)6 #ambos exibem 37 type(soma)8 #<type 'function'>

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

21 of 40 04/03/15 01:36

DecoratorsDecorators 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_decorator10 def soma(a, b):11 return a+b12 13 if __name__ == '__main__':14 print soma(2,4)15 #exibe 616 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

Builtin functionsFunções embutidas na biblioteca padrão que não precisam serimportadas e fazem muitas, muitas coisas 1 abs() divmod() input() open() staticmethod() 2 all() enumerate() int() ord() str() 3 any() eval() isinstance() pow() sum() 4 basestring() execfile() issubclass() print() super() 5 bin() file() iter() property() tuple() 6 bool() filter() len() range() type() 7 bytearray() float() list() raw_input() unichr() 8 callable() format() locals() reduce() unicode() 9 chr() frozenset() long() reload() vars()10 classmethod() getattr() map() repr() xrange()11 cmp() globals() max() reversed() zip()12 compile() hasattr() memoryview() round() __import__()13 complex() hash() min() set() apply()14 delattr() help() next() setattr() buffer()15 dict() hex() object() slice() coerce()16 dir() id() oct() sorted() intern()

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

23 of 40 04/03/15 01:36

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

Arquivos e filesystemTrabalhar com arquivos e sistema de arquivos é muito fácil empython1 import os2 print(os.getcwd()) #exibe o caminho do diretório atual3 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

CallableFunçã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 False12 callable(x.soma)13 #retorna True

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

26 of 40 04/03/15 01:36

getattr e setattrgetattr: Função que obtém o valor de um atributo de um objetosetattr: 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

List ComprehensionSintaxe pythonica que facilita trabalhar com coleções. É umconstrutor de processamento de listas1 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

Map, Reduce, Filter e LambdaFunçõ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

Exemplos em lambda1 #reduce2 valores = [1, 2, 3, 4, 5]3 print reduce(lambda x, y: x + y, valores)4 5 #filter6 valores_filter = [10, 4, -1, 3, 5, -9, -11]7 print filter(lambda x: x > 0, valores_filter)

Exercício

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

30 of 40 04/03/15 01:36

Slicing de coleções1 a[start:end] # Traz os itens do início ao fim2 a[start:] # Traz o resto do array à partir de um ponto3 a[:end] # Traz o array até um ponto4 a[:] # Copia a lista5 6 a[-1] # último item do array7 a[-2:] # dois últimos itens array8 a[:-2] # tudo, exceto os dois últimos items9 a[::-1] # Inverte o array

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

31 of 40 04/03/15 01:36

Trabalhando com strings 1 #interpolação 2 nome, sobrenome, idade = "Bruno", 'Bemfica', 29 3 print "Me chamo %s %s e tenho %i anos" % (nome, sobrenome, idade) 4 print("Meu sobrenome eh {0}".format(sobrenome)) 5 #multilinha 6 frase = 'Python eh simplesmente 7 magnifico e trabalhar com python 8 eh bem divertido 9 '10 #strip/lstrip/rstrip 11 frase = ' python eh muito legal '12 frase.strip()13 #join14 print '\\'.join(['C:','Users','Bruno' ])15 #isalnum16 '1a2b3c4d5e'.isalnum()17 #isdigit18 '908'.isdigit()19 #partition20 print '123123'.partition('3')

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

32 of 40 04/03/15 01:36

Bibliotecas GráficasPyQTTKinterKivyLianja

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

33 of 40 04/03/15 01:36

Frameworks webTem 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

IDEs para desenvolvimentoSublimeText2TextMatePyCharmPyDevKomodo IDEWing IDE

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

35 of 40 04/03/15 01: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 sobreBlog 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

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

ContatosBrunobemfica [@] gmail.comwww.brunobemfica.comGithub.com/brunocodeman

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

38 of 40 04/03/15 01:36

One more thing1 import antigravity

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

39 of 40 04/03/15 01:36

Obrigado!

None file:///Users/brunobemfica/Documents/dojos/dojo_python_w...

40 of 40 04/03/15 01:36