Conceitos Básicos, Estruturas de Dados e Orientação a objetos Minicurso de Python Francisco A. S. Souza I Jornada Acadêmic...
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...
O que é Python? <ul><li>Python é uma linguagem de programação de altíssimo nível (VHLPL –  very high level programming lan...
O que é Python? <ul><li>A linguagem foi projetada com a filosofia de enfatizar a importância do esforço do programador sob...
Quem usa Python? <ul><li>Atualmente Python é uma das linguagens mais utilizadas em grandes projetos no mundo. Engenheiros ...
Quem usa Python? <ul><li>Grande parte da API do Google é desenvolvida em Python. </li></ul><ul><li>O Google App Engine (fr...
Quem usa Python? <ul><li>Plone, que é uma aplicação do Zope, foi desenvolvido em Python e é utilizado largamente em divers...
Quem usa Python? <ul><li>Empresas que patrocinam a  Python Software Foundation :  ActiveState ; ASTi; Array BioPharma, Inc...
Por que usar Python? <ul><li>Python é portável, você não precisa compilar seu programa cada vez que muda de sistema operac...
Por que usar Python? <ul><li>Python é simples e auto-descritiva, algumas linguagens de programação têm sintaxe complexa ou...
Por que usar Python? <ul><li>PHP: </li></ul><?php class  Faladora { public function  dizerOi($nome){ echo  &quot;Olá $nome...
Por que usar Python? <ul><li>C++: </li></ul>void  Faladora::dizerOi(string* nome){ cout << “Olá” << nome->c_str() << “!” <...
Por que usar Python? <ul><li>Java: </li></ul>package  minicurso; public   class  Faladora { public void  dizerOi(String no...
Por que usar Python? <ul><li>Python: </li></ul>class   Faladora : def   dizerOi ( self , nome): print ( &quot;Olá %s!&quot...
Por que usar Python? <ul><li>Note que é simples e objetivo! :) </li></ul><ul><li>A presença de um interpretador interativo...
Utilizando o interpretador <ul><li>Para executar o interpretador no Windows, vá em Iniciar > Executar e digite python. </l...
Utilizando o interpretador
Utilizando o interpretador <ul><li>Para executar o interpretador no Linux, abra o terminal e digite  “python” . </li></ul>...
Utilizando o interpretador
Utilizando o interpretador
Utilizando o interpretador <ul><li>Alguns comandos básicos do interpretador: </li></ul><ul><li>help() </li></ul><ul><li>im...
Resumo de características <ul><li>Case sensitive; </li></ul><ul><li>Tipagem dinâmica e forte; </li></ul><ul><li>Linguagem ...
Achou o interpretador feio?
Achou o interpretador feio?
Achou o interpretador feio?
Achou o interpretador feio?
Achou o interpretador feio?
Achou o interpretador feio?
Sintaxe if x > y: big = x small = y else: big = y small = x Simples e objetivo! Não é preciso saber programação para enten...
Variáveis <ul><li>O conceito de variável em Python é representado sempre por um objeto. Na verdade, Python é uma linguagem...
Variáveis <ul><li>Python possui tipagem dinâmica e forte; </li></ul><ul><li>Tipagem dinâmica significa que a variável assu...
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?
Lendo do Teclado <ul><li>Em Python, a leitura de dados do teclado é feita através das funções  raw_input   e   input . </l...
Escrevendo na Tela <ul><li>Para escrita na tela, utilizamos o comando  print . Vale lembrar que o  print  não é uma função...
Escrevendo na Tela print  &quot;Pulei linha&quot; print  &quot;Não pulei linha&quot;, print( &quot;Pulei linha&quot;) prin...
Lendo e Escrevendo em Arquivos <ul><li>Leitura de arquivos em Python é simples como em C! </li></ul><ul><li>Arquivos são o...
Lendo e Escrevendo em Arquivos arquivo = open(&quot;entrada.txt&quot;) for linha in arquivo: print(linha) for linha in arq...
Operadores <ul><li>Os operadores do Python: </li></ul>is  in  <= >= Lógicos Comparação Aritméticos < / not  > * or  != - a...
Módulos <ul><li>Módulo é o agrupamento de comandos para o operador. Numa definição mais informal, módulo é um arquivo de c...
Strings <ul><li>Conheceremos rapidamente strings em Python e como manipulá-las. </li></ul><ul><li>A string em Python é rep...
Strings <ul><li>Conheceremos agora alguns métodos para trabalhar com strings: </li></ul><ul><ul><li>__len__ () : Retorna o...
Strings <ul><li>Mais métodos: </li></ul><ul><ul><li>replace ( antigo ,  novo ) : Retorna a mesma string com o valor  novo ...
Strings string =  &quot;Este eh apenas um teste com a string&quot; print(string.__len__()) print(string.__getslice__(0, 5)...
Estruturas de Dados <ul><li>Estruturas de dados englobam tipos compostos e dados complexos; </li></ul><ul><li>As estrutura...
Estruturas de Dados: List <ul><li>A  list  (lista) é uma das mais conhecidas estruturas de dados.  </li></ul><ul><li>Em Py...
Estruturas de Dados: List <ul><li>Antes de por a mão na massa, um simples exemplo: </li></ul>alunos = [] alunos.append( &q...
Estruturas de Dados: List <ul><li>Agora vamos fazer a mesma coisa, de forma diferente: </li></ul>alunos = [ &quot;Monica&q...
Estruturas de Dados: List <ul><li>Veremos agora alguns métodos para trabalhar com listas: </li></ul><ul><ul><li>append ( e...
Estruturas de Dados: List teste = [ &quot;Nome1&quot; ,  &quot;Nome2&quot; ,  &quot;Nome3&quot; ] teste.append( &quot;Nome...
Gerando Listas <ul><li>Python possui formas de gerar listas, veremos duas; </li></ul><ul><li>Uma das primeiras funções que...
Gerando Listas lista1 = range(1500) lista2 = range(1001, 2000) Gera uma lista de 0 até 1499. Gera uma lista de 1001 até 19...
Gerando Listas <ul><li>Há ainda uma forma “avançada” de gerar listas a partir de outras listas; </li></ul><ul><li>Trata-se...
Gerando Listas <ul><li>Supondo que seu amado professor de algoritmos lhe passou o seguinte exercício:  “Elabore um algorit...
Gerando Listas <ul><li>Não estamos programando em Java! </li></ul>x = int(raw_input(&quot;Digite um inteiro: &quot;)) impa...
Estruturas de Dados: Tuple <ul><li>Tuplas são como as listas, a diferença é que tuplas são estruturas de dados imutáveis. ...
Estruturas de Dados: Tuple tupla = ( &quot;Teste 1&quot; ,  &quot;Teste 2&quot; ) tupla[0] =  &quot;Teste 3&quot; tupla.ap...
Estruturas de Dados: Tuple <ul><li>Vale lembrar que da mesma forma que fazemos com strings, também podemos concatenar tupl...
Estruturas de Dados: Dict <ul><li>Chamaremos  dicts  de dicionários, para facilitar a fala em português; </li></ul><ul><li...
Estruturas de Dados: Dict dicionario = {} dicionario[ &quot;teste&quot; ] =  &quot;A palavra teste significa que estamos t...
Estruturas de Dados: Dict <ul><li>Alguns métodos de manipulação de dicionários: </li></ul><ul><ul><li>get ( indice ) : ret...
Estruturas de Dados: Dict pessoas = { &quot;Maria&quot;  :  &quot;Nome antigo&quot; ,  &quot;Shyana&quot;  :  &quot;Nome c...
Controle de fluxo if n1 > n2: maior = n1 else: maior = n2 while i < 5: i += 1 numeros = [21, 5, 10] for numero in numeros:...
(Blocos de código) <ul><li>Como todos já perceberam, em Python não utilizamos caracteres ou palavras para delimitar blocos...
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...
Orientação a Objetos em Python
Orientação a objetos <ul><li>Python é uma linguagem 100% orientada a objetos, significa que tudo em Python é um objeto! </...
Definindo Classes class Veiculo(object): pass Palavra  class   tipicamente utilizada para definir classes! (: Palavra rese...
Prática <ul><li>Defina a classe vazia “Tamagoshi”. </li></ul>
Definindo Atributos <ul><li>Existem duas formas de definir atributos de instância em Python; </li></ul>class Veiculo(objec...
Atributo de classe ou de instância? <ul><li>Um tema que costuma gerar dúvida é sobre atributos de classe e de instância; <...
Atributo de classe ou de instância? <ul><li>Um atributo de classe é um atributo definido na classe; </li></ul><ul><li>Um a...
Atributo de classe ou de instância? class Veiculo(object): pass fusca = Veiculo() fusca.marca = &quot;Volkswagen&quot; fus...
Prática <ul><li>Defina os seguintes atributos na classe Tamagoshi: nome, fome, saude e idade. </li></ul>
Definindo métodos <ul><li>Um método é um atributo com comportamento; </li></ul><ul><li>Para não fundir conceitos, vamos ap...
Definindo métodos class Veiculo(object): marca = None ano = None def andar( self ): print(&quot;O carro esta andando!&quot...
Self?!?! <ul><li>Quando definimos nosso método, determinamos um parâmetro, o  self ; </li></ul><ul><li>Quando utilizamos o...
Self?!?! #include &quot;Veiculo.h&quot; void Veiculo::setAno(int ano){ this ->ano = ano; } Quem é esse tal de  this ? clas...
Self?!?! public class Veiculo { public String marca = null; public Integer ano = null; public void setAno(Integer ano){ th...
Prática <ul><li>Defina os seguintes métodos na classe Tamagoshi:  alterarNome ,  alterarFome ,  alterarSaude ,  retornarNo...
Métodos estáticos <ul><li>O conceito de método estático muitas vezes é confundido com o conceito de função em linguagens c...
Métodos estáticos class Veiculo(object): marca = None ano = None def __init__(self, marca = None, ano = None): self.marca ...
Prática <ul><li>Defina um método estático  obterInstanciaPadrao  na classe Tamagoshi. </li></ul>
O que é um objeto? <ul><li>Antes de falarmos sobre instâncias, vamos pensar um pouco: o que é um objeto? </li></ul>
O que é um objeto? <ul><li>Segundo Fernando Lozano, objeto é a representação de uma  coisa física, tangível, uma idéia ou ...
Importante saber! <ul><li>A definição de objeto não é “um objeto é a instância de uma classe”; </li></ul><ul><li>Objeto te...
Instanciando objetos <ul><li>Já vimos isso de forma “não oficial”; </li></ul><ul><li>Agora veremos oficialmente a sintaxe ...
Instanciando objetos <ul><li>Quando instanciamos um objeto, acontecem internamente algumas operações: alocação de memória;...
O que é um método construtor?
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...
O que é um método construtor? class Veiculo(object): marca = None ano = None def __init__(self, marca, ano): self.marca = ...
O que é um método construtor? gol = Veiculo(“Volkswagen”, 2008) gol.marca = &quot;Volkswagen&quot; gol.ano = 2008 gol.anda...
Peculiaridade: Argumentos flexíveis <ul><li>Argumentos flexíveis, com valor  default  ou opcionais são argumentos que pode...
Peculiaridade: Argumentos flexíveis class Veiculo(object): marca = None ano = None def __init__(self, marca = None, ano = ...
Prática <ul><li>Defina um método inicializador na classe Tamagoshi. Este método receberá valores de fome, saude e idade e ...
Herança de classes <ul><li>A herança permite criar um relacionamento entre classes utilizando subclasses. Uma  subclasse  ...
Herança de classes <ul><li>Para definirmos herança de classes em Python, utilizamos parênteses; </li></ul><ul><li>Já utili...
Herança de classes <ul><li>Vamos começar a implementar o diagrama ao lado! </li></ul>
Herança de classes class Pessoa( object ):  nome = None idade = None def __init__(self, nome, idade): self.nome = nome sel...
Herança de classes <ul><li>Para implementarmos a classe Atleta, precisaremos chamar explicitamente o construtor da classe ...
Herança de classes class Atleta(Pessoa): peso = None aposentado = None def __init__(self, nome, idade, peso): super(Atleta...
Herança de classes class Corredor(Atleta): def correr(self): print(&quot;Corredor correndo!&quot;) class Ciclista(Atleta):...
Herança múltipla <ul><li>Há uma peculiaridade no diagrama de classes: a classe  TriAtleta  herda de três outras classes; <...
MRO <ul><li>Um conceito fundamental ligado à herança múltipla é o conceito de  MRO  (Method Resolution Order – Ordem de re...
Prática <ul><li>Implemente o diagrama de classes abaixo: </li></ul>
Polimorfismo <ul><li>Mesmo que Python não suporte sobrecarga de métodos em uma mesma classe, é possível reimplementar méto...
Polimorfismo class Corredor(Atleta): def correr(self): print(&quot;Corredor correndo!&quot;) def aquecer(self): print(&quo...
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 d...
Encapsulamento def retornarNome(self): return self.__nome def alterarNome(self, nome): self.__nome = nome def retornarIdad...
Encapsulamento def retornarPeso(self): return self.__peso def alterarPeso(self, peso): self.__peso = peso def estaAposenta...
Encapsulamento Elegante: Properties <ul><li>Ninguém  aqui está programando em Java (: </li></ul><ul><li>Java prega que voc...
Encapsulamento Elegante: Properties <ul><li>Por exemplo: temos o atributo peso em Atleta e todas as vezes que queremos con...
Encapsulamento Elegante: Properties a = Atleta(“Maria”, 19, 50) a.alterarPeso(25) a.peso = 25 Coisa de Java! Utilizando pr...
Encapsulamento Elegante: Properties <ul><li>Para fazer isso, precisamos de dois atributos! </li></ul>__peso = None peso = ...
Importante saber! <ul><li>Properties só funcionam em classes  new style ; </li></ul><ul><li>Java também tem property! ;) <...
Prática <ul><li>Transforme todos os atributos da classe Tamagoshi em  properties . </li></ul><ul><li>Lembre-se: nem sempre...
Exceções
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>...
Exceções <ul><li>Primeiramente, vamos criar nossas exceções. </li></ul><ul><li>Uma exceção personalizada é modelada por um...
Exceções <ul><li>Vamos definir nossa primeira exceção. Esta exceção se chamará PesoError; </li></ul>class PesoError(BaseEx...
Exceções <ul><li>Tudo bem Chico, criamos exceções! E como podemos levantá-las? </li></ul><ul><li>Para levantar uma exceção...
Exceções def alterarPeso(self, peso): if peso > 0 and peso < 400: self.__peso = peso else: raise PesoError(&quot;%f nao eh...
Exceções <ul><li>Python levanta diversas exceções internamente:  ValueError, IOError, TypeError ; </li></ul><ul><li>Vamos ...
Exceções def lerIdade(): while True: try: idade = int(raw_input(&quot;Digite sua idade (apenas numeros inteiros): &quot;))...
Exceções if __name__ == &quot;__main__&quot;: print(&quot;CADASTRO DE ATLETAS&quot;, end=&quot;

&quot;) nome = raw_input(...
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...
E agora? <ul><li>Leia a documentação; </li></ul><ul><li>Descubra a sua vertente; </li></ul><ul><li>Utilize Python na sua v...
Referências <ul><li>www.python.org  </li></ul><ul><li>www.pythonbrasil.org  </li></ul><ul><li>www.djangobrasil.org  </li><...
Quanto tempo temos?
? E-mail:  [email_address]
Upcoming SlideShare
Loading in...5
×

Minicurso de Python

9,867

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
2 Comments
17 Likes
Statistics
Notes
  • Gostei muito, estava com umas dificuldades, mas acredito que vou solucionar tudo aqui c:
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Muito bom o tema..

    estou fazendo um trabalho sobre python.. e gostei do artigo

    abraços

    gostaria se possivel receber mais conteudo sobre o tema..

    ide's para trabalhar com a linguagem componentes e outros recursos que programadores adotam.. costumes entre outras coisas...

    te mais
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
9,867
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
792
Comments
2
Likes
17
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]
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×