Upload
hadung
View
223
Download
0
Embed Size (px)
Citation preview
Programação IAula 11 — Mais sobre ciclos e iteração
Pedro Vasconcelos
DCC/FCUP
2017
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 5 / 26
Exemplo (cont.)
>>> crescente(10)123456789fim
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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
Estes operadores podem tornar o program mais díficil de ler.
Recomendação: não usar nos vossos programas.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 9 / 26
Sequência de Collatz
Nem sempre é fácil determinar se um ciclo while termina.
def sequencia(n):while n != 1:
print(n)if n%2==0: # n é par
n = n//2else: # n é ímpar
n = 3*n+1
Niguém provou que esta função termina para qualquer n > 0 (nemencontrou um contra-exemplo).
http://en.wikipedia.org/wiki/Collatz_conjecture
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 11 / 26
Exemplo
def crescente(n):# i percorre valores 1 até n-1 de 1 em 1for i in range(1, n):
print(i)# fim do cicloprint(’fim’)
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 12 / 26
Exemplo (cont.)
>>> crescente(10)123456789fim
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 15 / 26
Factorial usando um ciclo for
def factorial(n):p = 1 # p acumula o produtofor i in range(2, n+1): # i vai de 2 até n
p = p * i# final do ciclo: p == 1*2*...*nreturn p
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 16 / 26
Factorial usando um ciclo while
def factorial(n):p = 1 # p acumula o produtoi = 2 # i vai de 2 até nwhile i<=n:p = p * ii = i + 1
# final do ciclo: p == 1*2*...*nreturn p
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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
Além disso:return termina a função e retorna o resultado (e, portanto,
também interrompe qualquer ciclo)
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 23 / 26
Exemplo: teste no fim do corpo
import random# escolher um inteiro 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 24 / 26
Sumário
while repetição controlada por uma condiçãofor repetir para uma sequência de valores
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 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) Programação I Aula 11 — Mais sobre ciclos e iteração 2017 26 / 26