computação 2 - dcc.ufrj.brlcarvalho/comp2/slides/aula3t.pdf · professor: leonardo carvalho. na...

60
Computação 2 Aula 3 Teórica professor: Leonardo Carvalho

Upload: vudien

Post on 08-Nov-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Computação 2

Aula 3 Teóricaprofessor: Leonardo Carvalho

Na vida precisamos de muitos tipos de dados

Tipos de dados conhecidos

int long

float complex

str

tuple list

dict

Verificando tipos

>>> i = 32>>> j = 4.1>>> k = 10L>>> l = [1, 2, 4]>>> t = 3, 1>>> d = {3:1, 4:'batata'}>>> type(i)<type 'int'>>>> type(j)<type 'float'>>>> type(k)<type 'long'>>>> type(l)<type 'list'>>>> type(t)<type 'tuple'>>>> type(d)<type 'dict'>

Que outros tipos de dados precisamos?

Desenhando aleatoriamente

import randomimport turtle

turtle.speed('fastest')

for i in range(1000):ang = random.randint(-40, 40)turtle.left(ang)

turtle.forward(2)

turtle.done()

hihi, parece uma formiga!Desenha mais!

Vamos adicionar tartarugas

import randomimport turtle

turtle.speed('fastest')

t1 = turtle.Turtle()t1.speed('fastest')t1.color(1, 0, 0)

for i in range(1000):ang = random.randint(-40, 40)turtle.left(ang)turtle.forward(2)

ang = random.randint(-40, 40)t1.left(ang)t1.forward(2)

turtle.done()

Vamos adicionar tartarugas

import randomimport turtle

turtle.speed('fastest')

col = 'red', 'green', 'blue'ts = []for i in range(3):

t = turtle.Turtle()t.speed('fastest')t.color(col[i])ts.append(t)

# continua no proximo slide...

Vamos adicionar tartarugas

# Continuacao

for i in range(1000):ang = random.randint(-40, 40)turtle.left(ang)turtle.forward(2)

for t in ts:ang = random.randint(-40, 40)t.left(ang)t.forward(2)

turtle.done()

O que são estas "tartarugas"?

O que são estas "tartarugas"?

>>> import turtle

>>> t = turtle.Turtle()

>>> type(t)

<class 'turtle.Turtle'>

Analisando

Que dados cada tartaruga possui?

● posição● orientação● cor● velocidade● etc (não conhecemos tudo)

Mais exemplos

Vetores 2d

>>> u = turtle.Vec2D(1, 3)>>> v = turtle.Vec2D(5, 10)>>> u+v(6.00,13.00)>>> u*v35>>> 2*u(2.00,6.00)>>> u.rotate(30)(-0.63,3.10)>>> type(u)<class 'turtle.Vec2D'>>>> type(v)<class 'turtle.Vec2D'>

Módulo datetime

>>> import datetime>>> x = datetime.date(2015, 11, 18)>>> x.day18>>> x.month11>>> x.year2015>>> x.ctime()'Wed Nov 18 00:00:00 2015'>>> x.weekday()2>>> x.today()datetime.date(2015, 11, 12)

Módulo datetime

>>> import datetime>>> a = datetime.time(12, 23, 49, 41878)>>> a.hour12>>> a.minute23>>> a.second49>>> a.microsecond41878>>> a.isoformat()'12:23:49.041878'

Podemos criar nosso próprio tipo?

Sim, podemos!

Classes

Uma classe é um tipo de dado no Python.

Todo valor pertence a alguma classe.

4 pertence à classe int

1.0 pertence à classe float

'samambaia' pertence à classe str

...

Classes

>>> help(int)

Help on class int in module __builtin__:

class int(object) | int(x=0) -> int or long | int(x, base=10) -> int or long | | Convert a number or string to an integer, or return 0 if no arguments | are given. If x is floating point, the conversion truncates towards zero. | Bla, bla, bla, bla, bla, etc, etc, bla, bla

Classes

>>> help(float)

Help on class float in module __builtin__:

class float(object) | float(x) -> floating point number | | Convert a string or number to a floating point number, if possible. | | Methods defined here: | | Bla, bla, bla, whiskas sache, bla, bla, bla, bla

Objetos

Um objeto é um exemplar (instância) de uma classe.

42 é um objeto da class int

'bola' é um objeto da classe strstr

5+2j é um objeto da classe complex

x = turtle.Turtle()

x é um objeto da classe turtle.Turtle

a rigor, x é uma variável associada a um objeto

Métodos

Métodos são as funções chamadas escrevendo objeto.metodo(parametros)

>>> x = 'batatinha quando nasce se esparrama pelo chao'

>>> x.upper()

'BATATINHA QUANDO NASCE SE ESPARRAMA PELO CHAO'

>>> x.count('a')

9

>>> x.split()

['batatinha', 'quando', 'nasce', 'se', 'esparrama', 'pelo', 'chao']

Atributos

Atributos são os dados que definem uma classe.

>>> x = 3+2j

>>> x.imag

2.0

>>> x.real

3.0

O que precisamos definir?

Primeiro passo: planejamento

Imagine que você esteja desenvolvendo um jogo.

No seu jogo, haverá vários personagens, que vão lutar entre si.

Cada personagem possui (pelo menos) os seguintes atributos:

● nome● pontos de vida● nível● XP: pontos de experiência

Criando uma classe

class Personagem:nome = 'sem nome'vida = 100nivel = 1xp = 0

Criando objetos desta classe

>>> a = Personagem()>>> a.nome'sem nome'>>> a.nivel1>>> a.vida100>>> a.xp0

Alterando objetos

a = Personagem()a.nome = 'Pikachu'

b = Personagem()b.nome = 'Charmander'

c = Personagem()c.nome = 'Bulbassauro'

Criando métodos

class Personagem:nome = 'sem nome'vida = 100nivel = 1xp = 0

def mostra_tudo(self):print 'nome:', self.nomeprint 'vida:', self.vidaprint 'nivel:', self.nivelprint 'xp:', self.xp

Criando métodos

a = Personagem()a.nome = 'Charmander'

b = Personagem()b.nome = 'Onix'b.vida = 80b.nivel = 13b.xp = 73

a.mostra_tudo()b.mostra_tudo()

nome: Charmandervida: 100nivel: 1xp: 0nome: Onixvida: 80nivel: 13xp: 73

Saída do programa:

Criando métodos

a = Personagem()a.nome = 'Charmander'

b = Personagem()b.nome = 'Onix'b.vida = 80b.nivel = 13b.xp = 73

Personagem.mostra_tudo(a)Personagem.mostra_tudo(b)

nome: Charmandervida: 100nivel: 1xp: 0nome: Onixvida: 80nivel: 13xp: 73

Saída do programa:

Criando métodos

class Personagem:nome = 'sem nome'vida = 100nivel = 1xp = 0

def mostra_tudo(self):print 'nome:', self.nomeprint 'vida:', self.vidaprint 'nivel:', self.nivelprint 'xp:', self.xp

def aumenta_xp(self, n):self.xp += nprint self.nome, 'ganhou', n, 'pontos de experiencia!'

Criando métodos

a = Personagem()a.nome = 'Butterfree'

b = Personagem()b.nome = 'Zubat'

a.aumenta_xp(37)b.aumenta_xp(42)

Butterfree ganhou 37 pontos de experiencia!Zubat ganhou 42 pontos de experiencia!

Saída do programa:

Construtor

class Personagem:nome = 'sem nome'vida = 100nivel = 1xp = 0

def __init__(self, nome):self.nome = nome

... bla bla bla

Criando métodos

a = Personagem('Diglett')b = Personagem('Psyduck')

a.aumenta_xp(61)b.aumenta_xp(25)

Diglett ganhou 61 pontos de experiencia!Psyduck ganhou 25 pontos de experiencia!

Saída do programa:

Construtor

class Personagem:nome = 'sem nome'vida = 100nivel = 1xp = 0

def __init__(self, nome):self.nome = nome

... bla bla bla

Este valor nunca será usado!

Construtor

class Personagem:

vida = 100nivel = 1xp = 0

def __init__(self, nome):self.nome = nome

... bla bla bla

Atributos

class Teste:lista = []

x = Teste()y = Teste()x.lista.append(5)y.lista.append(10)print x.listaprint y.lista

[5, 10][5, 10]

Saída do programa:

[5][10]

Saída do programa:

Atributos

class Teste:def __init__(self):

self.lista = []x = Teste()y = Teste()x.lista.append(5)y.lista.append(10)print x.listaprint y.lista

[5, 10][5, 10]

Saída do programa:

[5][10]

Saída do programa:

Evite problemas: defina atributos no construtor!

class Personagem:

def __init__(self, nome):self.nome = nome

self.vida = 100

self.nivel = 1

self.xp = 0

... bla bla bla

Mais funcionalidades

No nosso jogo, os personagens sobem de nível a cada 100 pontos de experiência.

Completando nossa classe

class Personagem:... bla bla bla

def aumenta_xp(self, n):self.xp += nprint self.nome, 'ganhou', n, 'pontos de experiencia!'

if self.xp >= 100:

self.nivel += 1

self.xp = 0

print self.nome, 'subiu para o nivel', self.nivel

Testando nossa classe

x = Personagem('Ekans')y = Personagem('Arbok')x.aumenta_xp(38)y.aumenta_xp(47)x.aumenta_xp(29)y.aumenta_xp(39)x.aumenta_xp(43)y.aumenta_xp(26)

Ekans ganhou 38 pontos de experiencia!Arbok ganhou 47 pontos de experiencia!Ekans ganhou 29 pontos de experiencia!Arbok ganhou 39 pontos de experiencia!Ekans ganhou 43 pontos de experiencia!Ekans subiu para o nivel 2Arbok ganhou 26 pontos de experiencia!Arbok subiu para o nivel 2

Saída do programa:

Testando nossa classe

import random

a = Personagem('Ponyta')b = Personagem('Slowpoke')c = Personagem('Cubone')

for i in range(5):a.aumenta_xp(random.randint(15, 50))b.aumenta_xp(random.randint(15, 50))c.aumenta_xp(random.randint(15, 50))

Testando nossa classe

Ponyta ganhou 27 pontos de experiencia!Slowpoke ganhou 29 pontos de experiencia!Cubone ganhou 45 pontos de experiencia!Ponyta ganhou 16 pontos de experiencia!Slowpoke ganhou 21 pontos de experiencia!Cubone ganhou 38 pontos de experiencia!Ponyta ganhou 20 pontos de experiencia!Slowpoke ganhou 28 pontos de experiencia!Cubone ganhou 50 pontos de experiencia!Cubone subiu para o nivel 2Ponyta ganhou 15 pontos de experiencia!Slowpoke ganhou 48 pontos de experiencia!Slowpoke subiu para o nivel 2Cubone ganhou 37 pontos de experiencia!Ponyta ganhou 38 pontos de experiencia!Ponyta subiu para o nivel 2Slowpoke ganhou 31 pontos de experiencia!Cubone ganhou 45 pontos de experiencia!

Saída do programa:

Documentação

Documentação com docstrings

def area_triangulo(a, b, c): 'Calcula a area de um triangulo.' p = (a+b+c)/2.0 return (p*(p-a)*(p-b)*(p-c))**0.5

string explicando a função

Documentação com docstrings

def area_triangulo(a, b, c): '''Calcula a area de um triangulo de lados a, b, c.''' p = (a+b+c)/2.0 return (p*(p-a)*(p-b)*(p-c))**0.5

string explicando a função

Documentação com docstrings

>>> help(area_triangulo)Help on function area_triangulo in module __main__:

area_triangulo(a, b, c) Calcula a area de um triangulo de lados a, b, c.

Documentando nossa classe

>>> help(Personagem) Help on class Personagem in module __main__:

class Personagem | Methods defined here: | | __init__(self, nome) | | aumenta_xp(self, n) | | mostra_tudo(self)

Documentando nossa classe

class Personagem:'''Um personagem do nosso incrivel jogo.Cada personagem possui:- nome- pontos de vida- nivel- pontos de experiencia'''

bla, bla, bla

Documentando nossa classe

>>> help(Personagem) Help on class Personagem in module __main__:

class Personagem | Um personagem do nosso incrivel jogo. | Cada personagem possui: | - nome | - pontos de vida | - nivel | - pontos de experiencia | | Methods defined here: | | __init__(self, nome) | | aumenta_xp(self, n) | | mostra_tudo(self)

Documentando nossa classe

class Personagem:...def __init__(self, nome):

'''Inicializa um personagem com o nome especificado.'''self.nome = nomeself.vida = 100self.nivel = 1self.xp = 0

...

Documentando nossa classe

class Personagem:...def aumenta_xp(self, n):

'''Ganha n pontos de experiencia. Aumenta de nivel caso os pontos de experiencia chegarem a 100 ou mais.'''self.xp += nprint self.nome, 'ganhou', n, 'pontos de experiencia!'if self.xp >= 100:

self.nivel += 1self.xp = 0print self.nome, 'subiu para o nivel', self.nivel

...

Documentando nossa classe

class Personagem:...def mostra_tudo(self):

'''Imprime todas os dados do personagem.'''print 'nome:', self.nomeprint 'vida:', self.vidaprint 'nivel:', self.nivelprint 'xp:', self.xp

...

help(Personagem)

Help on class Personagem in module __main__:

class Personagem | Um personagem do nosso incrivel jogo. | Cada personagem possui: | - nome | - pontos de vida | - nivel | - pontos de experiencia | | Methods defined here: | | __init__(self, nome) | Inicializa um personagem com | o nome especificado. | | aumenta_xp(self, n) | Ganha n pontos de experiencia. | Aumenta de nivel caso os pontos de | experiencia chegarem a 100 ou mais. | | mostra_tudo(self) | Imprime todas os dados do personagem.

Guido van Rossum