36
ICE-B 6 - Iteração Ludwig Krippahl

6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

  • Upload
    lyhanh

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

ICE-B

6 - Iteração

Ludwig Krippahl

Page 2: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

1

Iteração

Resumo■ O ciclo for■ Exemplo: enzimas de restrição■ Função range e iteração pelos índices■ Exemplos: média e outras estatísticas■ Devolver mais de um valor■ Criar uma nova lista num ciclo■ Exemplos e processamento de strings

Page 3: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

2

Iteração

O ciclo for

Page 4: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

3

O ciclo for

Repetir instruções■ A instrução for permite repetir um bloco de instruções uma vez

para cada elemento■ A sintaxe é:

for var in iterable: ... ... ...

■ Onde iterable é um objecto que devolve elementos por ordem■ A variável var referir um elemento de cada vez• e as instruções no corpo do ciclo (indentadas) são executadas

Page 5: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

4

O ciclo for

Repetir instruções■ Exemplo: calcular a soma de números numa lista

total = 0 vals = [3,5,7,1,2] for v in vals: total = total + v print("Sum:",total)

■ O total começa a zero, pois é onde vamos somar cada valor■ A linha for v in vals: faz a variável v referir cada um dos

elementos de vals■ A cada passo é executado total = total + v■ O print está fora do ciclo (ver indentação)

Sum: 18

Page 6: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

5

Iteráveis e Iteradores

■ Um iterable é um objecto que implementa __iter__• Devolve um iterador

■ Um iterator é um objecto que implementa __next__• Devolve um elemento de cada vez até ao fim• QUando não tem mais levanta uma excepção StopIteration

■ O ciclo for• Pede iterador• Pede próximo• Até ao fim

In : things = ['larch',42, 3.14153]In : iterator = things.__iter__() In : iterator.__next__() Out: 'larch' In : iterator.__next__() Out: 42 In : iterator.__next__() Out: 3.14153 iterator.__next__() iterator.__next__() StopIteration

In : for one_thing in things: ... print(one_thing) larch 42 3.14153

Page 7: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

6

Ciclo for

Enzimas de restrição

Page 8: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

7

Enzimas de restrição

Enzimas de restrição, com ciclo for■ O programa da aula anterior dá-nos uma lista de fragmentos

# -*- coding: utf-8 -*- """ Simulates DNA digestion by enzymes """ def digest_sequence(sequence,recon,cut): """Return a list of fragments from cutting the sequence""" marked = sequence.replace(recon,cut) frags = marked.split('-') return frags recon = 'TGTACA' cut = 'T-GTACA' sequence = 'GATCCTCCATATACAACGGTATCTGTACATCCACCTCAGGTTT'+\ 'AGATCTCAACAATGTACACGGAACCATTGCCGACATG' fragments = digest_sequence(sequence, recon, cut)

Page 9: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

8

Enzimas de restrição

Enzimas de restrição, com ciclo for■ O programa da aula anterior dá-nos uma lista de fragmentos■ Com um ciclo podemos percorrer essa lista e obter estatísticas

In : for frag in fragments: ... print(len(frag)) ... 24 32 24

■ Nota: se escrevemos um bloco com corpo na consola a consolaespera pela terminação (linha vazia) antes de executar tudo

Page 10: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

9

"Função" range

Enzimas de restrição, com ciclo for■ Vamos supor que queremos indicar não só o comprimento mas

também o índice do fragmento■ A "função" range serve para isto• Não é exactamente uma função (é uma classe)

■ Devolve um iterável que itera por N inteiros começando por zero• Opcionalmente: range(start,end) ou range(start,end,step)

In : for ix in range(5): print(ix) 0 1 2 3 4

In : for ix in range(6,18,3): print(ix) 6 9 12 15

Page 11: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

10

"Função" range

Enzimas de restrição, com ciclo for■ Vamos supor que queremos indicar não só o comprimento mas

também o índice do fragmento■ A "função" range serve para isto• Não é exactamente uma função (é uma classe)

■ Devolve um iterável que itera por N inteiros começando por zero• Conveniente para os índices de vectores

In : for ix in range(len(fragments)): print(ix,len(fragments[ix])) 0 24 1 32 2 24

Page 12: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

11

Função enumerate

Enzimas de restrição, com ciclo for■ A função enumerate recebe um iterável e devolve um iterador de

tuplos (índice, elemento)• Isto permite ter logo acesso ao índice e ao elemento

In : things = ['larch',42, 3.14153] In : for x in enumerate(things): print(x) (0, 'larch') (1, 42) (2, 3.14153)

Page 13: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

12

Função enumerate

Enzimas de restrição, com ciclo for■ A função enumerate recebe um iterável e devolve um iterador de

tuplos (índice, elemento)• Isto permite ter logo acesso ao índice e ao elemento• Mais prático ainda se "desempacotarmos"

In : things = ['larch',42, 3.14153] In : for ix,thing in enumerate(things): print('Thing', ix, 'is', thing) Thing 0 is larch Thing 1 is 42 Thing 2 is 3.14153

Page 14: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

13

Ciclo for

Exemplos com ciclos

Page 15: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

14

Exemplos

Exemplo: calcular a média aritmética■ Começamos com zero e somamos os elementos da lista■ No final dividimos pelo número de elementos (len)■ (Nota: na prática existe sum e funções para isto em numpy)

def mean(values): """ return the average of an array of values """ total = 0 for val in values: total = total + val return total/len(values)

In : average([1,2,3,4,5]) Out: 3.0

Page 16: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

15

Exemplos

Exemplo: calcular a média geométrica■ Começamos a 1, multiplicamos os elementos da lista■ Raíz índice n

(∏i=1

n

xi)1n

def geometric_mean(values): """ return the geometric mean of an array of values """ product = 1 for val in values: product = product * val return product**(1/len(values))

In : geometric_mean([1,2,3,4,5]) Out: 2.605171084697352

Page 17: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

16

Exemplos

Exemplo: estatísticas ( )μ, σ

■ Queremos a média e o desvio padrão de uma amostra de valores

■ Já temos a média, falta o resto

μ = σ =1

n ∑i=1

n

xi

( − μ∑n

i=1 xi )2

n

‾ ‾‾‾‾‾‾‾‾‾‾‾‾‾√

def mean(values): """ average of an array of values """ total = 0 for val in values: total = total + val return total/len(values)

def standard_dev(values,mean): """ s.d. from values and mean """ def statistics(values): """ mean and s.d. from values """

■ Nota: parâmetro mean esconde função dentro de standard_dev• Nomes locais têm precedência

Page 18: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

17

Exemplos

Exemplo: estatísticas ( )μ, σ

■ Queremos a média e o desvio padrão de uma amostra de valores

■ Testar sempre cada função

μ = σ =1

n ∑i=1

n

xi

( − μ∑n

i=1 xi )2

n

‾ ‾‾‾‾‾‾‾‾‾‾‾‾‾√

def standard_dev(values,mean): """ s.d. from values and mean """ total = 0 for val in values: total = total+(val-mean)**2 return (total/len(values))**0.5

In : vals = [4,4,4,4,4] In : standard_dev(vals,mean(vals)) Out: 0.0 In : vals2= [2,4] standard_dev(vals2,mean(vals2)) Out: 1.0

Page 19: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

18

Exemplos

Exemplo: estatísticas ( )μ, σ

■ Nota: devolve um tuplo com dois valores

def statistics(values): """ return the mean and standard deviation of a set of values """ sample_mean = mean(values) st_dev = standard_dev(values, sample_mean) return sample_mean, st_dev

In : vals = [1,2,3,4,4,5,5] In : statistics(vals) Out: (3.4285714285714284, 1.3997084244475304) In : m, std = statistics(vals) In : m Out: 3.4285714285714284 In : std Out: 1.3997084244475304

Page 20: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

19

Exemplos

Exemplo: lista com os elementos ao quadrado■ Para criar uma lista, podemos começar com a lista vazia e usar o

método append para acrescentar elementos

def squares(values): """ return a list with the elements of values squared """ result = [] for val in values: result.append(val**2) return result

In : squares([1,2,3,4,5]) Out: [1, 4, 9, 16, 25]

Page 21: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

20

Exemplos

Série de Fibonacci■ A série de Fibonacci é definida recursivamente como

■ Isto pode ser facilmente implementado com um ciclo for= 0 = 1 = +F0 F1 Fn Fn−1 Fn−2

def fibonacci(N): "return a list with the first N Fibonacci numbers" f_numbers = [0,1] for _ in range(N-2): f_numbers.append(f_numbers[-1]+f_numbers[-2]) return f_numbers

■ Não precisamos da variável do ciclo• O nome _ é usado por convenção para "don't care"

Page 22: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

21

Exemplos

Série de Fibonacci■ A série de Fibonacci é definida recursivamente como

■ Isto pode ser facilmente implementado com um ciclo for= 0 = 1 = +F0 F1 Fn Fn−1 Fn−2

def fibonacci(N): "return a list with the first N Fibonacci numbers" f_numbers = [0,1] for _ in range(N-2): f_numbers.append(f_numbers[-1]+f_numbers[-2]) return f_numbers

■ Funciona bem, mas só se N ≥ 2

In : fibonacci(10) Out: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] In : fibonacci(1) Out: [0, 1]

Page 23: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

22

Exemplos

Série de Fibonaccidef fibonacci(N): "return a list with the first N Fibonacci numbers" f_numbers = [0,1] for _ in range(N-2): f_numbers.append(f_numbers[-1]+f_numbers[-2]) return f_numbers[:N]

■ Podemos resolver o problema com "slicing" dos N primeiros• Funciona para quase todos os casos...

In : fibonacci(10) Out: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] In : fibonacci(1) Out: [0] In : fibonacci(0) Out: [] In : fibonacci(-10) Out: []

Page 24: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

23

Exemplos

Acrescentar vectores a uma lista■ O método append acrescenta o argumento como um elemento.■ O método extend acrescenta cada elemento do argumento como

um elemento.

In : a_list = [0] Out: a_list.append('abc') In : a_list Out: [0, 'abc'] In : a_list.extend('abc') In : a_list Out: [0, 'abc', 'a', 'b', 'c'] In : a_list.extend([1,2,3]) In : a_list Out: [0, 'abc', 'a', 'b', 'c', 1, 2, 3]

Page 25: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

24

Exemplos

Contar tamanhos de palavras (Demonstração)■ Por exemplo, deste texto (Wikipedia, Portugal):

In : text = """ Portugal,oficialmente República Portuguesa,é um país soberano unitário localizado no sudoeste da Europa,cujo território se situa na zona ocidental da Península Ibérica e em arquipélagos no Atlântico Norte.O território português tem uma área total de 92090km², sendo delimitado a norte e leste por Espanha e a sul e oeste pelo oceano Atlântico, compreendendo uma parte continental e duas regiões autónomas: os arquipélagos dos Açores e da Madeira. Portugal é a nação mais a ocidente do continente europeu.O nome do país provém da sua segunda maior cidade, Porto, cujo nome latino-celta era Portus Cale. """

■ As palavras estão geralmente separadas por espaços mas podemestar separadas apenas por sinais de pontuação.

Page 26: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

25

Exemplos

Contar tamanhos de palavras (Demonstração)■ O método split permite partir uma string por um separador ou,

sem argumentos (ou None) pelos espaços em branco

In : text = """word word ... another another_word end""" In : text.split() Out: ['word', 'word', 'another', 'another_word', 'end'] In : text.split(None) Out: ['word', 'word', 'another', 'another_word', 'end']

■ Podemos usar este para nos ajudar a resolver o problema.

Page 27: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

26

Exemplos

Contar tamanhos de palavras (Demonstração)■ Algoritmo:• Partimos o texto original por um separador (vígula, ponto, ...)

• Depois partimos cada um dos fragmentos por outro separador

• Vamos repetindo até percorrer todos os separadores, guardando todos osfragmentos

• O último separador pode ser o None para partir pelos espaços.

• No fim contamos o comprimento de cada fragmento

Page 28: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

27

Exemplos

Contar tamanhos de palavras (Demonstração)■ Decompor e generalizar:• Decompomos o algoritmo em sub-problemas, usando funções• Cada função deve ser o mais genérica que for prático implementar

def split_all(string_list, separator): """splits all strings in a list of strings, returns resulting fragments""" def split_text(text,separators): """splits text over all separators""" def count_word_lengths(words): """return list with word lengths from list with strings""" def text_word_lengths(text): """return list with word lengths from text"""

Page 29: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

28

Exemplos

Contar tamanhos de palavras (Demonstração)■ Implementação e testes:• Começamos pelas "pontas" da nossa árvore de funções

■ Partir todas as strings numa lista de string usando um separador

def split_all(string_list, separator): """splits all strings in a list of strings, returns resulting fragments""" result = [] for s in string_list: result.extend(s.split(separator)) return result

■ Testamos, para confirmar que está a funcionar

In : split_all(['aa,bb','cc','d,e,f'],',') Out: ['aa', 'bb', 'cc', 'd', 'e', 'f']

Page 30: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

29

Exemplos

Contar tamanhos de palavras (Demonstração)■ Partir o texto usando vários separadores.• Usamos cumulativamente a função anterior.

• Primeiro precisamos de criar uma lista com o texto como único elemento (string)

def split_text(text,separators): """splits text over all separators""" result = [text] for sep in separators: result = split_all(result,sep) return result

■ Testamos também o None como separador:

split_text('some,.text.that \t includes \n special whitespace',['.',',',None]) Out: ['some', 'text', 'that', 'includes', 'special', 'whitespace']

Page 31: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

30

Exemplos

Contar tamanhos de palavras (Demonstração)■ Agora contar os tamanhos das palavras, recebendo tudo partido

def count_word_lengths(words): """return list with word lengths from list with strings""" lengths = [] for word in words: lengths.append(len(word)) return lengths

■ Testamos com exemplos simples:

In : words = ['a','aa','aaa','aaaa','aaaaa'] In : count_word_lengths(words) Out: [1, 2, 3, 4, 5]

Page 32: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

31

Exemplos

Contar tamanhos de palavras (Demonstração)■ Finalmente, juntar tudo, testar e usar

def text_word_lengths(text): """return list with word lengths from text""" separators = [',','.','?','!',':',';',None] words = split_text(text,separators) return count_word_lengths(words)

In : text_word_lengths('a?aa,aaa aaaa:aaaaa') Out: [1, 2, 3, 4, 5] In : text_word_lengths('some,.text.that \t includes \n special whitespace') Out: [4, 4, 4, 8, 7, 10] In : text_word_lengths(text) Out: [8, 12, 9, 10, 1, 2, 4, 8, 8, 10, 2, 8, 2, 6, 4, 10, 2, 5, 2, 4, 9, 2, 9, 7, 1, 2, 12, 2, 9, 5, 1, 10, 9, 3, 3, 4, 5, 2, 8, 5, 10, 1, 5, 1, 5, 3, 7, 1, 1, 3, 1, 5, 4, 6, 9, 13, 3, 5, 11, 1, 4, 7, 9, 2, 12, 3, 6, 1, 2, 7, 8, 1, 1, 5, 4, 1, 8, 2, 10, 7, 1, 4, 2, 4, 6, 2, 3, 7, 5, 6, 5, 4, 4, 12, 3, 6, 4]

Page 33: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

32

AVISO

Grupos até 6 de Abril

Page 34: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

33

Ciclo for

Resumo

Page 35: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração

34

Ciclo for

Resumo■ Ciclo for e iteração.■ Criar listas: append, extend■ Processar stringsLeitura adicional:■ Recomendada: Capítulo 6 dos apontamentos■ Opcional: Livro, Capítulo 13 (mas inclui ciclo while)

Page 36: 6 - Iteração - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-06.pdf · 1 Iteração Resumo O ciclo for Exemplo: enzimas de restrição Função range e iteração