Computação 1 - dcc.ufrj.brlcarvalho/comp1/slides/Aula7T.pdf · Cada repetição dos comandos é...

Post on 25-Sep-2018

216 views 0 download

Transcript of Computação 1 - dcc.ufrj.brlcarvalho/comp1/slides/Aula7T.pdf · Cada repetição dos comandos é...

Computação 1

Aula 7 Teóricaprofessor: Leonardo Carvalho

Ementa2

Ementa

Introdução ao ambiente de programação Python

Funções

- declaração

- parâmetros

- valor de retorno

- chamada de funções

Manipulação de dados na programação

- Tipos de dados básicos

- Variáveis, atribuição, escopo de variáveis

- Tipos compostos: Tupla, String, Listas, Dicionários

Estruturas de Controle

- Estrutura Condicional (if, if else, elif)

- Laço com qualquer condição de parada (while)

- Laço com número pré-determinado de repetições (for)

Matrizes

Programa principal (main), entrada e saída simples (input e print).

3

Ementa

Introdução ao ambiente de programação Python

Funções

- declaração

- parâmetros

- valor de retorno

- chamada de funções

Manipulação de dados na programação

- Tipos de dados básicos

- Variáveis, atribuição, escopo de variáveis

- Tipos compostos: Tupla, String, Listas, Dicionários

Estruturas de Controle

- Estrutura Condicional (if, if else, elif)

- Laço com qualquer condição de parada (while)

- Laço com número pré-determinado de repetições (for)

Matrizes

Programa principal (main), entrada e saída simples (input e print).

4

Relembrando aula passada

5

def quadrado(L):'''Desenha um quadrado de lado L.'''turtle.forward(L)turtle.left(90)turtle.forward(L)turtle.left(90)turtle.forward(L)turtle.left(90)turtle.forward(L)turtle.left(90)

# Testandoquadrado(100)turtle.up()turtle.goto(120, 130)turtle.down()quadrado(200)

Quadrado

6

def triangulo(L):'''Desenha um triangulo equilatero de lado L.'''turtle.forward(L)turtle.left(120)turtle.forward(L)turtle.left(120)turtle.forward(L)turtle.left(120)

# Testandotriangulo(100)turtle.up()turtle.goto(120, 130)turtle.down()triangulo(200)

Triângulos

7

Crie uma função que desenha um pentágono.

# Testandopentagono(100)turtle.up()turtle.goto(120, 130)turtle.down()pentagono(150)

Exercício 1

8

def pentagono(L):'''Desenha um pentagono de lado L.'''turtle.forward(L)turtle.left(360.0/5)turtle.forward(L)turtle.left(360.0/5)turtle.forward(L)turtle.left(360.0/5)turtle.forward(L)turtle.left(360.0/5)turtle.forward(L)turtle.left(360.0/5)

Exercício 1

9

Crie uma função que desenha um hexágono.

# Testandohexagono(100)turtle.up()turtle.goto(130, 130)turtle.down()hexagono(150)

Exercício 2

10

def hexagono(L):'''Desenha um hexagono de lado L.'''turtle.forward(L)turtle.left(360.0/6)turtle.forward(L)turtle.left(360.0/6)turtle.forward(L)turtle.left(360.0/6)turtle.forward(L)turtle.left(360.0/6)turtle.forward(L)turtle.left(360.0/6)turtle.forward(L)turtle.left(360.0/6)

Exercício 2

11

E se...

Se quisermos desenhar um decágono?

Se quisermos desenhar um dodecágono?

Se quisermos desenhar um polígono regular de n lados?

12

Crie uma função que recebe uma sequência contendo três pontos e desenha um pequeno círculo em cada ponto.

# TestandoP = (20, 30), (50, 120), (-35, 80)desenha_pontos(P)Q = (-120, -40), (150, 40), (-80, 70)turtle.color('red')desenha_pontos(Q)

Exercício 3

13

def desenha_pontos(P):'''Desenha três pontos de uma sequência P.'''turtle.up()turtle.goto(P[0])turtle.dot()turtle.goto(P[1])turtle.dot()turtle.goto(P[2])turtle.dot()

Exercício 3

14

Crie uma função que recebe uma sequência contendo cinco pontos e desenha um pequeno círculo em cada ponto.

# TestandoP = (20, 30), (50, 120), (-35, 80), (100, 200), (130, 90)turtle.color('blue')desenha_pontos(P)Q = (-120, -40), (150, 40), (-80, 70), (0, 0), (140, -120)turtle.color('red')desenha_pontos(Q)

Exercício 4

15

def desenha_pontos(P):'''Desenha cinco pontos de uma sequência P.'''turtle.up()turtle.goto(P[0])turtle.dot()turtle.goto(P[1])turtle.dot()turtle.goto(P[2])turtle.dot()turtle.goto(P[3])turtle.dot()turtle.goto(P[4])turtle.dot()

Exercício 4

16

E se...17

Mais pontos

Crie uma função que recebe uma sequência contendo 15 pontos e desenha um pequeno círculo em cada ponto.

def desenha_pontos(P):

'''Desenha quinze pontos

de uma sequência P.'''

turtle.up()

turtle.goto(P[0])

turtle.dot()

turtle.goto(P[1])

turtle.dot()

turtle.goto(P[2])

turtle.dot()

turtle.goto(P[3])

turtle.dot()

turtle.goto(P[4])

turtle.dot()

turtle.goto(P[5])

turtle.dot()

turtle.goto(P[6])

turtle.dot()

turtle.goto(P[7])

turtle.dot()

turtle.goto(P[8])

turtle.dot()

turtle.goto(P[9])

turtle.dot()

turtle.goto(P[10])

turtle.dot()

turtle.goto(P[11])

turtle.dot()

turtle.goto(P[12])

turtle.dot()

turtle.goto(P[13])

turtle.dot()

turtle.goto(P[14])

turtle.dot()

18

Mais pontos

Crie uma função que recebe uma sequência contendo 200 pontos e desenha um pequeno círculo em cada ponto.

19

Mais pontos

Crie uma função que recebe uma sequência contendo 1000000 pontos e desenha um pequeno círculo em cada ponto.

20

n pontos

Crie uma função que recebe uma sequência contendo um número qualquer de pontos e desenha um pequeno círculo em cada ponto.

21

estrutura de repetição

22

for x in sequencia: ...#Faz algo com x

23

Exemplo

def desenha_pontos(P):'''Desenha todos os pontos de uma sequência P.'''turtle.up()for x in P:

turtle.goto(x)turtle.dot()

24

Não precisa ser x

def desenha_pontos(P):'''Desenha todos os pontos de uma sequência P.'''turtle.up()for y in P:

turtle.goto(y)turtle.dot()

25

Não precisa ser x

def desenha_pontos(P):'''Desenha todos os pontos de uma sequência P.'''turtle.up()for ponto in P:

turtle.goto(ponto)turtle.dot()

26

Não precisa ser x

def desenha_pontos(P):'''Desenha todos os pontos de uma sequência P.'''turtle.up()for tuts_tuts_tuts_tuts in P:

turtle.goto(tuts_tuts_tuts_tuts)turtle.dot()

27

Funciona com qualquer sequência

...L = 3, 1, 'bigorna'for v in L:

turtle.write(v, font=('Arial', 20, 'normal'))turtle.forward(50)

...

28

Funciona com qualquer sequência

...for v in 3, 1, 'bigorna':

turtle.write(v, font=('Arial', 20, 'normal'))turtle.forward(50)

...

29

Funciona com qualquer sequência

...for v in range(7):

turtle.write(v, font=('Arial', 20, 'normal'))turtle.forward(50)

...

30

Exercício

Função que recebe uma lista L e um valor x e retorna os valores de L que são menores do que x.

>>> L = 32, 10, 95, 74, 89, 5, 19, 59

>>> menores(L, 30)[10, 5, 19]>>> menores(L, 80)[32, 10, 74, 5, 19, 59]>>> menores(L, 0)[]

31

Exercício

def menores(L, x):'''Retorna uma lista com os valores de L menores do que x.'''res = []for v in L:

if v < x:res.append(v)

return res

32

33

34

Dando nome aos bois

Ao utilizar um for estamos criando um loop

Cada repetição dos comandos é chamada de iteração

Dizemos também que estamos iterando sobre uma sequência

De forma mais geral o for funciona com objetos iteráveis

for v in iterável:

comandos

35

Objetos iteráveis

Até agora só vimos três tipos de objetos iteráveis: tuplas, listas e strings

Outros objetos iteráveis: conjuntos, dicionários e geradores

Só veremos conjuntos e dicionários em outra aula

Não vamos aprender a criar geradores, mas vamos usar alguns

36

Geradores

Um gerador funciona como uma sequência, a diferença é que os dados não ficam todos guardados na memória.

Exemplo:

>>> a = range(10)>>> b = xrange(10) # xrange é um gerador!>>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> bxrange(10)

37

Geradores

for x in xrange(10, 30):turtle.forward(x)turtle.left(5)

38

Comparação range vs xrange

Compare o tempo de execução entre os comandos:

>>> a = range(100000000)

>>> b = xrange(100000000)

Falando em range

Outra forma de percorrer os itens de uma sequência:

...L = 'eita', 'vixe', 'oxe'for i in range(len(L)):

turtle.write(L[i], font=('Arial', 14, 'normal'))turtle.forward(50)

...

39

Falando em range

Esta forma é útil quando queremos usar também os índices

...L = 'eita', 'vixe', 'oxe'for i in range(len(L)):

r = str(i) + ': ' + L[i]turtle.write(r, font=('Arial', 14, 'normal'))turtle.forward(100)

...

40

Exercício

Crie uma função que recebe uma string L e um caractere x e retorna uma lista com todas as posições de x em L

>>> posicoes('Quem eh essa ai, papai?', 'a')[11, 13, 18, 20]>>> posicoes('Ta cheio de assunto, hein?', ' ')[2, 8, 11, 20]>>> posicoes('Ta cheio de assunto, hein?', 'e')[5, 10, 22]

41

Exercício

def posicoes(L, x):'''Retorna uma lista com todas as posicoes onde x aparece em L.'''res = []for i in range(len(L)):

if L[i] == x:res.append(i)

return res

42

Exercício

Crie uma função que recebe uma sequência L de valores e retorna uma lista contendo a diferença entre valores consecutivos de L.

>>> diferencas([1, 2, 5, 7, 9, 8])[1, 3, 2, 2, -1]>>> diferencas([18, 5, 9, 10, 30])[-13, 4, 1, 20]>>> diferencas([7, 8, 8, 8, 9, 9, 3, 3, 3])[1, 0, 0, 1, 0, -6, 0, 0]

43

Exercício

def diferencas(L):'''Retorna a diferenca entre valores consecutivos de L.'''res = []for i in range(1, len(L)):

res.append(L[i] - L[i-1])return res

44

Exercício

Crie uma função que recebe um número inteiro n e retorna uma lista contendo n valores entre 0.0 e 1.0, igualmente espaçados

>>> sequencia(3)[0.0, 0.5, 1.0]>>> sequencia(6)[0.0, 0.2, 0.4, 0.6, 0.8, 1.0]>>> sequencia(20)[0.0, 0.05263157894736842, 0.10526315789473684, 0.15789473684210525, 0.21052631578947367, 0.2631578947368421, 0.3157894736842105, 0.3684210526315789, 0.42105263157894735, 0.47368421052631576, 0.5263157894736842, 0.5789473684210527, 0.631578947368421, 0.6842105263157895, 0.7368421052631579, 0.7894736842105263, 0.8421052631578947, 0.8947368421052632, 0.9473684210526315, 1.0]

45

Exercício

def sequencia(n):'''Retorna uma sequencia de n valores de 0.0 a 1.0.'''res = []for i in range(n):

res.append(i/(n-1.0))return res

46

Exercício

Crie uma função que recebe um número inteiro n e retorna uma lista contendo n pontos da curva dada por

47

Exercício

def curva(n):'''Retorna uma lista contendo n pontos da curva (x, y) = (100 sen t, 200 sen 2t)'''res = []for i in range(n):

t = i/(n-1.0)*2*math.pip = 100*math.sin(t), 200*math.sin(2*t)res.append(p)

return res

48

Testando

turtle.color('green')desenha_pontos(curva(50))

P = (20, 30), (50, 120), (-35, 80), (100, 200), (130, 90)turtle.color('blue')desenha_pontos(P)

Q = (-120, -40), (150, 40), (-80, 70)turtle.color('red')desenha_pontos(Q)

49

Exercício

Função que recebe um número inteiro n e um número real x e desenha um polígono regular de n lados, cada lado com tamanho x.

poligono(3, 40)

...

poligono(5, 70)

...

poligono(12, 50)

50

Exercício

def poligono(n, x):'''Desenha um poligono de n lados cada lado de tamanho x.'''for i in range(n):

turtle.forward(x)turtle.left(360.0/n)

51

E pra que serviu o i?

Exercício

def poligono(n, x):'''Desenha um poligono de n lados cada lado de tamanho x.'''for i in range(n):

turtle.forward(x)turtle.left(360.0/n)

52

Pra nada...

Exercício

Não é necessário, mas vamos mandar a tartaruga escrever o i.

def poligono(n, x):'''Desenha um poligono de n lados cada lado de tamanho x.'''for i in range(n):

turtle.write(i)turtle.forward(x)turtle.left(360.0/n)

53

54

55

Múltiplas variáveis

56

Se soubermos que uma sequência é composta por pares, podemos então usar duas variáveis no for.

L = (3, 'agua'), (1, 'suco'), (2, 'refrigerante')

res = ''

for i, bebida in L:

res += i*bebida + ' '

...

>>> res

'aguaaguaagua suco refrigeranterefrigerante '

Múltiplas variáveis

57

O mesmo vale para sequências de trios, quádruplas, etc.

V = (30, 20, 'rato'), (100, -80, 'iguana'), (-200, -50, 'tamandua')

for x, y, palavra in V:

turtle.goto(x, y)

turtle.write(palavra)

Unir duas sequências

58

Podemos criar uma sequência que une duas sequências através da função zip:

>>> x = 'Camaro', 'Fuscao', 'Ferrari'

>>> y = 'amarelo', 'preto', 'vermelha'

>>> zip(x, y)

[('Camaro', 'amarelo'), ('Fuscao', 'preto'), ('Ferrari', 'vermelha')]

Unir duas sequências

59

Isto é útil quando queremos percorrer duas sequências de uma vez só:

>>> x = 'Camaro', 'Fuscao', 'Ferrari'>>> y = 'amarelo', 'preto', 'vermelha'>>> res = ''>>> for carro, cor in zip(x, y):... res += carro + ' ' + cor + ', '... >>> res'Camaro amarelo, Fuscao preto, Ferrari vermelha, '

enumerate

A função enumerate(L) retorna um gerador que produz pares do tipo (i, L[i])

Podemos usar esta função para acessar os índices sem usar a função range.

...L = 'eita', 'vixe', 'oxe'for i, v in enumerate(L):

r = str(i) + ': ' + vturtle.write(r, font=('Arial', 14, 'normal'))turtle.forward(100)

...

60

61