Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula6T.pdf · Separe o código em módulos Todo...

54
Computação 2 Aula 6 Teórica professor: Leonardo Carvalho

Transcript of Computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/Aula6T.pdf · Separe o código em módulos Todo...

Computação 2

Aula 6 Teóricaprofessor: Leonardo Carvalho

Quando é a prova?

2

13/01/2016

3

Códigos grandes são difíceis de manipular

4

Vamos organizar melhor nossos códigos!

5

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

Posso usar o arquivo teste.py como módulo?

Com certeza

Que bom!Manda nudes

9

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

Como evitar que a saída do teste.py

apareça no outro_teste.py?

11

Precisamos descobrir se um código está sendo executado a

partir de um import ou por si próprio

12

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

Podemos ler os dados direto de um arquivo?

20

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

E se eu quiser salvar?

25

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

31

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()

Como reaproveitar o código da classe Poligono nas outras classes?

41

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()

Pode ser mais

simples?

Herança!

44

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.

Métodos sobrepostos

pa = A()pa.metodo1()

pb = B()pb.metodo1()

49

uivixe

Saída do programa

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

done()

54