Minicurso de Python

10,989 views
10,854 views

Published on

Minicurso de Python apresentado durante a I Jornada Acadêmica de Ciência, Tecnologia e Cultura do Centro Federal de Educação Tecnológica do Espírito Santo.

Published in: Education
3 Comments
21 Likes
Statistics
Notes
No Downloads
Views
Total views
10,989
On SlideShare
0
From Embeds
0
Number of Embeds
99
Actions
Shares
0
Downloads
904
Comments
3
Likes
21
Embeds 0
No embeds

No notes for slide

Minicurso de Python

  1. 1. Conceitos Básicos, Estruturas de Dados e Orientação a objetos Minicurso de Python Francisco A. S. Souza I Jornada Acadêmica de Ciência, Tecnologia e Cultura
  2. 2. Sobre o autor <ul><li>19 anos :) </li></ul><ul><li>Aluno do quarto módulo do curso Técnico de Informática do Cefetes, Uned Cachoeiro de Itapemirim; </li></ul><ul><li>O resto é resto ;P </li></ul>
  3. 3. O que é Python? <ul><li>Python é uma linguagem de programação de altíssimo nível (VHLPL – very high level programming language ), interpretada, orientada a objetos, de tipagem forte e dinâmica criada por Guido van Rossum em 1991. </li></ul><ul><li>A linguagem tem um modelo de desenvolvimento aberto mantido pela PSF ( Python Software Foundation ). </li></ul>
  4. 4. O que é Python? <ul><li>A linguagem foi projetada com a filosofia de enfatizar a importância do esforço do programador sobre o esforço computacional. Prioriza a legibilidade do código sobre a velocidade ou expressividade. </li></ul>
  5. 5. Quem usa Python? <ul><li>Atualmente Python é uma das linguagens mais utilizadas em grandes projetos no mundo. Engenheiros de software de empresas como Google afirmam que o uso de Python é essencial para o funcionamento de famosas ferramentas do Google. “C++ quando necessitamos, Python quando podemos” . </li></ul><ul><li>As ferramentas Google Doc , Picasa , Orkut Help , dentre outras da empresa americana Google utilizam a linguagem Python. </li></ul>
  6. 6. Quem usa Python? <ul><li>Grande parte da API do Google é desenvolvida em Python. </li></ul><ul><li>O Google App Engine (framework web online mantido pelo Google) oferece suporte total a Python e foi desenvolvido também em Python. </li></ul><ul><li>Zope, um dos melhores servidores de aplicação da atualidade foi desenvolvido em Python. </li></ul>
  7. 7. Quem usa Python? <ul><li>Plone, que é uma aplicação do Zope, foi desenvolvido em Python e é utilizado largamente em diversos web sites: Governo Brasileiro, Portal da Câmara dos Deputados, CEFET-Campos, PyCon Brasil, Novell, Free Software Foundation, etc. </li></ul><ul><li>Diversas empresas que fabricam distribuições Linux utilizam softwares personalizados feitos em Python: Novell (SuSE e Open SuSE), Canonical (Ubuntu), Red Hat, dentre outras. </li></ul><ul><li>A Microsoft também investe fortemente em Python, no desenvolvimento da linguagem para o .NET Framework </li></ul>
  8. 8. Quem usa Python? <ul><li>Empresas que patrocinam a Python Software Foundation : ActiveState ; ASTi; Array BioPharma, Inc.; BizRate.com; Canonical ; CCP Games; cPacket Networks; EarnMyDegree.com; Enthought, Inc.; Google ; HitFlip, Inc.; IronPort Systems; Madison Tyler LLC; Merfin LLC; Microsoft ; O'Reilly & Associates, Inc. ; Opsware, Inc.; Strakt Holdings, Inc.; Sun Microsystems ; Tabblo; ZeOmega; Zope Corporation . </li></ul>
  9. 9. Por que usar Python? <ul><li>Python é portável, você não precisa compilar seu programa cada vez que muda de sistema operacional, basta apenas que exista um interpretador Python instalado. </li></ul><ul><li>Python é open-source com licença flexível, há uma comunidade que desenvolve a linguagem, que está sempre aprimorando-a e qualquer um de nós pode fazer parte dessa comunidade. A licença flexível nos permite desenvolver softwares proprietários com ferramentas livres. </li></ul>
  10. 10. Por que usar Python? <ul><li>Python é simples e auto-descritiva, algumas linguagens de programação têm sintaxe complexa ou difícil de memorizar. </li></ul><ul><li>Vejamos alguns exemplos de código para declarar uma classe ( Faladora ) que tem o método público dizerOi que recebe uma string que representa o nome de alguma pessoa e escreve uma mensagem de boas vindas para esta pessoa na tela. Instanciaremos um objeto falador da classe e chamaremos este método. </li></ul>
  11. 11. Por que usar Python? <ul><li>PHP: </li></ul><?php class Faladora { public function dizerOi($nome){ echo &quot;Olá $nome! <br />&quot; ; } } $falador = new Faladora(); $falador->dizerOi ( “Francisco” ); ?>
  12. 12. Por que usar Python? <ul><li>C++: </li></ul>void Faladora::dizerOi(string* nome){ cout << “Olá” << nome->c_str() << “!” << endl; } int main( void ) { Faladora* falador = new Faladora(); falador->dizerOi( new string ( “Francisco” )); } class Faladora { public: void dizerOi(string* nome); };
  13. 13. Por que usar Python? <ul><li>Java: </li></ul>package minicurso; public class Faladora { public void dizerOi(String nome) { System. out .println( &quot;Olá “ + nome + &quot;mundo!&quot; ); } public static void main(String[] args) { Faladora falador = new Faladora(); falador.dizerOi( “Francisco” ); } }
  14. 14. Por que usar Python? <ul><li>Python: </li></ul>class Faladora : def dizerOi ( self , nome): print ( &quot;Olá %s!&quot; ) %(nome) falador = Faladora() falador.dizerOi( “Francisco&quot; )
  15. 15. Por que usar Python? <ul><li>Note que é simples e objetivo! :) </li></ul><ul><li>A presença de um interpretador interativo (assim como Ruby) também é uma vantagem, pois é interessante para iniciantes utilizarem um “interpretador de comandos”. </li></ul><ul><li>Vamos brincar um pouco com o interpretador? </li></ul>
  16. 16. Utilizando o interpretador <ul><li>Para executar o interpretador no Windows, vá em Iniciar > Executar e digite python. </li></ul><ul><li>Vale lembrar que o Python deve estar devidamente instalado. </li></ul><ul><li>É possível que não funcione desta forma, pois o Python pode não estar configurado no PATH do Windows, neste caso é necessário achar o diretório de instalação do Python e executar o arquivo python.exe . </li></ul>
  17. 17. Utilizando o interpretador
  18. 18. Utilizando o interpretador <ul><li>Para executar o interpretador no Linux, abra o terminal e digite “python” . </li></ul><ul><li>Todas as distribuições Linux que trazem interface gráfica hoje vêm com o Python instalado, já que diversos softwares para este sistema operacional são feitos em Python. Desta forma, geralmente não é necessário instalar o Python em distribuições Linux. </li></ul>
  19. 19. Utilizando o interpretador
  20. 20. Utilizando o interpretador
  21. 21. Utilizando o interpretador <ul><li>Alguns comandos básicos do interpretador: </li></ul><ul><li>help() </li></ul><ul><li>import this </li></ul><ul><li>E o nosso primeiro comando conhecido em Python: </li></ul><ul><li>print(“Olá mundo!”) </li></ul>
  22. 22. Resumo de características <ul><li>Case sensitive; </li></ul><ul><li>Tipagem dinâmica e forte; </li></ul><ul><li>Linguagem pura: 100% orientada a objetos; </li></ul><ul><li>Código auto-descritivo: simples e de fácil leitura; </li></ul><ul><li>Programação em alto-nível: não permite manipulação de ponteiros; </li></ul><ul><li>Não suporta sobrecarga de funções; </li></ul><ul><li>Visa facilitar o desenvolvimento, foco em produtividade. :) </li></ul>
  23. 23. Achou o interpretador feio?
  24. 24. Achou o interpretador feio?
  25. 25. Achou o interpretador feio?
  26. 26. Achou o interpretador feio?
  27. 27. Achou o interpretador feio?
  28. 28. Achou o interpretador feio?
  29. 29. Sintaxe if x > y: big = x small = y else: big = y small = x Simples e objetivo! Não é preciso saber programação para entender este código, basta um conhecimento básico em inglês!
  30. 30. Variáveis <ul><li>O conceito de variável em Python é representado sempre por um objeto. Na verdade, Python é uma linguagem pura, ou seja, tudo em Python é um objeto. </li></ul><ul><li>Toda variável é uma referência! </li></ul><ul><li>Variáveis armazenam endereços de memória e não valores! </li></ul>
  31. 31. Variáveis <ul><li>Python possui tipagem dinâmica e forte; </li></ul><ul><li>Tipagem dinâmica significa que a variável assume o tipo de acordo com o valor atribuído; </li></ul><ul><li>Tipagem forte significa que se uma variável é do tipo inteiro, ela deve ser tratada como um inteiro, ou convertida para ser tratada de outra forma; </li></ul><ul><li>Para mudar o tipo de uma variável, devemos declará-la novamente; </li></ul>
  32. 32. Variáveis n1 = &quot;10&quot; n2 = 19 soma = n1 + n2 Qual o tipo de n1? Qual o tipo de n2? O que acontece aqui?
  33. 33. Lendo do Teclado <ul><li>Em Python, a leitura de dados do teclado é feita através das funções raw_input e input . </li></ul>nome = raw_input(&quot;Digite seu nome: &quot;) idade = input(&quot;Digite sua idade: &quot;) print(&quot;Digite seu sexo: &quot;) sexo = sys.stdin.readline() Assim funciona, mas você não precisa disso! ;) A função raw_input sempre retorna uma string. A função input “adivinha” o tipo digitado e retorna. CUIDADO !
  34. 34. Escrevendo na Tela <ul><li>Para escrita na tela, utilizamos o comando print . Vale lembrar que o print não é uma função (passará a ser na versão 3.0 do Python). </li></ul><ul><li>Porém, utilizaremos o print do futuro! Utilizaremos o print como função. </li></ul>
  35. 35. Escrevendo na Tela print &quot;Pulei linha&quot; print &quot;Não pulei linha&quot;, print( &quot;Pulei linha&quot;) print( &quot;Não pulei linha&quot; , end= &quot;&quot;) Python 2.x Python 3.0
  36. 36. Lendo e Escrevendo em Arquivos <ul><li>Leitura de arquivos em Python é simples como em C! </li></ul><ul><li>Arquivos são objetos do tipo file ; </li></ul><ul><li>Para a abertura de um arquivo, utilizamos a função open ; </li></ul><ul><li>A função open funciona como uma fábrica de instâncias. </li></ul>
  37. 37. Lendo e Escrevendo em Arquivos arquivo = open(&quot;entrada.txt&quot;) for linha in arquivo: print(linha) for linha in arquivo: linha = linha.replace(&quot; &quot;, &quot;&quot;) palavras = linha.split(' ') for palavra in palavras: print(palavra) Abrindo o arquivo para leitura Imprimindo uma linha do arquivo a cada duas linhas da tela. Imprimindo uma palavra por linha
  38. 38. Operadores <ul><li>Os operadores do Python: </li></ul>is in <= >= Lógicos Comparação Aritméticos < / not > * or != - and == +
  39. 39. Módulos <ul><li>Módulo é o agrupamento de comandos para o operador. Numa definição mais informal, módulo é um arquivo de código-fonte Python. </li></ul><ul><li>Módulos são arquivos definidos com as extensões .py , .pyc , .pyo , .pyw , dentre outras menos utilizadas. </li></ul><ul><li>Nossos módulos terão sempre a extensão .py, pois se trata da extensão para código fonte de execução em terminal. </li></ul><ul><li>Em Python é possível definir mais de uma classe por arquivo (módulo). </li></ul>
  40. 40. Strings <ul><li>Conheceremos rapidamente strings em Python e como manipulá-las. </li></ul><ul><li>A string em Python é representada pela classe str . Toda string possui estado e comportamento provido pela classe str . </li></ul>
  41. 41. Strings <ul><li>Conheceremos agora alguns métodos para trabalhar com strings: </li></ul><ul><ul><li>__len__ () : Retorna o tamanho da string; </li></ul></ul><ul><ul><li>__getslice__ ( inicio , fim ) : Retorna uma substring de inicio até fim . </li></ul></ul><ul><ul><li>capitalize () : Retorna a mesma string com a primeira letra em maiúsculo. </li></ul></ul><ul><ul><li>upper () : Retorna a mesma string com todas as letras em maiúsculo. </li></ul></ul><ul><ul><li>lower () : Retorna a mesma string com todas as letras em minúsculo. </li></ul></ul>
  42. 42. Strings <ul><li>Mais métodos: </li></ul><ul><ul><li>replace ( antigo , novo ) : Retorna a mesma string com o valor novo em todas as ocorrências de antigo . </li></ul></ul><ul><ul><li>split ([ separador ]) : Retorna uma lista de strings. Caso o separador não seja especificado, a lista será dividida por espaços em branco. </li></ul></ul>
  43. 43. Strings string = &quot;Este eh apenas um teste com a string&quot; print(string.__len__()) print(string.__getslice__(0, 5)) print(string.upper()) print(string.capitalize()) print(string.lower()) print(string.replace( &quot;eh&quot; , &quot;foi&quot; )) print(string.split())
  44. 44. Estruturas de Dados <ul><li>Estruturas de dados englobam tipos compostos e dados complexos; </li></ul><ul><li>As estruturas de dados mais famosas são vetores e matrizes. Dentre as mais avançadas, a mais conhecida é a lista. </li></ul><ul><li>Há ainda outras estruturas como árvore, pilha, fila, hash, etc. </li></ul><ul><li>Vale lembrar que uma string também é uma estrutura de dados! </li></ul><ul><li>Estudaremos três estruturas: List , Tuple e Dict . </li></ul>
  45. 45. Estruturas de Dados: List <ul><li>A list (lista) é uma das mais conhecidas estruturas de dados. </li></ul><ul><li>Em Python, a lista tem estado e comportamento que faz uma espécie de mistura entre o comportamento de vetores (acesso rápido por índices) e listas (“iterabilidade”); </li></ul><ul><li>Aviso aos programadores PHP: Em Python não é permitido adicionar novos elementos em uma lista “criando” um índice, é necessário utilizar o método append () para adicionar um novo elemento! </li></ul>
  46. 46. Estruturas de Dados: List <ul><li>Antes de por a mão na massa, um simples exemplo: </li></ul>alunos = [] alunos.append( &quot;Monica&quot; ) alunos.append( &quot;Cascao&quot; ) alunos.append( &quot;Cebolinha&quot; ) alunos.reverse() for nome in alunos: print nome
  47. 47. Estruturas de Dados: List <ul><li>Agora vamos fazer a mesma coisa, de forma diferente: </li></ul>alunos = [ &quot;Monica&quot; , &quot;Cascao&quot; , &quot;Cebolinha&quot; ] alunos.reverse() tamanho = alunos.__len__() i = 0 while i < tamanho: print(alunos[i]) i += 1
  48. 48. Estruturas de Dados: List <ul><li>Veremos agora alguns métodos para trabalhar com listas: </li></ul><ul><ul><li>append ( elemento ): adiciona elemento ao fim da lista. </li></ul></ul><ul><ul><li>count ( elemento ) : retorna um inteiro contendo a quantidade de vezes que elemento aparece na lista. </li></ul></ul><ul><ul><li>reverse () : inverte a ordem dos elementos da lista. </li></ul></ul><ul><ul><li>remove ( elemento ) : remove da lista o primeiro elemento encontrado. </li></ul></ul>
  49. 49. Estruturas de Dados: List teste = [ &quot;Nome1&quot; , &quot;Nome2&quot; , &quot;Nome3&quot; ] teste.append( &quot;Nome4&quot; ) teste.append( &quot;Nome2&quot; ) print(teste.count( &quot;Nome2&quot; )) teste.reverse() teste.remove( &quot;Nome2&quot; ) print(teste)
  50. 50. Gerando Listas <ul><li>Python possui formas de gerar listas, veremos duas; </li></ul><ul><li>Uma das primeiras funções que todos aprendem em Python é a função range , que gera uma lista de inteiros; </li></ul>
  51. 51. Gerando Listas lista1 = range(1500) lista2 = range(1001, 2000) Gera uma lista de 0 até 1499. Gera uma lista de 1001 até 1999.
  52. 52. Gerando Listas <ul><li>Há ainda uma forma “avançada” de gerar listas a partir de outras listas; </li></ul><ul><li>Trata-se da técnica List Comprehension (Compreensão de Listas); </li></ul><ul><li>A sintaxe de List Comprehension vem da linguagem funcional Haskell; </li></ul><ul><li>O nome e a sintaxe originam da Matemática: Compreensão de listas tem sintaxe praticamente igual à notação axiomática de compreensão (Teoria de Conjuntos); </li></ul>
  53. 53. Gerando Listas <ul><li>Supondo que seu amado professor de algoritmos lhe passou o seguinte exercício: “Elabore um algoritmo que leia um número x e imprima todos os ímpares entre 0 e x” . </li></ul><ul><li>Bom, nosso primeiro pensamento é fazer assim: </li></ul>x = int(raw_input(&quot;Digite um inteiro: &quot;)) numeros = range(x + 1) for z in numeros: if z % 2 == 1: print(z)
  54. 54. Gerando Listas <ul><li>Não estamos programando em Java! </li></ul>x = int(raw_input(&quot;Digite um inteiro: &quot;)) impares = [z for z in xrange(x + 1) if z % 2 == 1] for n in impares: print(n) z : z pertence a lista e z for ímpar. Matemática
  55. 55. Estruturas de Dados: Tuple <ul><li>Tuplas são como as listas, a diferença é que tuplas são estruturas de dados imutáveis. </li></ul><ul><li>Pode-se dizer que, em Python, uma string é uma tupla de caracteres. </li></ul><ul><li>Vamos a um exemplo para melhor compreensão. Veremos primeiro o que não é possível fazer com tuplas. </li></ul>
  56. 56. Estruturas de Dados: Tuple tupla = ( &quot;Teste 1&quot; , &quot;Teste 2&quot; ) tupla[0] = &quot;Teste 3&quot; tupla.append( &quot;Teste 4&quot; ) TypeError: 'tuple' object does not support item assignment AttributeError: 'tuple' object has no attribute 'append'
  57. 57. Estruturas de Dados: Tuple <ul><li>Vale lembrar que da mesma forma que fazemos com strings, também podemos concatenar tuplas. </li></ul>tupla = ( &quot;Teste1&quot; , &quot;Teste2&quot; , &quot;Teste3&quot; ) tupla += ( &quot;Teste4&quot; , &quot;Teste5&quot; , &quot;Teste6&quot; ) tupla2 = ( &quot;Teste7&quot; , &quot;Teste8&quot; , &quot;Teste9&quot; ) tuplas = tupla + tupla2
  58. 58. Estruturas de Dados: Dict <ul><li>Chamaremos dicts de dicionários, para facilitar a fala em português; </li></ul><ul><li>Um dicionário é uma estrutura de dados onde cada nó é composto por uma chave e um valor; </li></ul><ul><li>Têm este nome pois são praticamente a mesma coisa que um dicionário! </li></ul>
  59. 59. Estruturas de Dados: Dict dicionario = {} dicionario[ &quot;teste&quot; ] = &quot;A palavra teste significa que estamos testando&quot; dicionario[ &quot;testado&quot; ] = &quot;A palavra testado significa que algo jah passou por um teste&quot; dicionario[ &quot;testando&quot; ] = &quot;A palavra testando significa que algo estah passando por um teste&quot; pessoas = { &quot;Maria&quot; : &quot;Nome antigo&quot; , &quot;Shyana&quot; : &quot;Nome complicado&quot; }
  60. 60. Estruturas de Dados: Dict <ul><li>Alguns métodos de manipulação de dicionários: </li></ul><ul><ul><li>get ( indice ) : retorna o valor correspondente a indice . </li></ul></ul><ul><ul><li>items () : retorna uma lista de tuplas, no formato (índice, valor) . </li></ul></ul><ul><ul><li>values () : retorna uma lista com todos os valores do dicionário. </li></ul></ul><ul><ul><li>keys () : retorna uma lista com todas as chaves do dicionário. </li></ul></ul><ul><ul><li>clear () : remove todos os itens do dicionário. </li></ul></ul>
  61. 61. Estruturas de Dados: Dict pessoas = { &quot;Maria&quot; : &quot;Nome antigo&quot; , &quot;Shyana&quot; : &quot;Nome complicado&quot; } print(pessoas.get( &quot;Maria&quot; )) print(pessoas.items()) print(pessoas.values()) print(pessoas.keys()) pessoas.clear() print(pessoas)
  62. 62. Controle de fluxo if n1 > n2: maior = n1 else: maior = n2 while i < 5: i += 1 numeros = [21, 5, 10] for numero in numeros: print(numero) Blocos de código definidos por endentação! O for do Python funciona como o foreach do PHP e do Fortran 90, ou o enhanced for do Java, ou seja, é percorrida uma estrutura de dados, pegando elemento por elemento da estrutura.
  63. 63. (Blocos de código) <ul><li>Como todos já perceberam, em Python não utilizamos caracteres ou palavras para delimitar blocos de código. </li></ul><ul><li>Em C e linguagens derivadas, utilizamos o {}, em Pascal utilizamos begin .. end. </li></ul><ul><li>Em Python, o que determina o início e o fim de um bloco é endentação . </li></ul>
  64. 64. Prática <ul><li>Faça um algoritmo que leia um número x e imprima a soma de todos os ímpares entre 1 e x; </li></ul><ul><li>Desafio: faça o algoritmo acima sem usar controle de fluxo. </li></ul>
  65. 65. Orientação a Objetos em Python
  66. 66. Orientação a objetos <ul><li>Python é uma linguagem 100% orientada a objetos, significa que tudo em Python é um objeto! </li></ul><ul><li>Veremos nos próximos slides como definir classes, atributos, métodos e como aplicar em Python diversos conceitos da Orientação a Objetos. </li></ul>
  67. 67. Definindo Classes class Veiculo(object): pass Palavra class tipicamente utilizada para definir classes! (: Palavra reservada pass , siginifica: passe este bloco.
  68. 68. Prática <ul><li>Defina a classe vazia “Tamagoshi”. </li></ul>
  69. 69. Definindo Atributos <ul><li>Existem duas formas de definir atributos de instância em Python; </li></ul>class Veiculo(object): pass fusca = Veiculo() fusca.marca = &quot;Volkswagen&quot; fusca.ano = 1972 class Veiculo(object): marca = None ano = None gol = Veiculo() gol.marca = &quot;Volkswagen&quot; gol.ano = 2008
  70. 70. Atributo de classe ou de instância? <ul><li>Um tema que costuma gerar dúvida é sobre atributos de classe e de instância; </li></ul><ul><li>Em Java e outras linguagens com tipagem estática e suporte a classes, estes conceitos costumam se misturar; </li></ul><ul><li>Mas em Python estes conceitos são atômicos e o entendimento de cada um é simples, por incrível que pareça! </li></ul>
  71. 71. Atributo de classe ou de instância? <ul><li>Um atributo de classe é um atributo definido na classe; </li></ul><ul><li>Um atributo de instância é um atributo definido na instância da classe (objeto); </li></ul><ul><li>Todo atributo de classe é refletido nas instâncias; </li></ul><ul><li>Atributos de instâncias são únicos e pertencem apenas à uma instância específica; </li></ul>
  72. 72. Atributo de classe ou de instância? class Veiculo(object): pass fusca = Veiculo() fusca.marca = &quot;Volkswagen&quot; fusca.ano = 1972 marca e ano são atributos de instância, se criarmos outro objeto da classe Veiculo estes atributos não existirão na nova instância.
  73. 73. Prática <ul><li>Defina os seguintes atributos na classe Tamagoshi: nome, fome, saude e idade. </li></ul>
  74. 74. Definindo métodos <ul><li>Um método é um atributo com comportamento; </li></ul><ul><li>Para não fundir conceitos, vamos apenas trabalhar com métodos da forma tradicional, ou quase isso; </li></ul><ul><li>Para definir métodos e funções em Python utilizamos a palavra reservada def ; </li></ul>
  75. 75. Definindo métodos class Veiculo(object): marca = None ano = None def andar( self ): print(&quot;O carro esta andando!&quot;) gol = Veiculo() gol.marca = &quot;Volkswagen&quot; gol.ano = 2008 gol.andar() Aqui está nosso método andar!
  76. 76. Self?!?! <ul><li>Quando definimos nosso método, determinamos um parâmetro, o self ; </li></ul><ul><li>Quando utilizamos o método, porém, não passamos nenhum parâmetro! </li></ul><ul><li>Quem é esse tal de self? </li></ul>
  77. 77. Self?!?! #include &quot;Veiculo.h&quot; void Veiculo::setAno(int ano){ this ->ano = ano; } Quem é esse tal de this ? class Veiculo { public: string* marca; int ano; void setAno(int ano); };
  78. 78. Self?!?! public class Veiculo { public String marca = null; public Integer ano = null; public void setAno(Integer ano){ this .ano = ano; } } Quem é esse tal de this ?
  79. 79. Prática <ul><li>Defina os seguintes métodos na classe Tamagoshi: alterarNome , alterarFome , alterarSaude , retornarNome , retornarFome e retornarSaude . Estes métodos deverão acessar os atributos anteriormente declarados; </li></ul><ul><li>Defina o método retornarHumor , o humor não é um atributo, mas sim a soma entre a fome e a saúde; </li></ul>
  80. 80. Métodos estáticos <ul><li>O conceito de método estático muitas vezes é confundido com o conceito de função em linguagens como Java e C#, que não suportam “métodos globais” (funções); </li></ul><ul><li>O uso de métodos estáticos em Python é incomum, mas existe; </li></ul><ul><li>Para definir um método estático utilizamos a anotação staticmethod ; </li></ul>
  81. 81. Métodos estáticos class Veiculo(object): marca = None ano = None def __init__(self, marca = None, ano = None): self.marca = marca self.ano = ano def andar(self): print(&quot;O carro esta andando!&quot;) @staticmethod def getDefaultInstance(): return Veiculo(&quot;&quot;, 0) Por que não tem self ?
  82. 82. Prática <ul><li>Defina um método estático obterInstanciaPadrao na classe Tamagoshi. </li></ul>
  83. 83. O que é um objeto? <ul><li>Antes de falarmos sobre instâncias, vamos pensar um pouco: o que é um objeto? </li></ul>
  84. 84. O que é um objeto? <ul><li>Segundo Fernando Lozano, objeto é a representação de uma coisa física, tangível, uma idéia ou um conceito. Possui um estado (o que ele sabe) e um comportamento (o que ele é capaz de fazer, como ele reage a estímulos externos). </li></ul>
  85. 85. Importante saber! <ul><li>A definição de objeto não é “um objeto é a instância de uma classe”; </li></ul><ul><li>Objeto tem estado; </li></ul><ul><li>Objeto tem comportamento; </li></ul><ul><li>Objeto é a abstração de algo tangível; </li></ul><ul><li>Em Python, tudo é objeto. </li></ul>
  86. 86. Instanciando objetos <ul><li>Já vimos isso de forma “não oficial”; </li></ul><ul><li>Agora veremos oficialmente a sintaxe para instanciar objetos de uma classe! </li></ul>gol = Veiculo() gol.marca = &quot;Volkswagen&quot; gol.ano = 2008 gol.andar() Não tem new !
  87. 87. Instanciando objetos <ul><li>Quando instanciamos um objeto, acontecem internamente algumas operações: alocação de memória; definição de referência (ponteiro); etc. </li></ul><ul><li>É comum a inicialização de atributos quando inicializamos objetos; </li></ul><ul><li>Em outras linguagens, temos a possibilidade de fazer a implementação do construtor; </li></ul>
  88. 88. O que é um método construtor?
  89. 89. O que é um método construtor? <ul><li>É um método especial que constrói o objeto, ou seja, é o método que retorna uma instância de determinada classe; </li></ul><ul><li>Em Python, o construtor chama-se __new__ ; </li></ul><ul><li>Porém geralmente não se implementa o método construtor em Python! </li></ul><ul><li>O que é implementado é o método __init__ . Este método é chamado imediatamente após o construtor. </li></ul>
  90. 90. O que é um método construtor? class Veiculo(object): marca = None ano = None def __init__(self, marca, ano): self.marca = marca self.ano = ano def andar(self): print(&quot;O carro esta andando!&quot;)
  91. 91. O que é um método construtor? gol = Veiculo(“Volkswagen”, 2008) gol.marca = &quot;Volkswagen&quot; gol.ano = 2008 gol.andar() gol = Veiculo.__new__(Veiculo, “Volkswagen”, 2008) Veiculo.__init__(gol, “Volkswagen”, 2008)
  92. 92. Peculiaridade: Argumentos flexíveis <ul><li>Argumentos flexíveis, com valor default ou opcionais são argumentos que podem ou não serem passados para um método; </li></ul><ul><li>Como Python não possui sobrecarga de métodos e funções, o uso de argumentos flexíveis é extremamente importante para trabalhar de forma similar; </li></ul><ul><li>Definir um argumento flexível é fácil! </li></ul>
  93. 93. Peculiaridade: Argumentos flexíveis class Veiculo(object): marca = None ano = None def __init__(self, marca = None, ano = None): self.marca = marca self.ano = ano def andar(self): print(&quot;O carro esta andando!&quot;)
  94. 94. Prática <ul><li>Defina um método inicializador na classe Tamagoshi. Este método receberá valores de fome, saude e idade e armazenará estes valores nos atributos internos correspondentes; </li></ul><ul><li>Utilize passagem flexível de parâmetros. </li></ul>
  95. 95. Herança de classes <ul><li>A herança permite criar um relacionamento entre classes utilizando subclasses. Uma subclasse herda atributos e métodos de sua superclasse . </li></ul><ul><li>Utilizar herança pode poupar trabalho se métodos puderem ser escritos uma vez em uma superclasse em vez de muitas vezes em subclasses separadas. </li></ul>
  96. 96. Herança de classes <ul><li>Para definirmos herança de classes em Python, utilizamos parênteses; </li></ul><ul><li>Já utilizamos herança! </li></ul><ul><li>Em Python, existem dois tipos de classe: new style e old style ; </li></ul><ul><li>Classes new style são classes que sempre herdam de alguma classe. Se você não herda de ninguém, você deve herdar de object (de forma explícita); </li></ul><ul><li>Este formato de classe passou a ser suportado pelo Python apenas a partir da versão 2.2, quando a linguagem tornou-se 100% orientada a objetos. </li></ul>
  97. 97. Herança de classes <ul><li>Vamos começar a implementar o diagrama ao lado! </li></ul>
  98. 98. Herança de classes class Pessoa( object ): nome = None idade = None def __init__(self, nome, idade): self.nome = nome self.idade = idade def envelhecer(self): self.idade += 1
  99. 99. Herança de classes <ul><li>Para implementarmos a classe Atleta, precisaremos chamar explicitamente o construtor da classe Pessoa (superclasse); </li></ul><ul><li>Existem duas formas de fazer isso em Python, veremos apenas a forma mais correta! (: </li></ul>
  100. 100. Herança de classes class Atleta(Pessoa): peso = None aposentado = None def __init__(self, nome, idade, peso): super(Atleta, self).__init__(nome, idade) self.peso = peso self.aposentado = False def aquecer(self): print(&quot;Atleta aquecido!&quot;) def aposentar(self): self.aposentado = True
  101. 101. Herança de classes class Corredor(Atleta): def correr(self): print(&quot;Corredor correndo!&quot;) class Ciclista(Atleta): def pedalar(self): print(&quot;Ciclista pedalando!&quot;) class Nadador(Atleta): def nadar(self): print(&quot;Nadador nadando!&quot;)
  102. 102. Herança múltipla <ul><li>Há uma peculiaridade no diagrama de classes: a classe TriAtleta herda de três outras classes; </li></ul><ul><li>Muitas pessoas podem pensar: mas isso é impossível! </li></ul><ul><li>Em Python, assim como em C++, isso é possível sim! Logo, a classe TriAtleta fica bem simples: </li></ul>class TriAtleta( Ciclista, Nadador, Corredor ): pass
  103. 103. MRO <ul><li>Um conceito fundamental ligado à herança múltipla é o conceito de MRO (Method Resolution Order – Ordem de resolução de métodos); </li></ul><ul><li>Para descobrirmos a ordem de resolução de métodos de uma classe, utilizamos a seguinte sintaxe: Classe.__mro__ . </li></ul>print(TriAtleta.__mro__) (<class '__main__.TriAtleta'>, <class '__main__.Ciclista'>, <class '__main__.Nadador'>, <class '__main__.Corredor'>, <class '__main__.Atleta'>, <class '__main__.Pessoa'>, <type 'object'>)
  104. 104. Prática <ul><li>Implemente o diagrama de classes abaixo: </li></ul>
  105. 105. Polimorfismo <ul><li>Mesmo que Python não suporte sobrecarga de métodos em uma mesma classe, é possível reimplementar métodos em uma hierarquia de classes; </li></ul><ul><li>Vamos reimplementar em todas as subclasses de Atleta o método aquecer. </li></ul>
  106. 106. Polimorfismo class Corredor(Atleta): def correr(self): print(&quot;Corredor correndo!&quot;) def aquecer(self): print(&quot;Corredor aquecido!&quot;) class Nadador(Atleta): def nadar(self): print(&quot;Nadador nadando!&quot;) def aquecer(self): print(&quot;Nadador aquecido!&quot;) class Ciclista(Atleta): def pedalar(self): print(&quot;Ciclista pedalando!&quot;) def aquecer(self): print(&quot;Ciclista aquecido!&quot;)
  107. 107. Encapsulamento <ul><li>Em Python, todos os atributos e métodos são públicos! </li></ul><ul><li>Porém existe uma forma de dificultar o acesso aos atributos e métodos, indicando que acessar aquele atributo diretamente não é a operação aconselhada; </li></ul><ul><li>Basta adicionar dois _ (underline) à frente dos atributos e métodos; </li></ul><ul><li>Podemos então definir métodos de acesso em nossas classes; </li></ul>
  108. 108. Encapsulamento def retornarNome(self): return self.__nome def alterarNome(self, nome): self.__nome = nome def retornarIdade(self): return self.__idade def alterarIdade(self, idade): self.__idade = idade Classe Pessoa
  109. 109. Encapsulamento def retornarPeso(self): return self.__peso def alterarPeso(self, peso): self.__peso = peso def estaAposentado(self): return self.__aposentado def aposentar(self): self.__aposentado = True Classe Atleta
  110. 110. Encapsulamento Elegante: Properties <ul><li>Ninguém aqui está programando em Java (: </li></ul><ul><li>Java prega que você sempre deve acessar atributos através de métodos; </li></ul><ul><li>Python prega que você deve acessar atributos através de métodos quando você precisa disso! </li></ul><ul><li>Se não há necessidade de acessar um estado através de um comportamento, por que fazer isso? </li></ul><ul><li>Logo, todos os atributos são, por padrão, de acesso irrestrito; </li></ul><ul><li>Caso seja necessário restringir o acesso a estes atributos, definimos os métodos de acesso e definimos properties que acessarão estes métodos implicitamente! </li></ul>
  111. 111. Encapsulamento Elegante: Properties <ul><li>Por exemplo: temos o atributo peso em Atleta e todas as vezes que queremos configurar o valor de peso, deve ser feita uma validação para que este peso não seja inferior a 1 ou superior a 400; </li></ul><ul><li>Implementamos então o método alterarPeso e desenvolvemos nele a seguinte lógica: </li></ul>def alterarPeso(self, peso): if peso > 0 and peso < 400: self.__peso = peso
  112. 112. Encapsulamento Elegante: Properties a = Atleta(“Maria”, 19, 50) a.alterarPeso(25) a.peso = 25 Coisa de Java! Utilizando properties podemos configurar para internamente o Python chamar automaticamente o método alterarPeso passando 25 como parâmetro.
  113. 113. Encapsulamento Elegante: Properties <ul><li>Para fazer isso, precisamos de dois atributos! </li></ul>__peso = None peso = property(fget=retornarPeso, fset=alterarPeso)
  114. 114. Importante saber! <ul><li>Properties só funcionam em classes new style ; </li></ul><ul><li>Java também tem property! ;) </li></ul>
  115. 115. Prática <ul><li>Transforme todos os atributos da classe Tamagoshi em properties . </li></ul><ul><li>Lembre-se: nem sempre você agirá assim. Encapsule apenas o que tiver de ser encapsulado. </li></ul>
  116. 116. Exceções
  117. 117. Exceções <ul><li>Em Python, assim como em C++ e Java, o conceito de Exceção está ligado à orientação a objetos. </li></ul><ul><li>Uma exceção é um objeto, possui estado e comportamento. </li></ul><ul><li>O tratamento de exceções pode ser utilizado para aumentar o nível de abstração do código. </li></ul><ul><li>É possível usar exceções também para encapsular dados específicos sobre o erro levantado. </li></ul><ul><li>Vamos aprender como criar, tratar e levantar uma exceção em Python! </li></ul>
  118. 118. Exceções <ul><li>Primeiramente, vamos criar nossas exceções. </li></ul><ul><li>Uma exceção personalizada é modelada por uma classe qualquer, que herda da classe BaseException ; </li></ul><ul><li>Nas versões anteriores de Python qualquer classe podia modelar uma exceção. Isso gerava a má prática de lançar exceções modeladas pela classe string; </li></ul>
  119. 119. Exceções <ul><li>Vamos definir nossa primeira exceção. Esta exceção se chamará PesoError; </li></ul>class PesoError(BaseException): def __init__(self, mensagem = None): if mensagem is not None: self.message = mensagem else: self.message = &quot;Erro no peso!&quot;
  120. 120. Exceções <ul><li>Tudo bem Chico, criamos exceções! E como podemos levantá-las? </li></ul><ul><li>Para levantar uma exceção é muito simples! Basta utilizar a palavra raise (levantar, em inglês). </li></ul><ul><li>Vamos usar a exceção PesoError na classe Atleta, no método alterarPeso ; </li></ul><ul><li>Se o peso informado for inválido, levantamos a exceção! </li></ul>
  121. 121. Exceções def alterarPeso(self, peso): if peso > 0 and peso < 400: self.__peso = peso else: raise PesoError(&quot;%f nao eh um peso valido!&quot;, %(peso))
  122. 122. Exceções <ul><li>Python levanta diversas exceções internamente: ValueError, IOError, TypeError ; </li></ul><ul><li>Vamos tratar exceções! </li></ul><ul><li>Para tratar exceções em Python utilizamos try… except… else… finally ; </li></ul>
  123. 123. Exceções def lerIdade(): while True: try: idade = int(raw_input(&quot;Digite sua idade (apenas numeros inteiros): &quot;)) except ValueError as e: print(&quot;Digite apenas numeros inteiros!&quot;) continue else: return idade def lerPeso(): while True: try: peso = float(raw_input(&quot;Digite seu peso (apenas numeros reais): &quot;)) except ValueError as e: print(&quot;Digite apenas numeros reais, utilizando ponto para separar as casas!&quot;) else: return peso
  124. 124. Exceções if __name__ == &quot;__main__&quot;: print(&quot;CADASTRO DE ATLETAS&quot;, end=&quot; &quot;) nome = raw_input(&quot;Digite seu nome (aperte enter para finalizar): &quot;) while nome != &quot;&quot;: idade = lerIdade() peso = lerPeso() try: at = Atleta(nome, idade, peso) except PesoError as e: print(e.message) nome = raw_input(&quot;Digite seu nome (aperte enter para finalizar): &quot;)
  125. 125. Prática <ul><li>Analise as possíves exceções para a classe Tamagoshi; </li></ul><ul><li>Crie-as, lance-as e trate-as. </li></ul>
  126. 126. E agora? <ul><li>Leia a documentação; </li></ul><ul><li>Descubra a sua vertente; </li></ul><ul><li>Utilize Python na sua vertente! </li></ul>
  127. 127. Referências <ul><li>www.python.org </li></ul><ul><li>www.pythonbrasil.org </li></ul><ul><li>www.djangobrasil.org </li></ul><ul><li>www.plone.org </li></ul><ul><li>www.tchezope.org </li></ul>
  128. 128. Quanto tempo temos?
  129. 129. ? E-mail: [email_address]

×