Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula6T.pdf · Separe o código em módulos Todo...
Transcript of Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula6T.pdf · Separe o código em módulos Todo...
Separe o código em módulos
Todo arquivo com extensão .py é um módulo!
Exemplo, arquivo areas.py:import mathdef area_triangulo(a, b, c):
'''Calcula a area de um triangulo de lados a, b, c.'''p = (a+b+c)/2.0return math.sqrt(p*(p-a)*(p-b)*(p-c))
def area_retangulo(ret):'''Calcula a area de um retangulo dado por uma tupla contendo os seus lados.'''return ret[0]*ret[1]
6
Separe o código em módulos
Arquivo teste.py:
import areas
print 'Area =', areas.area_triangulo(3, 4, 5)
Area = 6.0
Saída do programa
7
Separe o código em módulos
Arquivo teste.py:
import areasimport random
def retangulo_aleatorio():'''Retorna um retangulo aleatorio.'''a = random.randint(1, 100)b = random.randint(1, 100)return a, b
R = retangulo_aleatorio()print 'Area do retangulo', R, '=', areas.area_retangulo(R)
Area do retangulo (47, 16) = 752
Saída do programa
8
Separe o código em módulos
Arquivo outro_teste.py:
import teste
P = teste.retangulo_aleatorio()print 'Retangulo', P
Area do retangulo (18, 39) = 702Retangulo (75, 49)
Saída do programa
10
Variável __name__
Arquivo abacate.py:
print 'Olha:', __name__
Arquivo batata.py:
import abacate
print 'E agora:', __name__
Olha: __main__
Saída do programa abacate.py
Olha: abacateE agora: __main__
Saída do programa batata.py
13
Guardião de código
Arquivo teste.py:
import areasimport random
def retangulo_aleatorio():'''Retorna um retangulo aleatorio.'''a = random.randint(1, 100)b = random.randint(1, 100)return a, b
if __name__ == '__main__':R = retangulo_aleatorio()print 'Area do retangulo', R, '=', areas.area_retangulo(R)
14
Função main
Arquivo teste.py:
import areasimport random
def retangulo_aleatorio():'''Retorna um retangulo aleatorio.'''a = random.randint(1, 100)b = random.randint(1, 100)return a, b
def main():R = retangulo_aleatorio()print 'Area do retangulo', R, '=', areas.area_retangulo(R)
if __name__ == '__main__':main()
15
Testando novamente outro_teste.py
Arquivo outro_teste.py:
import teste
P = teste.retangulo_aleatorio()print 'Retangulo', P
Retangulo (94, 72)
Saída do programa
16
Conclusão
● Organize seus códigos em módulos.
● Crie uma função main e a proteja com
if __name__ == '__main__':
main()
17
Exercício 2 da Aula 5 Prática
Inclua no seu programa a seguinte string:
dados = '''001:Bulbasaur:Ovo002:Ivysaur:Bulbasaur003:Venusaur:Ivysaur004:Charmander:Ovo005:Charmeleon:Charmander'''
você pode encontrar a lista contendo os 151 primeiros pokemons em:
dcc.ufrj.br/~lcarvalho/pokemon.txt
A partir desta string crie uma lista (tipo list) de objetos da classe Pokemon.
Dica: use a função a.split(x) para separar linhas (caractere separador '\n') e informações de cada pokemon (caractere separador ':')
18
Solução
...dados = '''001:Bulbasaur:Ovo
002:Ivysaur:Bulbasaur003:Venusaur:Ivysaur004:Charmander:Ovo005:Charmeleon:Charmander006:Charizard:Charmeleon007:Squirtle:Ovo008:Wartortle:Squirtle009:Blastoise:Wartortle010:Caterpie:Ovo'''
P = []for linha in dados.split('\n'):
d = linha.split(':')p = Pokemon(int(d[0]), d[1], d[2])P.append(p)
...19
Abrindo um arquivo
>>> a = open('pokemon.txt')>>> a.readline()'001:Bulbasaur:Ovo\n'>>> a.readline()'002:Ivysaur:Bulbasaur\n'>>> a.readline()'003:Venusaur:Ivysaur\n'>>> a.readline()'004:Charmander:Ovo\n'...>>> a.close()
21
Abrindo um arquivo
>>> a = open('pokemon.txt')>>> a.read()"001:Bulbasaur:Ovo\n002:Ivysaur:Bulbasaur\n003:Venusaur:Ivysaur\n004:Charmander:Ovo\n005:Charmeleon:Charmander\n006:Charizard:Charmeleon\n007:Squirtle:Ovo\n... bla bla bla ...142:Aerodactyl:Ovo\n143:Snorlax:Ovo\n144:Articuno:nada\n145:Zapdos:nada\n146:Moltres:nada\n147:Dratini:Ovo\n148:Dragonair:Dratini\n149:Dragonite:Dragonair\n150:Mewtwo:nada\n151:Mew:nada\n">>> a.read()''>>> a.close()
22
Programa original
...dados = '''001:Bulbasaur:Ovo
002:Ivysaur:Bulbasaur003:Venusaur:Ivysaur004:Charmander:Ovo005:Charmeleon:Charmander006:Charizard:Charmeleon007:Squirtle:Ovo008:Wartortle:Squirtle009:Blastoise:Wartortle010:Caterpie:Ovo'''
P = []for linha in dados.split('\n'):
d = linha.split(':')p = Pokemon(int(d[0]), d[1], d[2])P.append(p)
...23
Usando arquivo
...arquivo = open('pokemon.txt')dados = arquivo.read()arquivo.close()
P = []for linha in dados.split('\n'):
d = linha.split(':')p = Pokemon(int(d[0]), d[1], d[2])P.append(p)
...
24
Abrindo um arquivo em modo de escrita
arquivo = open('saida.txt', 'w')
a = 1872*'ding 'arquivo.write(a)
arquivo.close()
26
Abrindo um arquivo em modo de adição
arquivo = open('saida.txt', 'a')
a = 1938*'dong 'arquivo.write(a)
arquivo.close()
27
Exercício
Crie um programa completo que leia um arquivo e imprima qual é a palavra mais frequente.
Use a função raw_input para receber o nome do arquivo.
28
Solução
def mais_frequente(frases):'''Retorna a palavra mais frequente de uma string.'''M = {}
max_palavra = Nonecontador = 0
for palavra in frases.split():if palavra not in M:
M[palavra] = 1else:
M[palavra] += 1
if M[palavra] > contador:contador = M[palavra]max_palavra = palavra
return max_palavra
29
Solução
def main():name = raw_input('Nome do arquivo:')arquivo = open(name)print mais_frequente(arquivo.read())arquivo.close()
if __name__ == '__main__':main()
30
32
Exercício
Crie uma classe Poligono que representa um polígono de n lados.
O construtor deve receber o número n e um tamanho de lado e constrói um polígono regular de n lados com o tamanho especificado.
Crie também um método desenha, que desenha este polígono usando o módulo turtle.
33
Exercício
class Poligono:def __init__(self, n, lado=10):
'''Constroi um Poligono regular de n lados.'''self.pts = []dtheta = 2*math.pi/nfor i in range(n):
x = lado*math.cos(i*dtheta)y = lado*math.sin(i*dtheta)p = x, yself.pts.append(p)
def desenha(self):'''Desenha o poligono em turtle.'''turtle.up()turtle.goto(self.pts[-1])turtle.down()for p in self.pts:
turtle.goto(p)
34
Exercício
def main():turtle.speed('fastest')p1 = Poligono(5, 50)p2 = Poligono(3)p3 = Poligono(8, 100)p4 = Poligono(7, 200)
p1.desenha()p2.desenha()p3.desenha()p4.desenha()
turtle.done()
if __name__ == '__main__':main()
35
Exercício
Crie uma classe Triangulo.
O construtor deve receber o tamanho do lado, e construir um triângulo equilátero com o lado especificado.
Crie também um método desenha, que desenha este triângulo usando o módulo turtle.
36
Exercício
class Triangulo:def __init__(self, lado):
'''Constroi um Triangulo equilatero com o lado especificado.'''self.pts = []dtheta = 2*math.pi/3for i in range(3):
x = lado*math.cos(i*dtheta)y = lado*math.sin(i*dtheta)p = x, yself.pts.append(p)
def desenha(self):'''Desenha o triangulo em turtle.'''turtle.up()turtle.goto(self.pts[-1])turtle.down()for p in self.pts:
turtle.goto(p)
37
Exercício
def main():turtle.speed('fastest')p1 = Triangulo(50)p2 = Triangulo(30)p3 = Triangulo(100)p4 = Triangulo(200)
p1.desenha()p2.desenha()p3.desenha()p4.desenha()
turtle.done()
if __name__ == '__main__':main()
38
Exercício
Crie uma classe Quadrilatero.
O construtor deve receber o tamanho do lado, e construir um quadrado com o lado especificado.
Crie também um método desenha, que desenha este quadrilátero usando o módulo turtle.
39
Exercício
class Quadrilatero:def __init__(self, lado):
'''Constroi um quadrado com o lado especificado.'''self.pts = []dtheta = 2*math.pi/4for i in range(4):
x = lado*math.cos(i*dtheta)y = lado*math.sin(i*dtheta)p = x, yself.pts.append(p)
def desenha(self):'''Desenha o quadrilatero em turtle.'''turtle.up()turtle.goto(self.pts[-1])turtle.down()for p in self.pts:
turtle.goto(p)
40
Exercício
def main():turtle.speed('fastest')p1 = Quadrilatero(50)p2 = Quadrilatero(30)p3 = Quadrilatero(100)p4 = Quadrilatero(200)
p1.desenha()p2.desenha()p3.desenha()p4.desenha()
turtle.done()
if __name__ == '__main__':main()
42
Composição
class Triangulo:def __init__(self, lado):
'''Constroi um Triangulo equilatero com o lado especificado.'''self.poligono = Poligono(3, lado)
def desenha(self):'''Desenha o triangulo em turtle.'''self.poligono.desenha()
45
Herança
class Triangulo(Poligono):def __init__(self, lado):
'''Constroi um Triangulo equilatero com o lado especificado.'''Poligono.__init__(self, 3, lado)
class Quadrilatero(Poligono):def __init__(self, lado):
'''Constroi um Triangulo equilatero com o lado especificado.'''Poligono.__init__(self, 3, lado)
Agora um objeto da classe Triangulo também é um objeto da classe Poligono.
Portanto todos os métodos da classe Poligono podem ser usados na classe Triangulo.
Da mesma maneira, um Quadrilatero também é um Poligono.
Herança
Exemplo genérico:
class A:def metodo1(self, ...):
...def metodo2(self, ...):
...def metodo3(self, ...):
...
class B(A):def metodoX(self, ...):
...def metodoY(self, ...):
...def metodoZ(self, ...):
...
46
Dizemos que:● B estende A● B é uma subclasse de A● A é super classe de B
Herança
Exemplo genérico:
pa = A(...) # cria um objeto da classe Apa.metodo1(...)pa.metodo2(...)pa.metodo3(...)
pb = B(...) # cria um objeto da classe B, que também é da classe A.pb.metodo1(...)pb.metodo2(...)pb.metodo3(...)pb.metodoX(...)pb.metodoY(...)pb.metodoZ(...)
47
E se um método for redefinido?
Exemplo genérico:
class A:def metodo1(self):
print 'ui'
class B(A):def metodo1(self, ...):
print 'vixe'
48
Dizemos que:metodo1 foi sobreposto (overridden) na classe B.
Verificando tipos
>>> t = turtle.Turtle()>>> p = Poligono(50)>>> q = Triangulo(50)>>> type(t)<class 'turtle.Turtle'>>>> type(p)<type 'instance'>>>> type(q)<type 'instance'>
50
Classe object
>>> a = object()>>> type(a)<type 'object'>>>> help(a)
Help on object object:
class object | The most base type
51
Estendendo a classe object
Se não tiver o que estender, estenda a classe object:class Poligono(object):
...
>>> t = turtle.Turtle()>>> p = Poligono(50)>>> q = Triangulo(50)>>> type(t)<class 'turtle.Turtle'>>>> type(p)<class '__main__.Poligono'>>>> type(q)<class '__main__.Triangulo'>>>> type(q) == PoligonoFalse
52
Função isinstance
>>> t = turtle.Turtle()>>> p = Poligono(50)>>> q = Triangulo(50)>>> isinstance(t, turtle.Turtle)True>>> isinstance(t, object)True>>> isinstance(p, Poligono)True>>> isinstance(p, object)True>>> isinstance(p, Triangulo)False>>> isinstance(q, Triangulo)True>>> isinstance(q, Poligono)True
53