Professional Documents
Culture Documents
Minicurso de Python
Conceitos Básicos, Estruturas de Dados
e Orientação a objetos
Francisco A. S. Souza
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
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).
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.
Quem usa Python?
• PHP:
<?php
class Faladora {
public function dizerOi($nome){
echo "Olá $nome! <br />";
}
}
• Python:
class Faladora:
def dizerOi(self, nome):
print("Olá %s!") %(nome)
falador = Faladora()
falador.dizerOi(“Francisco")
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?
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.
Utilizando o interpretador
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.
Utilizando o interpretador
Utilizando o interpretador
Utilizando o interpretador
• Alguns comandos básicos do interpretador:
help()
import this
• E o nosso primeiro comando conhecido em Python:
print(“Olá mundo!”)
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. :)
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
arquivo = open("entrada.txt")
Abrindo o arquivo
para leitura Imprimindo uma linha do arquivo a cada duas
linhas da tela.
for linha in arquivo:
print(linha) Imprimindo uma palavra por
linha
for linha in arquivo:
linha = linha.replace("\n", "")
palavras = linha.split('\t')
for palavra in palavras:
print(palavra)
Operadores
• Os operadores do Python:
alunos = []
alunos.append("Monica")
alunos.append("Cascao")
alunos.append("Cebolinha")
alunos.reverse()
alunos.reverse()
tamanho = alunos.__len__()
i = 0
teste.append("Nome4")
teste.append("Nome2")
print(teste.count("Nome2"))
teste.reverse()
teste.remove("Nome2")
print(teste)
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;
Gerando Listas
lista1 = range(1500)
for z in numeros:
if z % 2 == 1:
print(z)
Gerando Listas
• Não estamos programando em Java!
Matemática
print(pessoas.get("Maria"))
print(pessoas.items())
print(pessoas.values())
print(pessoas.keys())
pessoas.clear()
print(pessoas)
Controle de fluxo
class Veiculo(object):
pass
fusca = Veiculo()
fusca.marca = "Volkswagen"
fusca.ano = 1972
class Veiculo(object):
marca = None
ano = None
gol = Veiculo()
gol.marca = "Volkswagen"
gol.ano = 2008
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!
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;
Atributo de classe ou de
instância?
class Veiculo(object):
pass
fusca = Veiculo()
fusca.marca = "Volkswagen"
fusca.ano = 1972
def andar(self):
print("O carro esta andando!")
gol = Veiculo()
gol.marca = "Volkswagen"
gol.ano = 2008
gol.andar()
#include "Veiculo.h"
@staticmethod
def getDefaultInstance():
return Veiculo("", 0)
Prática
• Defina um método estático obterInstanciaPadrao na
classe Tamagoshi.
O que é um objeto?
• Antes de falarmos sobre instâncias, vamos pensar um
pouco: o que é um objeto?
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).
Importante saber!
1. A definição de objeto não é “um objeto é a instância de
uma classe”;
2. Objeto tem estado;
3. Objeto tem comportamento;
4. Objeto é a abstração de algo tangível;
5. Em Python, tudo é objeto.
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 = "Volkswagen"
gol.ano = 2008
gol.andar()
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;
O que é um método
construtor?
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.
O que é um método
construtor?
class Veiculo(object):
marca = None
ano = None
def andar(self):
print("O carro esta andando!")
O que é um método
construtor?
gol = Veiculo.__new__(Veiculo, “Volkswagen”, 2008)
Veiculo.__init__(gol, “Volkswagen”, 2008)
class Veiculo(object):
marca = None
ano = None
def andar(self):
print("O carro esta andando!")
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.
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.
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.
Herança de classes
• Vamos começar a
implementar o diagrama
ao lado!
Herança de classes
class Pessoa(object):
nome = None
idade = None
def envelhecer(self):
self.idade += 1
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! (:
Herança de classes
class Atleta(Pessoa):
peso = None
aposentado = None
def aquecer(self):
print("Atleta aquecido!")
def aposentar(self):
self.aposentado = True
Herança de classes
class Corredor(Atleta):
def correr(self):
print("Corredor correndo!")
class Nadador(Atleta):
def nadar(self):
print("Nadador nadando!")
class Ciclista(Atleta):
def pedalar(self):
print("Ciclista pedalando!")
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:
print(TriAtleta.__mro__)
(<class '__main__.TriAtleta'>, <class
'__main__.Ciclista'>, <class
'__main__.Nadador'>, <class
'__main__.Corredor'>, <class
'__main__.Atleta'>, <class
'__main__.Pessoa'>, <type 'object'>)
Prática
• Implemente o diagrama de classes abaixo:
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.
Polimorfismo
class Corredor(Atleta):
def correr(self):
print("Corredor correndo!")
def aquecer(self):
print("Corredor aquecido!")
class Nadador(Atleta):
def nadar(self):
print("Nadador nadando!")
def aquecer(self):
print("Nadador aquecido!")
class Ciclista(Atleta):
def pedalar(self):
print("Ciclista pedalando!")
def aquecer(self):
print("Ciclista aquecido!")
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;
Encapsulamento
Classe Pessoa
def retornarNome(self):
return self.__nome
def retornarIdade(self):
return self.__idade
Classe Atleta
def retornarPeso(self):
return self.__peso
def estaAposentado(self):
return self.__aposentado
def aposentar(self):
self.__aposentado = True
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!
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:
Coisa de Java!
__peso = None
peso = property(fget=retornarPeso, fset=alterarPeso)
Importante saber!
• Properties só funcionam em classes new style;
• Java também tem property! ;)
Prática
• Transforme todos os atributos da classe Tamagoshi em
properties.
class PesoError(BaseException):
def __init__(self, mensagem = None):
if mensagem is not None:
self.message = mensagem
else:
self.message = "Erro no peso!"
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!
Exceções
def lerPeso():
while True:
try:
peso = float(raw_input("Digite seu peso (apenas numeros reais): "))
except ValueError as e:
print("Digite apenas numeros reais, utilizando ponto para separar as
casas!")
else:
return peso
Exceções
if __name__ == "__main__":
print("CADASTRO DE ATLETAS", end="\n\n")
nome = raw_input("Digite seu nome (aperte enter para finalizar): ")
while nome != "":
idade = lerIdade()
peso = lerPeso()
try:
at = Atleta(nome, idade, peso)
except PesoError as e:
print(e.message)
nome = raw_input("Digite seu nome (aperte enter para finalizar): ")
Prática
• Analise as possíves exceções para a classe
Tamagoshi;
• Crie-as, lance-as e trate-as.
E agora?
• Leia a documentação;
• Descubra a sua vertente;
• Utilize Python na sua vertente!
Referências
• www.python.org
• www.pythonbrasil.org
• www.djangobrasil.org
• www.plone.org
• www.tchezope.org
Quanto tempo temos?
?
E-mail: franciscossouza@gmail.com