Introdução à Programação Aula 11 Mais sobre …pbv/aulas/ipm/teorica-11.pdfNesta aula Vamos ver...

26
Introdução à Programação Aula 11 — Mais sobre ciclos e iteração Pedro Vasconcelos DCC/FCUP 2015 Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 1 / 26

Transcript of Introdução à Programação Aula 11 Mais sobre …pbv/aulas/ipm/teorica-11.pdfNesta aula Vamos ver...

Introdução à ProgramaçãoAula 11 — Mais sobre ciclos e iteração

Pedro Vasconcelos

DCC/FCUP

2015

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 1 / 26

Nesta aula

Vamos ver a iteração em Python mais detalhadamente.

1 Ciclos while

2 Ciclos for

3 Saída e continuação

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 2 / 26

Iteração

Repetir instruções um número variável de vezesPara exprimir computação, tabelar uma função, etc.

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 3 / 26

Ciclos while

while condição:...instruções a repetir...

Repete as instruções enquanto a condição for verdadeiraA condição é re-avaliada após cada iteraçãoO corpo do ciclo deve modificar alguma variável da condição

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 4 / 26

Exemplo

def crescente(n):i = 1while i<n:

# repete estas instruçõesprint(i)i = i+1

# após o fim do cicloprint(’fim’)

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 5 / 26

Exemplo (cont.)

>>> crescente(10)123456789fim

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 6 / 26

Modificar variáveis

Muitas vezes necessitamos de incrementar ou decrementar variáveis.

...i = i+1...

Esta atribuição pode ser abreviada:

...i += 1...

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 7 / 26

Modificar variáveis (cont.)

Mais geralmente:

v = v + k −→ v += kv = v - k −→ v -= kv = v * k −→ v *= kv = v / k −→ v /= k

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 8 / 26

Um ciclo while pode não terminar

def repete():n = 1while True: # repete indefinidamente

print(’Se’,n,’elefantes incomodam muita gente’)print(n+1,’elefantes incomodam muito mais!’)n += 1

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 9 / 26

Sequência de Collatz

Nem sempre é fácil concluir que um ciclo while não termina.

def sequencia(n):while n != 1:

print(n)if n%2==0: # n é par

n = n//2else: # n é ímpar

n = 3*n+1

Não sabemos se esta função termina para todo n > 0.

http://en.wikipedia.org/wiki/Collatz_conjecture

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 10 / 26

Ciclos for

for variável in sequência:...instruções a repetir...

Repete instruções para com variável tomar sucessivos valores dasequênciaO número de iterações está limitado pelo comprimento dasequência

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 11 / 26

Exemplo

def crescente(n):# i vai de 1 até n-1 por incrementos de 1for i in range(1, n):

print(i)# fim do cicloprint(’fim’)

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 12 / 26

Exemplo (cont.)

>>> crescente(10)123456789fim

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 13 / 26

Sequências aritméticas

A função range(a,b, k) gera sequências em progressão aritmética

a, a + k , a + 2k , . . .

cujos valores são menores que b.

>>> list(range(10))[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> list(range(1,11))[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>> list(range(0, 30, 5))[0, 5, 10, 15, 20, 25]

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 14 / 26

Factorial iterativo

n! = 1× 2× · · · × (n − 1)× n

1 Inicialmente: p = 12 repetir para i de 2 até n: p ← p × i3 No fim do ciclo o valor de p é n!

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 15 / 26

Factorial usando um ciclo for

def factorial(n):# p acumula o produto 1*2*...*np = 1# repetir para i de 2 até nfor i in range(2, n+1):

p *= i# resultado é o valor de preturn p

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 16 / 26

Factorial usando um ciclo while

def factorial(n):# p acumula o produto 1*2*...*np = 1# repetir para i de 2 até ni = 2while i<=n:p *= ii += 1

# resultado é o valor de preturn p

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 17 / 26

Factorial usando um ciclo while (cont.)

Mais geralmente:

Podemos sempre re-escrever um ciclo for num ciclo while.

Nem sempre podemos re-escrever um ciclo while como um ciclofor (exemplo: a função Collatz).

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 18 / 26

Saída e continuação num ciclo

Duas instruções que permitem alterar a execução de um ciclo:break sair a meio do ciclo

continue passar à próxima iteração

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 19 / 26

Break com um ciclo for

for i in [12, 16, 17, 24, 29]:if i % 2 == 1: # se é ímpar

break # ... termina o cicloprint(i)

print("fim")

Resultado:

1216fim

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 20 / 26

Continue com um ciclo for

for i in [12, 16, 17, 24, 29, 30]:if i % 2 == 1: # se é impar

continue # ...passa ao próximoprint(i)

print("fim")

Resultado:

12162430fim

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 21 / 26

Saída de um ciclo while

O teste do ciclo while ocorre antes da execução do corpo.

Podemos usar break para colocar um teste no corpo do ciclo.

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 22 / 26

Exemplo: teste no meio do corpo

total = 0while True:

resposta = input("Entre um número (ou vazio)")if resposta == ’’:

break # termina o ciclototal += int(resposta)

print("Total = ", total)

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 23 / 26

Exemplo: teste no fim do corpo

import random# escolher aleatoriamente entre [1, 1000]number = random.randint(1, 1000)guesses = 0while True:

guess = int(input("Número entre 1 e 1000: "))guesses += 1if guess > number:

print(guess, "é alto.")elif guess < number:

print(guess, "é baixo.")else:

breakprint(guess, "é correto.")print(guesses, "tentativas.")

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 24 / 26

Sumário

while repetir enquanto a condição é verdadeirafor repetir para uma sequência de valores

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 25 / 26

Que tipo de ciclo usar?

Ciclo for 1 iterar sobre sequências aritméticas;2 iterar sobre listas ou tuplos.

Ciclo while nos outros casos.

Pedro Vasconcelos (DCC/FCUP) Introdução à Programação Aula 11 — Mais sobre ciclos e iteração 2015 26 / 26