Minicurso de Python

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    1 Favorite

    Minicurso de Python - Presentation Transcript

    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. Sobre o autor
      • 19 anos :)
      • Aluno do quarto módulo do curso Técnico de Informática do Cefetes, Uned Cachoeiro de Itapemirim;
      • O resto é resto ;P
    3. O que é Python?
      • 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.
      • A linguagem tem um modelo de desenvolvimento aberto mantido pela PSF ( Python Software Foundation ).
    4. O que é Python?
      • 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.
    5. Quem usa Python?
      • 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” .
      • As ferramentas Google Doc , Picasa , Orkut Help , dentre outras da empresa americana Google utilizam a linguagem Python.
    6. Quem usa Python?
      • Grande parte da API do Google é desenvolvida em Python.
      • O Google App Engine (framework web online mantido pelo Google) oferece suporte total a Python e foi desenvolvido também em Python.
      • Zope, um dos melhores servidores de aplicação da atualidade foi desenvolvido em Python.
    7. Quem usa Python?
      • 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.
      • Diversas empresas que fabricam distribuições Linux utilizam softwares personalizados feitos em Python: Novell (SuSE e Open SuSE), Canonical (Ubuntu), Red Hat, dentre outras.
      • A Microsoft também investe fortemente em Python, no desenvolvimento da linguagem para o .NET Framework
    8. Quem usa Python?
      • 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 .
    9. Por que usar Python?
      • 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.
      • 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.
    10. Por que usar Python?
      • Python é simples e auto-descritiva, algumas linguagens de programação têm sintaxe complexa ou difícil de memorizar.
      • 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.
    11. Por que usar Python?
      • PHP:
      <?php class Faladora { public function dizerOi($nome){ echo &quot;Olá $nome! <br />&quot; ; } } $falador = new Faladora(); $falador->dizerOi ( “Francisco” ); ?>
    12. Por que usar Python?
      • C++:
      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. Por que usar Python?
      • Java:
      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. Por que usar Python?
      • Python:
      class Faladora : def dizerOi ( self , nome): print ( &quot;Olá %s!&quot; ) %(nome) falador = Faladora() falador.dizerOi( “Francisco&quot; )
    15. Por que usar Python?
      • Note que é simples e objetivo! :)
      • A presença de um interpretador interativo (assim como Ruby) também é uma vantagem, pois é interessante para iniciantes utilizarem um “interpretador de comandos”.
      • Vamos brincar um pouco com o interpretador?
    16. Utilizando o interpretador
      • Para executar o interpretador no Windows, vá em Iniciar > Executar e digite python.
      • Vale lembrar que o Python deve estar devidamente instalado.
      • É 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 .
    17. Utilizando o interpretador
    18. Utilizando o interpretador
      • Para executar o interpretador no Linux, abra o terminal e digite “python” .
      • 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.
    19. Utilizando o interpretador
    20. Utilizando o interpretador
    21. Utilizando o interpretador
      • Alguns comandos básicos do interpretador:
      • help()
      • import this
      • E o nosso primeiro comando conhecido em Python:
      • print(“Olá mundo!”)
    22. Resumo de características
      • Case sensitive;
      • Tipagem dinâmica e forte;
      • Linguagem pura: 100% orientada a objetos;
      • Código auto-descritivo: simples e de fácil leitura;
      • Programação em alto-nível: não permite manipulação de ponteiros;
      • Não suporta sobrecarga de funções;
      • Visa facilitar o desenvolvimento, foco em produtividade. :)
    23. Achou o interpretador feio?
    24. Achou o interpretador feio?
    25. Achou o interpretador feio?
    26. Achou o interpretador feio?
    27. Achou o interpretador feio?
    28. Achou o interpretador feio?
    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. Variáveis
      • 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.
      • Toda variável é uma referência!
      • Variáveis armazenam endereços de memória e não valores!
    31. Variáveis
      • Python possui tipagem dinâmica e forte;
      • Tipagem dinâmica significa que a variável assume o tipo de acordo com o valor atribuído;
      • 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;
      • Para mudar o tipo de uma variável, devemos declará-la novamente;
    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. Lendo do Teclado
      • Em Python, a leitura de dados do teclado é feita através das funções raw_input e input .
      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. Escrevendo na Tela
      • 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).
      • Porém, utilizaremos o print do futuro! Utilizaremos o print como função.
    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. Lendo e Escrevendo em Arquivos
      • Leitura de arquivos em Python é simples como em C!
      • Arquivos são objetos do tipo file ;
      • Para a abertura de um arquivo, utilizamos a função open ;
      • A função open funciona como uma fábrica de instâncias.
    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. Operadores
      • Os operadores do Python:
      is in <= >= Lógicos Comparação Aritméticos < / not > * or != - and == +
    39. Módulos
      • Módulo é o agrupamento de comandos para o operador. Numa definição mais informal, módulo é um arquivo de código-fonte Python.
      • Módulos são arquivos definidos com as extensões .py , .pyc , .pyo , .pyw , dentre outras menos utilizadas.
      • 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.
      • Em Python é possível definir mais de uma classe por arquivo (módulo).
    40. Strings
      • Conheceremos rapidamente strings em Python e como manipulá-las.
      • A string em Python é representada pela classe str . Toda string possui estado e comportamento provido pela classe str .
    41. Strings
      • Conheceremos agora alguns métodos para trabalhar com strings:
        • __len__ () : Retorna o tamanho da string;
        • __getslice__ ( inicio , fim ) : Retorna uma substring de inicio até fim .
        • capitalize () : Retorna a mesma string com a primeira letra em maiúsculo.
        • upper () : Retorna a mesma string com todas as letras em maiúsculo.
        • lower () : Retorna a mesma string com todas as letras em minúsculo.
    42. Strings
      • Mais métodos:
        • replace ( antigo , novo ) : Retorna a mesma string com o valor novo em todas as ocorrências de antigo .
        • split ([ separador ]) : Retorna uma lista de strings. Caso o separador não seja especificado, a lista será dividida por espaços em branco.
    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. Estruturas de Dados
      • Estruturas de dados englobam tipos compostos e dados complexos;
      • As estruturas de dados mais famosas são vetores e matrizes. Dentre as mais avançadas, a mais conhecida é a lista.
      • Há ainda outras estruturas como árvore, pilha, fila, hash, etc.
      • Vale lembrar que uma string também é uma estrutura de dados!
      • Estudaremos três estruturas: List , Tuple e Dict .
    45. Estruturas de Dados: List
      • A list (lista) é uma das mais conhecidas estruturas de dados.
      • 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”);
      • 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!
    46. Estruturas de Dados: List
      • Antes de por a mão na massa, um simples exemplo:
      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. Estruturas de Dados: List
      • Agora vamos fazer a mesma coisa, de forma diferente:
      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. Estruturas de Dados: List
      • Veremos agora alguns métodos para trabalhar com listas:
        • append ( elemento ): adiciona elemento ao fim da lista.
        • count ( elemento ) : retorna um inteiro contendo a quantidade de vezes que elemento aparece na lista.
        • reverse () : inverte a ordem dos elementos da lista.
        • remove ( elemento ) : remove da lista o primeiro elemento encontrado.
    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. Gerando Listas
      • Python possui formas de gerar listas, veremos duas;
      • Uma das primeiras funções que todos aprendem em Python é a função range , que gera uma lista de inteiros;
    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. Gerando Listas
      • Há ainda uma forma “avançada” de gerar listas a partir de outras listas;
      • Trata-se da técnica List Comprehension (Compreensão de Listas);
      • A sintaxe de List Comprehension vem da linguagem funcional Haskell;
      • 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);
    53. Gerando Listas
      • 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” .
      • Bom, nosso primeiro pensamento é fazer assim:
      x = int(raw_input(&quot;Digite um inteiro: &quot;)) numeros = range(x + 1) for z in numeros: if z % 2 == 1: print(z)
    54. Gerando Listas
      • Não estamos programando em Java!
      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. Estruturas de Dados: Tuple
      • Tuplas são como as listas, a diferença é que tuplas são estruturas de dados imutáveis.
      • Pode-se dizer que, em Python, uma string é uma tupla de caracteres.
      • Vamos a um exemplo para melhor compreensão. Veremos primeiro o que não é possível fazer com tuplas.
    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. Estruturas de Dados: Tuple
      • Vale lembrar que da mesma forma que fazemos com strings, também podemos concatenar tuplas.
      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. Estruturas de Dados: Dict
      • Chamaremos dicts de dicionários, para facilitar a fala em português;
      • Um dicionário é uma estrutura de dados onde cada nó é composto por uma chave e um valor;
      • Têm este nome pois são praticamente a mesma coisa que um dicionário!
    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. Estruturas de Dados: Dict
      • Alguns métodos de manipulação de dicionários:
        • get ( indice ) : retorna o valor correspondente a indice .
        • items () : retorna uma lista de tuplas, no formato (índice, valor) .
        • values () : retorna uma lista com todos os valores do dicionário.
        • keys () : retorna uma lista com todas as chaves do dicionário.
        • clear () : remove todos os itens do dicionário.
    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. 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. (Blocos de código)
      • Como todos já perceberam, em Python não utilizamos caracteres ou palavras para delimitar blocos de código.
      • Em C e linguagens derivadas, utilizamos o {}, em Pascal utilizamos begin .. end.
      • Em Python, o que determina o início e o fim de um bloco é endentação .
    64. Prática
      • Faça um algoritmo que leia um número x e imprima a soma de todos os ímpares entre 1 e x;
      • Desafio: faça o algoritmo acima sem usar controle de fluxo.
    65. Orientação a Objetos em Python
    66. Orientação a objetos
      • Python é uma linguagem 100% orientada a objetos, significa que tudo em Python é um objeto!
      • Veremos nos próximos slides como definir classes, atributos, métodos e como aplicar em Python diversos conceitos da Orientação a Objetos.
    67. Definindo Classes class Veiculo(object): pass Palavra class tipicamente utilizada para definir classes! (: Palavra reservada pass , siginifica: passe este bloco.
    68. Prática
      • Defina a classe vazia “Tamagoshi”.
    69. Definindo Atributos
      • Existem duas formas de definir atributos de instância em Python;
      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. Atributo de classe ou de instância?
      • Um tema que costuma gerar dúvida é sobre atributos de classe e de instância;
      • Em Java e outras linguagens com tipagem estática e suporte a classes, estes conceitos costumam se misturar;
      • Mas em Python estes conceitos são atômicos e o entendimento de cada um é simples, por incrível que pareça!
    71. Atributo de classe ou de instância?
      • Um atributo de classe é um atributo definido na classe;
      • Um atributo de instância é um atributo definido na instância da classe (objeto);
      • Todo atributo de classe é refletido nas instâncias;
      • Atributos de instâncias são únicos e pertencem apenas à uma instância específica;
    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. Prática
      • Defina os seguintes atributos na classe Tamagoshi: nome, fome, saude e idade.
    74. Definindo métodos
      • Um método é um atributo com comportamento;
      • Para não fundir conceitos, vamos apenas trabalhar com métodos da forma tradicional, ou quase isso;
      • Para definir métodos e funções em Python utilizamos a palavra reservada def ;
    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. Self?!?!
      • Quando definimos nosso método, determinamos um parâmetro, o self ;
      • Quando utilizamos o método, porém, não passamos nenhum parâmetro!
      • Quem é esse tal de self?
    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. 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. Prática
      • 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;
      • Defina o método retornarHumor , o humor não é um atributo, mas sim a soma entre a fome e a saúde;
    80. Métodos estáticos
      • 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);
      • O uso de métodos estáticos em Python é incomum, mas existe;
      • Para definir um método estático utilizamos a anotação staticmethod ;
    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. Prática
      • Defina um método estático obterInstanciaPadrao na classe Tamagoshi.
    83. O que é um objeto?
      • Antes de falarmos sobre instâncias, vamos pensar um pouco: o que é um objeto?
    84. O que é um objeto?
      • 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).
    85. Importante saber!
      • A definição de objeto não é “um objeto é a instância de uma classe”;
      • Objeto tem estado;
      • Objeto tem comportamento;
      • Objeto é a abstração de algo tangível;
      • Em Python, tudo é objeto.
    86. Instanciando objetos
      • Já vimos isso de forma “não oficial”;
      • Agora veremos oficialmente a sintaxe para instanciar objetos de uma classe!
      gol = Veiculo() gol.marca = &quot;Volkswagen&quot; gol.ano = 2008 gol.andar() Não tem new !
    87. Instanciando objetos
      • Quando instanciamos um objeto, acontecem internamente algumas operações: alocação de memória; definição de referência (ponteiro); etc.
      • É comum a inicialização de atributos quando inicializamos objetos;
      • Em outras linguagens, temos a possibilidade de fazer a implementação do construtor;
    88. O que é um método construtor?
    89. O que é um método construtor?
      • É um método especial que constrói o objeto, ou seja, é o método que retorna uma instância de determinada classe;
      • Em Python, o construtor chama-se __new__ ;
      • Porém geralmente não se implementa o método construtor em Python!
      • O que é implementado é o método __init__ . Este método é chamado imediatamente após o construtor.
    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. 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. Peculiaridade: Argumentos flexíveis
      • Argumentos flexíveis, com valor default ou opcionais são argumentos que podem ou não serem passados para um método;
      • 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;
      • Definir um argumento flexível é fácil!
    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. Prática
      • 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;
      • Utilize passagem flexível de parâmetros.
    95. Herança de classes
      • A herança permite criar um relacionamento entre classes utilizando subclasses. Uma subclasse herda atributos e métodos de sua superclasse .
      • 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.
    96. Herança de classes
      • Para definirmos herança de classes em Python, utilizamos parênteses;
      • Já utilizamos herança!
      • Em Python, existem dois tipos de classe: new style e old style ;
      • 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);
      • 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.
    97. Herança de classes
      • Vamos começar a implementar o diagrama ao lado!
    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. Herança de classes
      • Para implementarmos a classe Atleta, precisaremos chamar explicitamente o construtor da classe Pessoa (superclasse);
      • Existem duas formas de fazer isso em Python, veremos apenas a forma mais correta! (:
    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. 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. Herança múltipla
      • Há uma peculiaridade no diagrama de classes: a classe TriAtleta herda de três outras classes;
      • Muitas pessoas podem pensar: mas isso é impossível!
      • Em Python, assim como em C++, isso é possível sim! Logo, a classe TriAtleta fica bem simples:
      class TriAtleta( Ciclista, Nadador, Corredor ): pass
    103. MRO
      • Um conceito fundamental ligado à herança múltipla é o conceito de MRO (Method Resolution Order – Ordem de resolução de métodos);
      • Para descobrirmos a ordem de resolução de métodos de uma classe, utilizamos a seguinte sintaxe: Classe.__mro__ .
      print(TriAtleta.__mro__) (<class '__main__.TriAtleta'>, <class '__main__.Ciclista'>, <class '__main__.Nadador'>, <class '__main__.Corredor'>, <class '__main__.Atleta'>, <class '__main__.Pessoa'>, <type 'object'>)
    104. Prática
      • Implemente o diagrama de classes abaixo:
    105. Polimorfismo
      • Mesmo que Python não suporte sobrecarga de métodos em uma mesma classe, é possível reimplementar métodos em uma hierarquia de classes;
      • Vamos reimplementar em todas as subclasses de Atleta o método aquecer.
    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. Encapsulamento
      • Em Python, todos os atributos e métodos são públicos!
      • 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;
      • Basta adicionar dois _ (underline) à frente dos atributos e métodos;
      • Podemos então definir métodos de acesso em nossas classes;
    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. 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. Encapsulamento Elegante: Properties
      • Ninguém aqui está programando em Java (:
      • Java prega que você sempre deve acessar atributos através de métodos;
      • Python prega que você deve acessar atributos através de métodos quando você precisa disso!
      • Se não há necessidade de acessar um estado através de um comportamento, por que fazer isso?
      • Logo, todos os atributos são, por padrão, de acesso irrestrito;
      • 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!
    111. Encapsulamento Elegante: Properties
      • 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;
      • Implementamos então o método alterarPeso e desenvolvemos nele a seguinte lógica:
      def alterarPeso(self, peso): if peso > 0 and peso < 400: self.__peso = peso
    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. Encapsulamento Elegante: Properties
      • Para fazer isso, precisamos de dois atributos!
      __peso = None peso = property(fget=retornarPeso, fset=alterarPeso)
    114. Importante saber!
      • Properties só funcionam em classes new style ;
      • Java também tem property! ;)
    115. Prática
      • Transforme todos os atributos da classe Tamagoshi em properties .
      • Lembre-se: nem sempre você agirá assim. Encapsule apenas o que tiver de ser encapsulado.
    116. Exceções
    117. Exceções
      • Em Python, assim como em C++ e Java, o conceito de Exceção está ligado à orientação a objetos.
      • Uma exceção é um objeto, possui estado e comportamento.
      • O tratamento de exceções pode ser utilizado para aumentar o nível de abstração do código.
      • É possível usar exceções também para encapsular dados específicos sobre o erro levantado.
      • Vamos aprender como criar, tratar e levantar uma exceção em Python!
    118. Exceções
      • Primeiramente, vamos criar nossas exceções.
      • Uma exceção personalizada é modelada por uma classe qualquer, que herda da classe BaseException ;
      • 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;
    119. Exceções
      • Vamos definir nossa primeira exceção. Esta exceção se chamará PesoError;
      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. Exceções
      • Tudo bem Chico, criamos exceções! E como podemos levantá-las?
      • Para levantar uma exceção é muito simples! Basta utilizar a palavra raise (levantar, em inglês).
      • Vamos usar a exceção PesoError na classe Atleta, no método alterarPeso ;
      • Se o peso informado for inválido, levantamos a exceção!
    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. Exceções
      • Python levanta diversas exceções internamente: ValueError, IOError, TypeError ;
      • Vamos tratar exceções!
      • Para tratar exceções em Python utilizamos try… except… else… finally ;
    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. 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. Prática
      • Analise as possíves exceções para a classe Tamagoshi;
      • Crie-as, lance-as e trate-as.
    126. E agora?
      • Leia a documentação;
      • Descubra a sua vertente;
      • Utilize Python na sua vertente!
    127. Referências
      • www.python.org
      • www.pythonbrasil.org
      • www.djangobrasil.org
      • www.plone.org
      • www.tchezope.org
    128. Quanto tempo temos?
    129. ? E-mail: [email_address]
    SlideShare Zeitgeist 2009

    + Francisco SouzaFrancisco Souza Nominate

    custom

    1345 views, 1 favs, 2 embeds more stats

    Minicurso de Python apresentado durante a I Jornada more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 1345
      • 1335 on SlideShare
      • 10 from embeds
    • Comments 0
    • Favorites 1
    • Downloads 45
    Most viewed embeds
    • 8 views on http://franciscossouza.blogspot.com
    • 2 views on http://blog.franciscosouza.net

    more

    All embeds
    • 8 views on http://franciscossouza.blogspot.com
    • 2 views on http://blog.franciscosouza.net

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories